diff --git a/package.json b/package.json
index d9e12de..997be84 100644
--- a/package.json
+++ b/package.json
@@ -15,12 +15,13 @@
"url": "https://gitee.com/y_project/RuoYi-Vue.git"
},
"dependencies": {
+ "@antv/g2": "^5.2.3",
+ "echarts-stat": "^1.2.0",
"@element-plus/icons-vue": "2.0.10",
"@vueup/vue-quill": "1.1.0",
"@vueuse/core": "9.5.0",
"axios": "0.27.2",
"echarts": "5.4.0",
- "echarts-stat": "^1.2.0",
"element-plus": "2.2.27",
"file-saver": "2.0.5",
"fuse.js": "6.6.2",
diff --git a/src/api/marketing-algorithm.js b/src/api/marketing-algorithm.js
index c74fd0d..b49b8c4 100644
--- a/src/api/marketing-algorithm.js
+++ b/src/api/marketing-algorithm.js
@@ -2,7 +2,7 @@
* @Author: qinzhenpen qzp1807@126.com
* @Date: 2024-08-16 10:14:59
* @LastEditors: qinzhenpen qzp1807@126.com
- * @LastEditTime: 2024-08-16 16:38:09
+ * @LastEditTime: 2024-08-17 16:57:01
* @FilePath: \vue3\src\api\marketing-algorithm.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@@ -31,3 +31,27 @@ export function getMarketingAlgorithmPreprocessing(data) {
data,
});
}
+// 自建表导入
+export function getMarketingAlgorithmImport(data) {
+ return request({
+ url: "/api/userprofile/uploadExcel",
+ method: "POST",
+ data,
+ });
+}
+// 查询自建表
+export function getMarketingAlgorithmTable(params) {
+ return request({
+ url: "/api/userprofile/selfExcelBaseInfo",
+ method: "GET",
+ params,
+ });
+}
+// 算法知识导入
+export function getMarketingAlgorithmKnowledgeImport(data) {
+ return request({
+ url: "/api/model/batchImport",
+ method: "POST",
+ data,
+ });
+}
\ No newline at end of file
diff --git a/src/assets/images/10027.png b/src/assets/images/10027.png
new file mode 100644
index 0000000..ce1edcf
Binary files /dev/null and b/src/assets/images/10027.png differ
diff --git a/src/assets/images/f1001.png b/src/assets/images/f1001.png
new file mode 100644
index 0000000..ff958ed
Binary files /dev/null and b/src/assets/images/f1001.png differ
diff --git a/src/assets/images/f10010.png b/src/assets/images/f10010.png
new file mode 100644
index 0000000..f9ab768
Binary files /dev/null and b/src/assets/images/f10010.png differ
diff --git a/src/assets/images/f10011.png b/src/assets/images/f10011.png
new file mode 100644
index 0000000..0af66d5
Binary files /dev/null and b/src/assets/images/f10011.png differ
diff --git a/src/assets/images/f10012.png b/src/assets/images/f10012.png
new file mode 100644
index 0000000..7263d1c
Binary files /dev/null and b/src/assets/images/f10012.png differ
diff --git a/src/assets/images/f10013.png b/src/assets/images/f10013.png
new file mode 100644
index 0000000..95abd97
Binary files /dev/null and b/src/assets/images/f10013.png differ
diff --git a/src/assets/images/f10014.png b/src/assets/images/f10014.png
new file mode 100644
index 0000000..8f6b0ee
Binary files /dev/null and b/src/assets/images/f10014.png differ
diff --git a/src/assets/images/f10015.png b/src/assets/images/f10015.png
new file mode 100644
index 0000000..b506478
Binary files /dev/null and b/src/assets/images/f10015.png differ
diff --git a/src/assets/images/f10016.png b/src/assets/images/f10016.png
new file mode 100644
index 0000000..ec834ec
Binary files /dev/null and b/src/assets/images/f10016.png differ
diff --git a/src/assets/images/f10017.png b/src/assets/images/f10017.png
new file mode 100644
index 0000000..cec4425
Binary files /dev/null and b/src/assets/images/f10017.png differ
diff --git a/src/assets/images/f10018.png b/src/assets/images/f10018.png
new file mode 100644
index 0000000..657de40
Binary files /dev/null and b/src/assets/images/f10018.png differ
diff --git a/src/assets/images/f10019.png b/src/assets/images/f10019.png
new file mode 100644
index 0000000..19a8e4b
Binary files /dev/null and b/src/assets/images/f10019.png differ
diff --git a/src/assets/images/f1002.png b/src/assets/images/f1002.png
new file mode 100644
index 0000000..d6cd99a
Binary files /dev/null and b/src/assets/images/f1002.png differ
diff --git a/src/assets/images/f10020.png b/src/assets/images/f10020.png
new file mode 100644
index 0000000..7b6053e
Binary files /dev/null and b/src/assets/images/f10020.png differ
diff --git a/src/assets/images/f10021.png b/src/assets/images/f10021.png
new file mode 100644
index 0000000..7561efb
Binary files /dev/null and b/src/assets/images/f10021.png differ
diff --git a/src/assets/images/f10022.png b/src/assets/images/f10022.png
new file mode 100644
index 0000000..7c35b99
Binary files /dev/null and b/src/assets/images/f10022.png differ
diff --git a/src/assets/images/f10023.png b/src/assets/images/f10023.png
new file mode 100644
index 0000000..f3ce3db
Binary files /dev/null and b/src/assets/images/f10023.png differ
diff --git a/src/assets/images/f10024.png b/src/assets/images/f10024.png
new file mode 100644
index 0000000..e42fcc9
Binary files /dev/null and b/src/assets/images/f10024.png differ
diff --git a/src/assets/images/f10025.png b/src/assets/images/f10025.png
new file mode 100644
index 0000000..c56a2d3
Binary files /dev/null and b/src/assets/images/f10025.png differ
diff --git a/src/assets/images/f10026.png b/src/assets/images/f10026.png
new file mode 100644
index 0000000..5981b0a
Binary files /dev/null and b/src/assets/images/f10026.png differ
diff --git a/src/assets/images/f1003.png b/src/assets/images/f1003.png
new file mode 100644
index 0000000..d6cd99a
Binary files /dev/null and b/src/assets/images/f1003.png differ
diff --git a/src/assets/images/f1005.png b/src/assets/images/f1005.png
new file mode 100644
index 0000000..b7dabc8
Binary files /dev/null and b/src/assets/images/f1005.png differ
diff --git a/src/assets/images/f2001.png b/src/assets/images/f2001.png
new file mode 100644
index 0000000..529e968
Binary files /dev/null and b/src/assets/images/f2001.png differ
diff --git a/src/assets/images/f2002.png b/src/assets/images/f2002.png
new file mode 100644
index 0000000..0670aed
Binary files /dev/null and b/src/assets/images/f2002.png differ
diff --git a/src/assets/images/f2004.png b/src/assets/images/f2004.png
new file mode 100644
index 0000000..f86f867
Binary files /dev/null and b/src/assets/images/f2004.png differ
diff --git a/src/assets/images/taskImport.png b/src/assets/images/taskImport.png
new file mode 100644
index 0000000..96f14f5
Binary files /dev/null and b/src/assets/images/taskImport.png differ
diff --git a/src/assets/images/弹框@2x.png b/src/assets/images/弹框@2x.png
new file mode 100644
index 0000000..102f6a6
Binary files /dev/null and b/src/assets/images/弹框@2x.png differ
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
index 19ef89e..ccbed3f 100644
--- a/src/assets/styles/index.scss
+++ b/src/assets/styles/index.scss
@@ -227,4 +227,33 @@ aside {
background: #FFFFFF;
box-shadow: 0px 0px 13px 0px #D6E0FE;
border-radius: 10px;
+}
+.dialogClass{
+ background:url('@/assets/images/弹框.png') !important;
+ background-size: 100% 100% !important;
+ .el-dialog__header{
+ padding: 5px 0px;
+ margin-right: 5px !important;
+ .gbImg{
+ cursor: pointer;
+ width: 51px;
+ height: 31px;
+ background-size: 100% 100%;
+ }
+ }
+ .xtImg{
+ margin-left: 18px;
+ width: 530px;
+}
+}
+.my-header {
+display: flex;
+flex-direction: row;
+justify-content: space-between;
+gap: 16px;
+text-align: center;
+span{
+ color: #FFFFFF;
+ padding: 38px 20px 0;
+}
}
\ No newline at end of file
diff --git a/src/layout/index.vue b/src/layout/index.vue
index c544910..0a87795 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -1,28 +1,14 @@
-
-
+
+
- 天 择 数 字 营 销 实 训 系 统
-
+
天 择 数 字 营 销 实 训 系 统
+
-
+
-
-
-
-
+
@@ -113,19 +99,19 @@ function setLayout() {
margin-left: 33px;
margin-top: 3px;
letter-spacing: 1px;
- }
+ }
}
.sidebar-container {
- margin-top: 58px;
- }
- .main-container {
- .caseData {
- position: fixed;
- right: 2%;
- top: 10%;
- z-index: 10000;
- }
+ margin-top: 58px;
+ }
+ .main-container {
+ .caseData {
+ position: fixed;
+ right: 2%;
+ top: 10%;
+ z-index: 10000;
}
+ }
}
.drawer-bg {
diff --git a/src/router/index.js b/src/router/index.js
index 582445d..7a2c5d3 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -87,19 +87,6 @@ export const dynamicRoutes = [
},
],
},
- // {
- // path: "",
- // component: Layout,
- // redirect: "/digitalMarketAlgorithm",
- // children: [
- // {
- // path: "/digitalMarketAlgorithm",
- // component: () => import("@/views/digitalMarketAlgorithm/index"),
- // name: "digitalMarketAlgorithm",
- // meta: { title: "数字营销算法", icon: "monitor2", affix: true },
- // },
- // ],
- // },
{
path: "",
component: Layout,
diff --git a/src/utils/index.js b/src/utils/index.js
index e24db80..a6e766d 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,20 +1,61 @@
-import { parseTime } from './ruoyi'
-export function getAssetsFile(url){
+import { parseTime } from "./ruoyi";
+/**
+ * 通用分页函数
+ * @param {Array} data - 需要分页的数据源
+ * @param {Number} page - 当前页码
+ * @param {Number} pageSize - 每页显示的条目数
+ * @returns {Object} 分页结果,包含当前页的数据,页码信息,及总页数
+ */
+export function paginate(data, page = 1, pageSize = 10) {
+ // 计算总页数
+ const totalItems = data.length;
+ const totalPages = Math.ceil(totalItems / pageSize);
+ // 确保页码在有效范围内
+ const currentPage = Math.min(Math.max(page, 1), totalPages);
+ // 计算当前页的数据起始索引和结束索引
+ const startIndex = (currentPage - 1) * pageSize;
+ const endIndex = Math.min(startIndex + pageSize, totalItems);
+
+ // 获取当前页的数据片段
+ const pageData = data.slice(startIndex, endIndex);
+ return {
+ currentPage,
+ pageSize,
+ totalItems,
+ totalPages,
+ data: pageData,
+ };
+}
+export function getAssetsFile(url) {
return new URL(`../assets/images/${url}`, import.meta.url).href;
}
/**
* 表格时间格式化
*/
+function isTimestamp(value) {
+ // 判断是否为数字类型且是否为整数
+ if (typeof value === "number" && Number.isInteger(value)) {
+ // 判断时间戳是否为13位
+ return value.toString().length === 13;
+ }
+ return false;
+}
export function formatDate(cellValue) {
- if (cellValue == null || cellValue == "") return "";
- var date = new Date(cellValue)
- var year = date.getFullYear()
- var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
- var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
- var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
- var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
- var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
- return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+ // 判断是不是时间戳不是就返回
+ let time;
+ if (isTimestamp(cellValue)) {
+ var date = new Date(cellValue);
+ var year = date.getFullYear();
+ var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
+ var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
+ var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
+ var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
+ var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
+ time = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
+ } else {
+ time = cellValue;
+ }
+ return time;
}
/**
@@ -23,40 +64,30 @@ export function formatDate(cellValue) {
* @returns {string}
*/
export function formatTime(time, option) {
- if (('' + time).length === 10) {
- time = parseInt(time) * 1000
+ if (("" + time).length === 10) {
+ time = parseInt(time) * 1000;
} else {
- time = +time
+ time = +time;
}
- const d = new Date(time)
- const now = Date.now()
+ const d = new Date(time);
+ const now = Date.now();
- const diff = (now - d) / 1000
+ const diff = (now - d) / 1000;
if (diff < 30) {
- return '刚刚'
+ return "刚刚";
} else if (diff < 3600) {
// less 1 hour
- return Math.ceil(diff / 60) + '分钟前'
+ return Math.ceil(diff / 60) + "分钟前";
} else if (diff < 3600 * 24) {
- return Math.ceil(diff / 3600) + '小时前'
+ return Math.ceil(diff / 3600) + "小时前";
} else if (diff < 3600 * 24 * 2) {
- return '1天前'
+ return "1天前";
}
if (option) {
- return parseTime(time, option)
+ return parseTime(time, option);
} else {
- return (
- d.getMonth() +
- 1 +
- '月' +
- d.getDate() +
- '日' +
- d.getHours() +
- '时' +
- d.getMinutes() +
- '分'
- )
+ return d.getMonth() + 1 + "月" + d.getDate() + "日" + d.getHours() + "时" + d.getMinutes() + "分";
}
}
@@ -65,18 +96,18 @@ export function formatTime(time, option) {
* @returns {Object}
*/
export function getQueryObject(url) {
- url = url == null ? window.location.href : url
- const search = url.substring(url.lastIndexOf('?') + 1)
- const obj = {}
- const reg = /([^?&=]+)=([^?&=]*)/g
+ url = url == null ? window.location.href : url;
+ const search = url.substring(url.lastIndexOf("?") + 1);
+ const obj = {};
+ const reg = /([^?&=]+)=([^?&=]*)/g;
search.replace(reg, (rs, $1, $2) => {
- const name = decodeURIComponent($1)
- let val = decodeURIComponent($2)
- val = String(val)
- obj[name] = val
- return rs
- })
- return obj
+ const name = decodeURIComponent($1);
+ let val = decodeURIComponent($2);
+ val = String(val);
+ obj[name] = val;
+ return rs;
+ });
+ return obj;
}
/**
@@ -85,14 +116,14 @@ export function getQueryObject(url) {
*/
export function byteLength(str) {
// returns the byte length of an utf8 string
- let s = str.length
+ let s = str.length;
for (var i = str.length - 1; i >= 0; i--) {
- const code = str.charCodeAt(i)
- if (code > 0x7f && code <= 0x7ff) s++
- else if (code > 0x7ff && code <= 0xffff) s += 2
- if (code >= 0xDC00 && code <= 0xDFFF) i--
+ const code = str.charCodeAt(i);
+ if (code > 0x7f && code <= 0x7ff) s++;
+ else if (code > 0x7ff && code <= 0xffff) s += 2;
+ if (code >= 0xdc00 && code <= 0xdfff) i--;
}
- return s
+ return s;
}
/**
@@ -100,13 +131,13 @@ export function byteLength(str) {
* @returns {Array}
*/
export function cleanArray(actual) {
- const newArray = []
+ const newArray = [];
for (let i = 0; i < actual.length; i++) {
if (actual[i]) {
- newArray.push(actual[i])
+ newArray.push(actual[i]);
}
}
- return newArray
+ return newArray;
}
/**
@@ -114,13 +145,13 @@ export function cleanArray(actual) {
* @returns {Array}
*/
export function param(json) {
- if (!json) return ''
+ if (!json) return "";
return cleanArray(
- Object.keys(json).map(key => {
- if (json[key] === undefined) return ''
- return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ Object.keys(json).map((key) => {
+ if (json[key] === undefined) return "";
+ return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]);
})
- ).join('&')
+ ).join("&");
}
/**
@@ -128,21 +159,21 @@ export function param(json) {
* @returns {Object}
*/
export function param2Obj(url) {
- const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " ");
if (!search) {
- return {}
+ return {};
}
- const obj = {}
- const searchArr = search.split('&')
- searchArr.forEach(v => {
- const index = v.indexOf('=')
+ const obj = {};
+ const searchArr = search.split("&");
+ searchArr.forEach((v) => {
+ const index = v.indexOf("=");
if (index !== -1) {
- const name = v.substring(0, index)
- const val = v.substring(index + 1, v.length)
- obj[name] = val
+ const name = v.substring(0, index);
+ const val = v.substring(index + 1, v.length);
+ obj[name] = val;
}
- })
- return obj
+ });
+ return obj;
}
/**
@@ -150,9 +181,9 @@ export function param2Obj(url) {
* @returns {string}
*/
export function html2Text(val) {
- const div = document.createElement('div')
- div.innerHTML = val
- return div.textContent || div.innerText
+ const div = document.createElement("div");
+ div.innerHTML = val;
+ return div.textContent || div.innerText;
}
/**
@@ -162,21 +193,21 @@ export function html2Text(val) {
* @returns {Object}
*/
export function objectMerge(target, source) {
- if (typeof target !== 'object') {
- target = {}
+ if (typeof target !== "object") {
+ target = {};
}
if (Array.isArray(source)) {
- return source.slice()
+ return source.slice();
}
- Object.keys(source).forEach(property => {
- const sourceProperty = source[property]
- if (typeof sourceProperty === 'object') {
- target[property] = objectMerge(target[property], sourceProperty)
+ Object.keys(source).forEach((property) => {
+ const sourceProperty = source[property];
+ if (typeof sourceProperty === "object") {
+ target[property] = objectMerge(target[property], sourceProperty);
} else {
- target[property] = sourceProperty
+ target[property] = sourceProperty;
}
- })
- return target
+ });
+ return target;
}
/**
@@ -185,18 +216,16 @@ export function objectMerge(target, source) {
*/
export function toggleClass(element, className) {
if (!element || !className) {
- return
+ return;
}
- let classString = element.className
- const nameIndex = classString.indexOf(className)
+ let classString = element.className;
+ const nameIndex = classString.indexOf(className);
if (nameIndex === -1) {
- classString += '' + className
+ classString += "" + className;
} else {
- classString =
- classString.substr(0, nameIndex) +
- classString.substr(nameIndex + className.length)
+ classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length);
}
- element.className = classString
+ element.className = classString;
}
/**
@@ -204,10 +233,10 @@ export function toggleClass(element, className) {
* @returns {Date}
*/
export function getTime(type) {
- if (type === 'start') {
- return new Date().getTime() - 3600 * 1000 * 24 * 90
+ if (type === "start") {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90;
} else {
- return new Date(new Date().toDateString())
+ return new Date(new Date().toDateString());
}
}
@@ -218,38 +247,38 @@ export function getTime(type) {
* @return {*}
*/
export function debounce(func, wait, immediate) {
- let timeout, args, context, timestamp, result
+ let timeout, args, context, timestamp, result;
- const later = function() {
+ const later = function () {
// 据上一次触发时间间隔
- const last = +new Date() - timestamp
+ const last = +new Date() - timestamp;
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
- timeout = setTimeout(later, wait - last)
+ timeout = setTimeout(later, wait - last);
} else {
- timeout = null
+ timeout = null;
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
- result = func.apply(context, args)
- if (!timeout) context = args = null
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
}
}
- }
+ };
- return function(...args) {
- context = this
- timestamp = +new Date()
- const callNow = immediate && !timeout
+ return function (...args) {
+ context = this;
+ timestamp = +new Date();
+ const callNow = immediate && !timeout;
// 如果延时不存在,重新设定延时
- if (!timeout) timeout = setTimeout(later, wait)
+ if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
- result = func.apply(context, args)
- context = args = null
+ result = func.apply(context, args);
+ context = args = null;
}
- return result
- }
+ return result;
+ };
}
/**
@@ -260,18 +289,18 @@ export function debounce(func, wait, immediate) {
* @returns {Object}
*/
export function deepClone(source) {
- if (!source && typeof source !== 'object') {
- throw new Error('error arguments', 'deepClone')
+ if (!source && typeof source !== "object") {
+ throw new Error("error arguments", "deepClone");
}
- const targetObj = source.constructor === Array ? [] : {}
- Object.keys(source).forEach(keys => {
- if (source[keys] && typeof source[keys] === 'object') {
- targetObj[keys] = deepClone(source[keys])
+ const targetObj = source.constructor === Array ? [] : {};
+ Object.keys(source).forEach((keys) => {
+ if (source[keys] && typeof source[keys] === "object") {
+ targetObj[keys] = deepClone(source[keys]);
} else {
- targetObj[keys] = source[keys]
+ targetObj[keys] = source[keys];
}
- })
- return targetObj
+ });
+ return targetObj;
}
/**
@@ -279,16 +308,16 @@ export function deepClone(source) {
* @returns {Array}
*/
export function uniqueArr(arr) {
- return Array.from(new Set(arr))
+ return Array.from(new Set(arr));
}
/**
* @returns {string}
*/
export function createUniqueString() {
- const timestamp = +new Date() + ''
- const randomNum = parseInt((1 + Math.random()) * 65536) + ''
- return (+(randomNum + timestamp)).toString(32)
+ const timestamp = +new Date() + "";
+ const randomNum = parseInt((1 + Math.random()) * 65536) + "";
+ return (+(randomNum + timestamp)).toString(32);
}
/**
@@ -298,7 +327,7 @@ export function createUniqueString() {
* @returns {boolean}
*/
export function hasClass(ele, cls) {
- return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+ return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
}
/**
@@ -307,7 +336,7 @@ export function hasClass(ele, cls) {
* @param {string} cls
*/
export function addClass(ele, cls) {
- if (!hasClass(ele, cls)) ele.className += ' ' + cls
+ if (!hasClass(ele, cls)) ele.className += " " + cls;
}
/**
@@ -317,94 +346,91 @@ export function addClass(ele, cls) {
*/
export function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
- const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
- ele.className = ele.className.replace(reg, ' ')
+ const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
+ ele.className = ele.className.replace(reg, " ");
}
}
export function makeMap(str, expectsLowerCase) {
- const map = Object.create(null)
- const list = str.split(',')
+ const map = Object.create(null);
+ const list = str.split(",");
for (let i = 0; i < list.length; i++) {
- map[list[i]] = true
+ map[list[i]] = true;
}
- return expectsLowerCase
- ? val => map[val.toLowerCase()]
- : val => map[val]
+ return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val];
}
-
-export const exportDefault = 'export default '
+
+export const exportDefault = "export default ";
export const beautifierConf = {
html: {
- indent_size: '2',
- indent_char: ' ',
- max_preserve_newlines: '-1',
+ indent_size: "2",
+ indent_char: " ",
+ max_preserve_newlines: "-1",
preserve_newlines: false,
keep_array_indentation: false,
break_chained_methods: false,
- indent_scripts: 'separate',
- brace_style: 'end-expand',
+ indent_scripts: "separate",
+ brace_style: "end-expand",
space_before_conditional: true,
unescape_strings: false,
jslint_happy: false,
end_with_newline: true,
- wrap_line_length: '110',
+ wrap_line_length: "110",
indent_inner_html: true,
comma_first: false,
e4x: true,
- indent_empty_lines: true
+ indent_empty_lines: true,
},
js: {
- indent_size: '2',
- indent_char: ' ',
- max_preserve_newlines: '-1',
+ indent_size: "2",
+ indent_char: " ",
+ max_preserve_newlines: "-1",
preserve_newlines: false,
keep_array_indentation: false,
break_chained_methods: false,
- indent_scripts: 'normal',
- brace_style: 'end-expand',
+ indent_scripts: "normal",
+ brace_style: "end-expand",
space_before_conditional: true,
unescape_strings: false,
jslint_happy: true,
end_with_newline: true,
- wrap_line_length: '110',
+ wrap_line_length: "110",
indent_inner_html: true,
comma_first: false,
e4x: true,
- indent_empty_lines: true
- }
-}
+ indent_empty_lines: true,
+ },
+};
// 首字母大小
export function titleCase(str) {
- return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
+ return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
}
// 下划转驼峰
export function camelCase(str) {
- return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
+ return str.replace(/_[a-z]/g, (str1) => str1.substr(-1).toUpperCase());
}
export function isNumberStr(str) {
- return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
+ return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str);
}
//文件下载
export function downBlobFile(fileName, fileBlob) {
- const link = document.createElement('a')
+ const link = document.createElement("a");
try {
// let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'}); //如果后台返回的不是blob对象类型,先定义成blob对象格式,type格式根据返回文件不同修改
- const blob = fileBlob
- const _fileName = fileName // 拆解获取文件名,如果后端没返回文件格式,则需要自己拼接文件后缀
- link.style.display = 'none'
+ const blob = fileBlob;
+ const _fileName = fileName; // 拆解获取文件名,如果后端没返回文件格式,则需要自己拼接文件后缀
+ link.style.display = "none";
// 兼容浏览器
- const url = window.URL || window.webkitURL || window.moxURL
- link.href = url.createObjectURL(blob) // 如果没设置axios请求reponseType为‘blob’的话,则参数应为new Blob(文件流),否则报错
- link.download = _fileName // 下载的文件名称
- link.click()
- window.URL.revokeObjectURL(url) // #URL.revokeObjectURL()方法会释放一个通过URL.createObjectURL()创建的对象URL. 当你要已经用过了这个对象URL,然后要让浏览器知道这个URL已经不再需要指向对应的文件的时候,就需要调用这个方法.
+ const url = window.URL || window.webkitURL || window.moxURL;
+ link.href = url.createObjectURL(blob); // 如果没设置axios请求reponseType为‘blob’的话,则参数应为new Blob(文件流),否则报错
+ link.download = _fileName; // 下载的文件名称
+ link.click();
+ window.URL.revokeObjectURL(url); // #URL.revokeObjectURL()方法会释放一个通过URL.createObjectURL()创建的对象URL. 当你要已经用过了这个对象URL,然后要让浏览器知道这个URL已经不再需要指向对应的文件的时候,就需要调用这个方法.
} catch (error) {
- console.error(error.message)
+ console.error(error.message);
}
}
-
diff --git a/src/utils/request.js b/src/utils/request.js
index 228425c..2a2d7f7 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -19,7 +19,7 @@ const service = axios.create({
baseURL:'http://192.168.2.28:9868/',
// baseURL:'http://118.31.7.2:9868/',
// 超时
- timeout: 10000
+ timeout: 100000
})
// request拦截器
service.interceptors.request.use(config => {
diff --git a/src/views/components/mainContent.vue b/src/views/components/mainContent.vue
index a5e9506..864f9c7 100644
--- a/src/views/components/mainContent.vue
+++ b/src/views/components/mainContent.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/src/views/components/popModal.vue b/src/views/components/popModal.vue
new file mode 100644
index 0000000..eb544d1
--- /dev/null
+++ b/src/views/components/popModal.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
diff --git a/src/views/components/popModel.vue b/src/views/components/popModel.vue
deleted file mode 100644
index 1b65c94..0000000
--- a/src/views/components/popModel.vue
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/digitalMarketTech/AIGCLargeModel/index.vue b/src/views/digitalMarketTech/AIGCLargeModel/index.vue
index 96bc59f..c8c2733 100644
--- a/src/views/digitalMarketTech/AIGCLargeModel/index.vue
+++ b/src/views/digitalMarketTech/AIGCLargeModel/index.vue
@@ -1,83 +1,74 @@
-
-
- {{item.text}}
-
+
+ {{ item.text }}
+
-
-
diff --git a/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue b/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue
index c4ceb56..98e6d8b 100644
--- a/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue
+++ b/src/views/digitalMarketingAlgorithms/components/associationRuleMining.vue
@@ -5,20 +5,7 @@
(给出任务清单参考,做哪些数据的统计分析)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar sic tempor. Sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus pronin sapien nunc accuan eget.
-
-
-
算法知识导入
-
-
-
+
算法知识导入
实训任务提交
@@ -113,7 +100,7 @@
-
+
分析结果:
@@ -121,7 +108,7 @@
-
+
@@ -175,22 +162,44 @@
+
+
+
+
+
一、简介
Apriori算法是一种用于挖掘数据集中频繁项集的算法,进而用于生成关联规则。这种算法在数据挖掘、机器学习、市场篮子分析等多个领域都有广泛的应用。
什么是关联规则挖掘?
关联规则挖掘是数据挖掘中的一个重要分支,其目标是发现在一个数据集中变量间存在的有趣的关联或模式。
例子: 假设在一个零售商的交易数据中,如果客户购买了啤酒,他们也很有可能购买薯片。这里的“啤酒”和“薯片”就形成了一个关联规则。
什么是频繁项集?
频繁项集是在数据集中出现次数大于或等于最小支持度(Minimum Support Threshold)的项的集合。
例子: 在超市购物数据中,如果“牛奶”和“面包”这一组合经常一起出现在同一个购物篮里,并且出现的次数超过了最小支持度,那么{"牛奶", "面包"}就是一个频繁项集。
什么是支持度与置信度?
支持度(Support): 是某个项集在所有交易中出现的频率。它用于衡量一个项集的普遍性。
例子: 如果我们有100笔交易,其中有30笔交易包含了“牛奶”,那么“牛奶”的支持度就是30%。置信度(Confidence): 是在A出现的情况下,B出现的条件概率。
例子: 如果在包含“牛奶”的所有交易中,有70%的交易也包含了“面包”,那么从“牛奶”到“面包”的置信度就是70%。
+
Apriori算法的重要性
Apriori算法由于其简单、高效的特性,在数据挖掘中有着广泛的应用。它不仅能用于挖掘数据中的隐藏模式,还能用于诸如产品推荐、用户行为分析、网络安全等多个应用场景。
例子: 在电子商务网站中,Apriori算法可以用于分析用户购买历史数据,进而实现个性化推荐,提升销售额和用户满意度。
应用场景
由于其广泛的用途和灵活性,Apriori算法在以下几个主要领域内有着广泛的应用:
市场篮子分析: 了解哪些产品经常被一起购买,以进行有效的产品布局或优惠策略。医疗诊断: 分析病人的历史数据,找出病症和治疗方案之间的关联。网络安全: 通过分析网络日志,找出异常模式,以预防或检测安全威胁。通过这些定义和例子,我们可以更全面地了解Apriori算法的基本概念、重要性和应用范围,为后续的技术解析和实战应用打下坚实的基础。
二、理论基础
在深入探讨Apriori算法之前,理解其背后的理论基础是非常重要的。本节将详细介绍关联规则挖掘的基础概念,包括项集、支持度、置信度、提升度以及如何使用这些概念来挖掘有用的关联规则。
项和项集
项(Item): 在关联规则挖掘中,项通常指数据集中的一个元素。
例子: 在一个超市的购物篮数据中,"牛奶"、"面包"、"啤酒"等都是单个的项。项集(Itemset): 是一个项的集合,可以包含一个或多个项。
例子: {"牛奶", "面包"} 和 {"啤酒", "薯片", "面包"} 都是项集。支持度(Support)
+
支持度是一个度量,用于表示一个项集在整个数据集中出现的频率。
!file
置信度(Confidence)
置信度表示在包含项集X的所有事务中,也包含项集Y的事务的概率。

提升度(Lift)
提升度用于衡量项集X和Y的出现是否相互独立。

Apriori原理
Apriori原理是Apriori算法的核心,它基于一个简单但重要的观察:一个项集是频繁的,那么它的所有子集也必须是频繁的。
例子: 如果{"牛奶", "面包", "啤酒"}是一个频繁项集,那么{"牛奶", "面包"}、{"牛奶", "啤酒"}和{"面包", "啤酒"}也必须是频繁项集。
通过以上的概念和例子,我们应该对关联规则挖掘的基础理论有了更深入的了解。这为我们后续详解Apriori算法以及实际应用提供了坚实的基础。
三、Apriori算法概述
Apriori算法是由Agrawal和Srikant于1994年提出的,用于高效地挖掘频繁项集和生成关联规则。其名字“Apriori”来源于拉丁语,意为“从先验知识”。这很好地反映了算法的核心思想:利用已知的频繁项集(即先验知识)来更有效地找到更大的频繁项集。
算法步骤

Apriori算法的执行流程主要包含两个步骤:
1.频繁项集生成(Frequent Itemset Generation): 找出满足最小支持度阈值的所有频繁项集。
2.关联规则生成(Association Rule Generation): 从频繁项集中生成高置信度的关联规则。
+
频繁项集生成
1.扫描数据集,找出所有单一项的支持度,并筛选出满足最小支持度的项。
2.使用满足最小支持度的项生成新的候选项集。
3.计算新生成的候选项集的支持度,并再次筛选。
4.重复上述步骤,直到不能生成新的频繁项集。
例子: 假设有一个购物交易数据集,其中包括5笔交易。第一步是计算所有单一商品(如“牛奶”,“面包”等)在这5笔交易中的出现次数,并筛选出那些出现次数达到最小支持度的商品。
关联规则生成
1.对于每一个频繁项集,生成所有可能的非空子集。
2.对每一条生成的规则 ( A \Rightarrow B ),计算其置信度。
3.如果规则的置信度满足最小置信度要求,则该规则为有效关联规则。
例子: 对于频繁项集 {"牛奶", "面包", "黄油"},可能的规则有 "牛奶, 面包 -> 黄油", "牛奶, 黄油 -> 面包" 等。计算这些规则的置信度,并筛选出满足最小置信度的规则。
优缺点
优点
简单易懂: Apriori算法基于直观的原理,并且计算过程简单。可扩展性强: 算法可以应用于大规模的数据集。缺点
计算量大: 在大数据集上,可能需要生成大量的候选项集。多次扫描数据: 算法需要多次扫描数据集以计算项集的支持度,这在数据集很大时可能是低效的。例子: 在一个包含百万级交易数据的电子商务网站中,使用Apriori算法可能需要消耗大量计算资源和时间。
通过以上的详细描述和例子,我们应该对Apriori算法有了全面而深入的理解。这为我们后续的技术解析和实战应用奠定了基础。
+
四、实战应用
在理解了Apriori算法的理论基础和工作原理之后,现在我们将进一步探讨其在实际场景中的应用。特别是在购物篮分析和推荐系统中,Apriori算法被广泛应用。
为了更好地说明这一点,下面将通过Python展示如何实现Apriori算法,并用一个简单的购物数据集进行演示。
购物篮分析
购物篮分析(Market Basket Analysis)是一种在零售业非常流行的技术,用于发现顾客购买产品之间的关联规则。
输入和输出
输入: 一组交易数据,每一笔交易包含多个购买的商品。输出: 满足最小支持度和最小置信度的关联规则。Python实现代码
+
+
+
+
@@ -135,6 +206,44 @@ onMounted(() => {
color: #ffffff;
}
}
+ .metrics {
+ padding: 0px 7px !important;
+ :deep(.el-input) {
+ .el-input__wrapper {
+ background-color: #ffffff00;
+ background-image: url("../../../assets/images/下拉框.png");
+ background-size: 100% 100%;
+ }
+ --el-input-text-color: #ffffff;
+ --el-input-border-color: #ffffff00;
+ --el-input-hover-border-color: #ffffff00;
+ --el-input-hover-border: #ffffff00;
+ --el-select-border-color-hover: #ffffff00;
+ --el-select-input-focus-border-color: #ffffff00;
+ --el-input-placeholder-color: #ffffff;
+ .el-input__inner {
+ color: #ffffff;
+ }
+ }
+ }
+ }
+ .left-button {
+ width: 195px;
+ height: 31px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ margin-top: 20px !important;
+ :deep(.el-button) {
+ width: 149px;
+ height: 48px;
+ background: url("../../../assets/images/确定.png");
+ color: #ffffff;
+ border-color: #ffffff00;
+ background-size: 100% 100%;
+ margin: 15px;
+ }
}
}
.main-right {
diff --git a/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue b/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue
index 9b72343..684aa9a 100644
--- a/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue
+++ b/src/views/digitalMarketingAlgorithms/components/clusterAnalysis.vue
@@ -5,7 +5,7 @@
(给出任务清单参考,做哪些数据的统计分析)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar sic tempor. Sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus pronin sapien nunc accuan eget.
@@ -100,15 +100,15 @@
-
+
分析结果:
- 下载
+ 下载
-
+
@@ -176,23 +176,24 @@
-
+
+
聚类分析的定义及原理
1.定义
所谓物以类聚、人以群分。聚类分析,即是基于研究对象的特征,将他们分门别类,以让同类别的个体之间差异相对小、相似度相对大,不同类别之间的个体差异大、相似度小。
聚类分析是一种探索性分析方法,与判别分析不同,聚类分析事先并不知道分类的标准,甚至不知道应该分成几类,而是会根据样本数据的特征,自动进行分类。

+
聚类与分类的不同在于,聚类所要求划分的类是未知的



2.原理
假定研究对象均用所谓的“点”来表示。
在聚类分析中,一般的规则是将“距离”较小的点归为同一类,将“距离”较大的点归为不同的类。常见的是对个案分类,也可以对变量分类,但对于变量分类此时一般使用相似系数作为“距离”测量指标。
一般的规则:


+

聚类方法及其在SPSS中的实现
1.主要的聚类方法:

2.方法详解:
(1):K-means聚类
又称为快速聚类(K-Means Cluster),是在聚类的类别数已确定的情况下,快速将其他个案归类到相应的类别,适合大样本数据的聚类。
具体步骤如下:


距离计算规则(欧几里得距离公式):

图解:


+
K-means的优缺点:
优势:
(1)原理比较简单,实现也很容易,收敛速度快。
(2)在对大规模数据集进行聚类分析时,算法聚类较高效且聚类效果较好。
(3)簇与簇之间区别明显时,它的聚类效果很好。
不足:
(1)分类数从初始分类开始就确定不变了,所以要求事先要对样本有足够的了解。
(2)仅限于个案间的聚类(Q型聚类),不能对变量进行聚类。
(3)个案间的距离的测量方法使用的是欧式距离的平方,因此只能对连续变量进行聚类。
案例分析(SPSS):
通过查询整理出了2018年我国各省份的20项基本情况,根据这些指标把这31个省市或地区分成3类。

分析步骤:分析>>分类>>K-均值聚类>>迭代>>次数>>选项>>勾选统计>>确认


结果分析:
+


若不收敛则调大迭代次数

方差分析表:

其中聚类均方对应组间均方差,误差均方对应组内均方差,显著性p<0.05时说明此变量分类效果好。由表可知,大部分变量的p<0.05,且组间均方差大于组内均方差,说明各变量在三个类别中的差异大,分类结果可信度高。


聚类结果解读:
+
| 第一类:1个省份(广东省,经济发达) |
| 第二类:19个省份(云南、西藏等地区,经济一般) |
| 第三类:11个省份(上海、北京等地区,经济较发达) |
+
-
+
\ No newline at end of file
diff --git a/src/views/digitalMarketingAlgorithms/components/regressionAnalysis.vue b/src/views/digitalMarketingAlgorithms/components/regressionAnalysis.vue
index 533fec0..afd27ed 100644
--- a/src/views/digitalMarketingAlgorithms/components/regressionAnalysis.vue
+++ b/src/views/digitalMarketingAlgorithms/components/regressionAnalysis.vue
@@ -644,35 +644,4 @@
font-size: 16px;
}
}
-
-
\ No newline at end of file
diff --git a/src/views/digitalMarketingAlgorithms/index.vue b/src/views/digitalMarketingAlgorithms/index.vue
index 5b67fd9..5878091 100644
--- a/src/views/digitalMarketingAlgorithms/index.vue
+++ b/src/views/digitalMarketingAlgorithms/index.vue
@@ -40,6 +40,9 @@
.top_item{
img{
margin-right: 5px;
+ }
+ .el-button{
+ padding-left: 49px !important;
}
.el-button:nth-child(1) {
width: 170px;
@@ -87,7 +90,7 @@
background: url('../../assets/images/66.png');
color:#FFFFFF;
border-color:#FFFFFF00;
- padding:8px 5px 8px 30px;
+ padding:8px 21px 8px 25px;
background-size: 100% 100%;
}
.el-button:nth-child(7) {
@@ -98,9 +101,9 @@
border-color:#FFFFFF00;
padding:8px 5px 8px 20px;
}
- // .active{
- // background: url('../../assets/images/亮(钮).png');
- // }
+ .active{
+ background: url('../../assets/images/亮(钮).png');
+ }
}
}
diff --git a/src/views/learningCenter/learningResources.vue b/src/views/learningCenter/learningResources.vue
index 0e138e4..ddfbac4 100644
--- a/src/views/learningCenter/learningResources.vue
+++ b/src/views/learningCenter/learningResources.vue
@@ -55,7 +55,6 @@
})
const showResource=async(i)=>{
- console.log(i);
// const newWindow=window.open(`http://192.168.2.4:8800/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}`)
// window.open(`http://qkljr.sztzjy.com:90/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}`)
if(i.includes('mp4')){
diff --git a/src/views/portraitModel/components/AARRRAnalysis.vue b/src/views/portraitModel/components/AARRRAnalysis.vue
index 279eea1..83d39af 100644
--- a/src/views/portraitModel/components/AARRRAnalysis.vue
+++ b/src/views/portraitModel/components/AARRRAnalysis.vue
@@ -1,10 +1,10 @@
-
+
任务知识导入
-
+
+

@@ -398,17 +398,27 @@ https://help.fanruan.com/finebi5.1/doc-view-1256.html"
+
+
+
+
+
+
+
diff --git a/src/views/portraitModel/components/viscosityAnalysis.vue b/src/views/portraitModel/components/viscosityAnalysis.vue
index 6d0163a..0e411fa 100644
--- a/src/views/portraitModel/components/viscosityAnalysis.vue
+++ b/src/views/portraitModel/components/viscosityAnalysis.vue
@@ -1,10 +1,10 @@
-
+
任务知识导入
-
+
+

@@ -386,17 +386,27 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
+
+
+
+
+
+
+