dev-QQq
qinzhenpen 2 years ago
parent 2e7bdce5ca
commit 6f0f47823a

@ -129,3 +129,12 @@ export function uploadFile(data) {
data: data, data: data,
}); });
} }
// 评论点抽取
export function getCommentPoint(data) {
return request({
url: "/v1/singleEmotionAnalysis/",
baseURL: "http://192.168.2.14:8000",
method: "post",
data: data,
});
}

@ -1,3 +1,11 @@
/*
* @Author: qinzhenpen qzp1807@126.com
* @Date: 2024-08-16 17:56:32
* @LastEditors: qinzhenpen qzp1807@126.com
* @LastEditTime: 2024-08-26 15:26:20
* @FilePath: \digital-marketing\src\store\modules\algorithm.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import * as portraitModel from "@/api/portraitModel"; import * as portraitModel from "@/api/portraitModel";
import * as marketingAlgorithmApi from "@/api/marketing-algorithm.js"; import * as marketingAlgorithmApi from "@/api/marketing-algorithm.js";
@ -8,7 +16,7 @@ const useAlgorithmStore = defineStore("algorithm", {
tableData: [], tableData: [],
tableKey:[], tableKey:[],
userDataLabel:["用户属性表", "用户登录活跃表", "用户消费能力表", "用户行为表", "用户评论表"], //用户数据标签 userDataLabel:["用户属性表", "用户登录活跃表", "用户消费能力表", "用户行为表", "用户评论表"], //用户数据标签
userDataLabel2:["用户属性表", "用户登录活跃表", "用户消费能力表", "用户行为表", "用户评论表"], userDataLabel2:["用户评论表"],
indexLibrary: [], indexLibrary: [],
analysisData: [], analysisData: [],
}), }),

@ -1,3 +1,4 @@
import axios from "axios"; import axios from "axios";
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from "element-plus"; import { ElNotification, ElMessageBox, ElMessage, ElLoading } from "element-plus";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
@ -16,8 +17,8 @@ axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
const service = axios.create({ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分 // axios中请求配置有baseURL选项表示请求URL公共部分
// baseURL: import.meta.env.VITE_APP_BASE_API, // baseURL: import.meta.env.VITE_APP_BASE_API,
baseURL: "http://118.31.7.2:9868/", // baseURL: "http://118.31.7.2:9868/",
// baseURL:'http://192.168.2.16:9868/', baseURL:'http://192.168.2.14:9868/',
// 超时 // 超时
timeout: 100000, timeout: 100000,
}); });

@ -2,7 +2,7 @@
<!-- <el-scrollbar ref="scrollbar" height="800px"> --> <!-- <el-scrollbar ref="scrollbar" height="800px"> -->
<div class="main-top"> <div class="main-top">
<span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span>
<p style="font-weight: 400; font-size: 12px; color: #e2e7ee !important">给出任务清单参考做哪些数据的统计分析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.</p> <p style="font-weight: 400; font-size: 12px; color: #e2e7ee !important">使用购物车数据对所购商品进行购物篮分析关联规则挖掘并提交实训任务</p>
</div> </div>
<div class="main-but"> <div class="main-but">
<el-button @click="runResultShow = true"> <el-button @click="runResultShow = true">

@ -16,9 +16,9 @@
</div> </div>
<div class="left-item"> <div class="left-item">
<div class="metrics"> <div class="metrics">
<el-select v-model="n_dataTableQuery.selfTableName" placeholder="请选择数据" style="width: 180px" @change="selectType"> <div v-for="(item, index) in zjData" :key="index" class="item" :class="{ 'is-active': zjIndex === index }" @click.stop.prevent="selectType(item, index)">
<el-option v-for="item in zjData" :key="item" :label="item" :value="item" /> <span>{{ item }}</span>
</el-select> </div>
</div> </div>
</div> </div>
<div class="left-button"> <div class="left-button">
@ -49,13 +49,12 @@ import { getUserInfo } from "@/utils/auth";
const userInfo = JSON.parse(getUserInfo()); const userInfo = JSON.parse(getUserInfo());
const loading = ref(false); const loading = ref(false);
const fileData = ref(null); const fileData = ref(null);
const userStore = useUserStore();
const algorithmStore = useAlgorithmStore(); const algorithmStore = useAlgorithmStore();
// query // query
const n_dataTableQuery = ref({ const n_dataTableQuery = ref({
index: 1, index: 1,
size: 7, size: 7,
tableName: "用户属性表", tableName: "",
userId: userInfo.userId, userId: userInfo.userId,
}); });
const datatotal = ref(0); const datatotal = ref(0);
@ -64,40 +63,42 @@ const nzData = ref([]);
const zjIndex = ref(-1); const zjIndex = ref(-1);
const zjData = ref([]); const zjData = ref([]);
const tableLabel = ref([ const tableLabel = ref([
{ prop: "id", label: "用户ID" }, { prop: "id", label: "ID" },
{ prop: "loginName", label: "登录名" }, { prop: "age", label: "年龄" },
{ prop: "userName", label: "用户姓名" }, { prop: "annualIncome", label: "年收入" },
{ prop: "studentId", label: "学号" }, { prop: "spendingScore", label: "消费水平" },
{ prop: "stuClass", label: "班级" }, { prop: "consumerGoods", label: "消费商品" },
{ prop: "major", label: "专业" }, ]);
{ prop: "school", label: "学校" }, const tableLabel3 = ref([
{ prop: "roleName", label: "角色名称" }, { prop: "id", label: "ID" },
{ prop: "roleGender", label: "角色性别" }, { prop: "content", label: "评论内容" },
{ prop: "roleAge", label: "角色年龄" }, { prop: "creationTime", label: "评论时间" },
{ prop: "updateTime", label: "注册时间" }, { prop: "nickName", label: "昵称" },
{ prop: "location", label: "所在地" }, { prop: "referenceName", label: "评论对象" },
{ prop: "contentType", label: "评论类型" },
]);
const tableLabel4 = ref([
{ prop: "id", label: "ID" },
{ prop: "salesVolume", label: "销售量" },
{ prop: "salesForehead", label: "销售额" },
]);
const tableLabel5 = ref([
{ prop: "id", label: "ID" },
{ prop: "consumerGoods", label: "消费商品" },
]); ]);
const tableLabel2 = ref([]); const tableLabel2 = ref([]);
const arrhander = ref([]); const arrhander = ref([]);
const arrhanderkey = ref([]); const arrhanderkey = ref([]);
const arrMap = {
客户细分数据表: tableLabel.value,
销售预测数据表: tableLabel4.value,
购物车数据表: tableLabel5.value,
用户评论表: tableLabel3.value,
};
const goNZ = (index, item) => { const goNZ = (index, item) => {
nzIndex.value = index; nzIndex.value = index;
zjIndex.value = -1; tableLabel.value = arrMap[item];
tableLabel.value = [
{ prop: "id", label: "用户ID" },
{ prop: "loginName", label: "登录名" },
{ prop: "userName", label: "用户姓名" },
{ prop: "studentId", label: "学号" },
{ prop: "stuClass", label: "班级" },
{ prop: "major", label: "专业" },
{ prop: "school", label: "学校" },
{ prop: "roleName", label: "角色名称" },
{ prop: "roleGender", label: "角色性别" },
{ prop: "roleAge", label: "角色年龄" },
{ prop: "updateTime", label: "注册时间" },
{ prop: "location", label: "所在地" },
];
n_dataTableQuery.value.tableName = item; n_dataTableQuery.value.tableName = item;
delete n_dataTableQuery.value.selfTableName; delete n_dataTableQuery.value.selfTableName;
getSurface(); getSurface();
@ -113,9 +114,11 @@ const headerCellStyle = () => {
}; };
}; };
// //
const selectType = (type) => { const selectType = (type, idx) => {
delete n_dataTableQuery.value.tableName; delete n_dataTableQuery.value.tableName;
n_dataTableQuery.value.selfTableName = type;
getSurface(); getSurface();
zjIndex.value = idx;
nzIndex.value = -1; nzIndex.value = -1;
}; };
const getSurface = () => { const getSurface = () => {
@ -163,7 +166,9 @@ const importData = (e) => {
const selectZJ = (item) => { const selectZJ = (item) => {
portraitModel.getUserTableInfo({ userId: userInfo.userId }).then((res) => { portraitModel.getUserTableInfo({ userId: userInfo.userId }).then((res) => {
nzData.value = res.data.tableNames; nzData.value = res.data.tableNames;
algorithmStore.userDataLabel = [...res?.data.tableNames, ...res.data.selfBuiltTable]; n_dataTableQuery.value.tableName = nzData.value[0];
getSurface();
algorithmStore.userDataLabel = [...res?.data.tableNames, ...res.data.selfBuiltTable].filter((item) => item !== "用户评论表");
}); });
}; };
// //
@ -174,7 +179,6 @@ const getZJData = () => {
}; };
onMounted(() => { onMounted(() => {
selectZJ(); selectZJ();
getSurface();
getZJData(); getZJData();
}); });
</script> </script>

@ -2,7 +2,7 @@
<!-- <el-scrollbar ref="scrollbar" height="800px"> --> <!-- <el-scrollbar ref="scrollbar" height="800px"> -->
<div class="main-top"> <div class="main-top">
<span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span>
<p style="font-weight: 400; font-size: 12px; color: #e6e6e6">给出任务清单参考做哪些数据的统计分析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.</p> <p style="font-weight: 400; font-size: 12px; color: #e6e6e6">使用客户细分数据对客户进行聚类分析并提交实训任务</p>
</div> </div>
<div class="main-but"> <div class="main-but">
<el-button @click="algorithmicKnowledge()"> <el-button @click="algorithmicKnowledge()">

@ -1,7 +1,7 @@
<template> <template>
<div class="main-top"> <div class="main-top">
<span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span>
<p style="font-weight: 400; font-size: 12px; color: #e2e7ee !important">给出任务清单参考做哪些数据的统计分析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.</p> <p style="font-weight: 400; font-size: 12px; color: #e2e7ee !important">使用客户细分数据消费得分Spending Score指标进行描述性统计分析并提交实训任务</p>
</div> </div>
<div class="main-but"> <div class="main-but">
<el-button @click="knowledgeImport"> <el-button @click="knowledgeImport">
@ -15,7 +15,7 @@
</div> </div>
<div class="app-main"> <div class="app-main">
<div class="main-left"> <div class="main-left">
<el-scrollbar height="550px" style="padding-right: 10px" min-size="5"> <el-scrollbar height="592px" style="padding-right: 10px" min-size="5">
<div> <div>
<div class="left-top"> <div class="left-top">
<span>选择指标</span> <span>选择指标</span>
@ -57,13 +57,13 @@
<el-button @click="modelCalculation"></el-button> <el-button @click="modelCalculation"></el-button>
</div> </div>
</div> </div>
</el-scrollbar>
<div style="margin-top: auto"> <div style="margin-top: auto">
<div class="startOver" @click="restart"> <div class="startOver" @click="restart">
<img src="../../../assets/images/重新开始.png" alt="" /> <img src="../../../assets/images/重新开始.png" alt="" />
<span>重新开始</span> <span>重新开始</span>
</div> </div>
</div> </div>
</el-scrollbar>
</div> </div>
<div class="main-right"> <div class="main-right">
<el-scrollbar height="550px" style="padding: 20px"> <el-scrollbar height="550px" style="padding: 20px">
@ -255,7 +255,7 @@ const runResultShow = ref(false);
const n_dataTableQuery = ref({ const n_dataTableQuery = ref({
index: 1, index: 1,
size: 5, size: 5,
tableName: "用户属性表", tableName: algorithmStore.userDataLabel[0],
userId: userInfo.userId, userId: userInfo.userId,
}); });
const gAnalysisResults = ref({ const gAnalysisResults = ref({
@ -348,6 +348,22 @@ const aOriginalDataOfAnalysisResults2 = ref({});
// //
const g_modelParameter = ref([]); const g_modelParameter = ref([]);
//
const g_taskAnswer = ref({
average: 49.9,
median: 50.0,
mode: 42.0,
standardDeviation: 21.7,
variance: 469.0,
standardError: 2.2,
kurtosis: 0.1,
skewness: -0.1,
max: 99.0,
min: 3.0,
summation: 4993.0,
observations: 100,
});
// //
const preProcess = (tetx) => { const preProcess = (tetx) => {
if (analysisData.value.length == 0) { if (analysisData.value.length == 0) {
@ -456,18 +472,27 @@ const knowledgeImport = () => {
}; };
// //
const submitTask = () => { const submitTask = () => {
const flat = false;
for (let key in formInline.value) { for (let key in formInline.value) {
if (formInline.value[key] == "") { if (formInline.value[key] == "") {
const label = tableLabel.find((item) => item.prop == key); const label = tableLabel.find((item) => item.prop == key);
proxy.$modal.msgWarning(`${label.label}不能为空`); proxy.$modal.msgWarning(`${label.label}不能为空`);
return; return;
} else {
// valueg_taskAnswer.value
if (Number(formInline.value[key]) != g_taskAnswer.value[key]) {
const label = tableLabel.find((item) => item.prop == key);
flat = true
proxy.$modal.msgWarning(`${label.label}错误`);
return;
}
} }
} }
portraitModel portraitModel
.submit({ .submit({
userId: n_dataTableQuery.value.userId, userId: n_dataTableQuery.value.userId,
taskName: "描述性统计", taskName: "描述性统计",
numberOfErrors: 0, numberOfErrors: flat ? 1 : 0,
}) })
.then((res) => { .then((res) => {
dialogVisible.value = false; dialogVisible.value = false;

@ -1,7 +1,7 @@
<template> <template>
<div class="main-top"> <div class="main-top">
<span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span>
<p style="font-weight: 400; font-size: 12px; color: #e2e7ee !important">给出任务清单参考做哪些数据的统计分析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.</p> <p style="font-weight: 400; font-size: 12px; color: #e2e7ee !important">使用用户商品评论数据进行各类文本挖掘任务分析评论情感情绪最后提交实训任务</p>
</div> </div>
<div class="main-but"> <div class="main-but">
<el-button @click="knowledgeImport"> <el-button @click="knowledgeImport">
@ -69,11 +69,9 @@
<el-scrollbar height="550px" style="padding: 20px"> <el-scrollbar height="550px" style="padding: 20px">
<div> <div>
<span style="font-weight: bold; font-size: 18px; color: #3596eb">分析数据</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb">分析数据</span>
<div class="text-type" v-show="preProcessText.text3 == '评论观点抽取'">
<el-button :class="s_commentType == text.id ? 'btnActive' : ''" v-for="text in textType" :key="text" type="primary" plain @click="commentType(text)">{{ text.name }}</el-button>
</div>
<div class="analysis"> <div class="analysis">
<el-input maxlength="256" show-word-limit v-model="g_analyzeTheNumberOfDataItems" :rows="2" type="textarea" placeholder="" /> <el-input v-model="g_analyzeTheNumberOfDataItems" :rows="2" type="textarea" placeholder="" />
</div> </div>
<div class="footer"> <div class="footer">
<el-button type="primary" plain @click="sentimentAnalysis"></el-button> <el-button type="primary" plain @click="sentimentAnalysis"></el-button>
@ -113,7 +111,8 @@
<span>正向情感</span> <span>正向情感</span>
<img src="../../../assets/images/笑脸.png" alt="" /> <img src="../../../assets/images/笑脸.png" alt="" />
</div> </div>
<el-progress :class="[g_emotionAnalysis == 0 ? 'negPercentage ' : '']" style="width: 480px" :text-inside="true" :stroke-width="20" :percentage="n_emotiveTendency" :color="'#ff540a'" />
<el-progress style="width: 480px" :text-inside="true" :stroke-width="20" :percentage="n_emotiveTendency" :color="'#ff540a'" />
<div class="emotion_analysis-ani-in-ri"> <div class="emotion_analysis-ani-in-ri">
<img src="../../../assets/images/哭脸.png" alt="" /> <img src="../../../assets/images/哭脸.png" alt="" />
<span>负向情感</span> <span>负向情感</span>
@ -126,7 +125,11 @@
<div class="result-pos" :class="sentiment == 0 ? 'result-neg' : sentiment == 1 ? 'result-neutral' : 'result-img'"></div> <div class="result-pos" :class="sentiment == 0 ? 'result-neg' : sentiment == 1 ? 'result-neutral' : 'result-img'"></div>
<div class="result-title">{{ sentiment == 0 ? "负向评价" : sentiment == 1 ? "中性评价" : "正向评价" }}:</div> <div class="result-title">{{ sentiment == 0 ? "负向评价" : sentiment == 1 ? "中性评价" : "正向评价" }}:</div>
<div class="result-view" v-for="items in item" :key="items"> <div class="result-view" v-for="items in item" :key="items">
{{ items.prop + items.adj }} <span v-if="items.opinions.length == 0">{{ items.aspect }}</span>
<span v-for="i in items.opinions" :key="i">
{{ items.aspect + i }}
<div class="result-bar"></div>
</span>
<div class="result-bar"></div> <div class="result-bar"></div>
</div> </div>
</div> </div>
@ -145,7 +148,7 @@
</template> </template>
<div class="from-item"> <div class="from-item">
<el-form :inline="true" label-width="84px" :model="form" class="demo-form-inline"> <el-form :inline="true" label-width="84px" :model="form" class="demo-form-inline">
<el-form-item label="平均数" label-width="120px"> <el-form-item label="词频分析" label-width="120px">
<el-form-item label="最多数量词语:" label-width="120px" label-position="left"> <el-form-item label="最多数量词语:" label-width="120px" label-position="left">
<el-input style="width: 140px" v-model="formInline.max" clearable /> <el-input style="width: 140px" v-model="formInline.max" clearable />
</el-form-item> </el-form-item>
@ -435,7 +438,7 @@ const multipleTableRef = ref(null);
const n_dataTableQuery = ref({ const n_dataTableQuery = ref({
index: 1, index: 1,
size: 5, size: 5,
tableName: "用户属性表", tableName: algorithmStore.userDataLabel2[0],
userId: userInfo.userId, userId: userInfo.userId,
}); });
const textType = [ const textType = [
@ -456,9 +459,7 @@ const textType = [
const dialogVisible = ref(false); const dialogVisible = ref(false);
const analysisData = ref([]); const analysisData = ref([]);
const analysisHanderKry = ref([]); const analysisHanderKry = ref([]);
//
const aWordFrequency = ref([]); const aWordFrequency = ref([]);
const s_commentType = ref("");
const tableLabel = reactive([ const tableLabel = reactive([
{ prop: "max", label: "最多数量词语" }, { prop: "max", label: "最多数量词语" },
{ prop: "frequency", label: "频次" }, { prop: "frequency", label: "频次" },
@ -490,7 +491,6 @@ const mWordFrequency = ref({
namenum: "", namenum: "",
frequency: "", frequency: "",
}); // }); //
// //
const g_analyzeTheNumberOfDataItems = ref(""); const g_analyzeTheNumberOfDataItems = ref("");
// //
@ -500,7 +500,15 @@ const g_emotionAnalysis = ref(0);
const aCommentOpinion = ref([]); const aCommentOpinion = ref([]);
// //
const downloadStatus = ref(false); const downloadStatus = ref(false);
// //
const g_submitVerification = ref({
max: "13",
frequency: "3",
text1: "质量",
text2: "包装好",
emotional: "负向",
prominent: "的",
});
// //
const preProcess = (tetx) => { const preProcess = (tetx) => {
if (g_indicatorData.value.length == 0) { if (g_indicatorData.value.length == 0) {
@ -515,7 +523,11 @@ const preProcess = (tetx) => {
}).then((res) => { }).then((res) => {
proxy.$modal.msgSuccess("预处理成功"); proxy.$modal.msgSuccess("预处理成功");
analysisData.value = res.data; analysisData.value = res.data;
g_analyzeTheNumberOfDataItems.value = res.data.map((item) => (item ? item.text : "")).join(","); g_analyzeTheNumberOfDataItems.value = res.data
.slice(0, 4)
.map((item) => (item ? item.content : ""))
.join(",")
.replace(/\s+/g, "");
}); });
}; };
// //
@ -542,15 +554,19 @@ const submit = () => {
if (g_indicatorData.value.length == 0) return proxy.$modal.msgWarning("请选择指标"); if (g_indicatorData.value.length == 0) return proxy.$modal.msgWarning("请选择指标");
loading.value = true; loading.value = true;
marketingAlgorithmApi.getMarketingAlgorithm({ userId: n_dataTableQuery.value.userId, tableName: n_dataTableQuery.value.tableName, fieldList: g_indicatorData.value }).then((res) => { marketingAlgorithmApi.getMarketingAlgorithm({ userId: n_dataTableQuery.value.userId, tableName: n_dataTableQuery.value.tableName, fieldList: g_indicatorData.value }).then((res) => {
// g_analyzeTheNumberOfDataItems.value =
if ( if (
res.data res.data
.map((item) => (item ? item.text : "")) .map((item) => (item ? item.content : ""))
.every((item) => { .every((item) => {
return item !== ""; return item !== "";
}) })
) { ) {
g_analyzeTheNumberOfDataItems.value = res.data.map((item) => (item ? item.text : "")).join(","); g_analyzeTheNumberOfDataItems.value = res.data
.slice(0.4)
.map((item, index) => (item ? item.content : ""))
.slice(0, 4)
.join(",")
.replace(/\s+/g, "");
} else { } else {
g_analyzeTheNumberOfDataItems.value = ""; g_analyzeTheNumberOfDataItems.value = "";
loading.value = false; loading.value = false;
@ -574,18 +590,26 @@ const knowledgeImport = () => {
}; };
// //
const submitTask = () => { const submitTask = () => {
let flat = false;
for (let key in formInline.value) { for (let key in formInline.value) {
if (formInline.value[key] == "") { if (formInline.value[key] == "") {
const label = tableLabel.find((item) => item.prop == key); const label = tableLabel.find((item) => item.prop == key);
proxy.$modal.msgWarning(`${label.label}不能为空`); proxy.$modal.msgWarning(`${label.label}不能为空`);
return; return;
} else {
if (formInline.value[key] != g_submitVerification.value[key]) {
const label = tableLabel.find((item) => item.prop == key);
proxy.$modal.msgWarning(`${label.label}错误`);
flat = true;
return;
}
} }
} }
portraitModel portraitModel
.submit({ .submit({
userId: n_dataTableQuery.value.userId, userId: n_dataTableQuery.value.userId,
taskName: "情感分析", taskName: "情感分析",
numberOfErrors: 0, numberOfErrors: flat ? 1 : 0,
}) })
.then((res) => { .then((res) => {
dialogVisible.value = false; dialogVisible.value = false;
@ -624,7 +648,6 @@ const restart = () => {
nOriginalWordFrequencyNum.value = 0; nOriginalWordFrequencyNum.value = 0;
aWordFrequency.value = []; aWordFrequency.value = [];
nOriginalWordFrequency.value = []; nOriginalWordFrequency.value = [];
s_commentType.value = "";
proxy.$modal.msgSuccess("重新开始!"); proxy.$modal.msgSuccess("重新开始!");
multipleTableRef.value.clearSelection(); multipleTableRef.value.clearSelection();
}; };
@ -637,12 +660,14 @@ const download = async () => {
try { try {
// 使 html2canvas // 使 html2canvas
let VDOM = document.querySelector(".emotion_analysis_title"); let VDOM = document.querySelector(".emotion_analysis_title");
let VDOM2 = document.querySelector(".result"); let VDOM2 = document.getElementsByClassName("result");
if (preProcessText.value.text3 == "情感倾向分析") { if (preProcessText.value.text3 == "情感倾向分析") {
VDOM.style.color = "#221f1f"; VDOM.style.color = "#221f1f";
} else { } else {
VDOM2.style.color = "#212020"; for (let i = 0; i < VDOM2.length; i++) {
const element = VDOM2[i];
element.style.color = "#221f1f";
}
} }
const canvas = await html2canvas(captureElement.value); const canvas = await html2canvas(captureElement.value);
@ -657,7 +682,10 @@ const download = async () => {
if (preProcessText.value.text3 == "情感倾向分析") { if (preProcessText.value.text3 == "情感倾向分析") {
VDOM.style.color = "#ffffff"; VDOM.style.color = "#ffffff";
} else { } else {
VDOM2.style.color = "#ffffff"; for (let i = 0; i < VDOM2.length; i++) {
const element = VDOM2[i];
element.style.color = "#ffffff";
}
} }
} catch (error) { } catch (error) {
console.error("无法生成图片", error); console.error("无法生成图片", error);
@ -681,9 +709,7 @@ const sentimentAnalysis = () => {
if (preProcessText.value.text2 == "") return proxy.$modal.msgWarning("请先对数据进行预处理!"); if (preProcessText.value.text2 == "") return proxy.$modal.msgWarning("请先对数据进行预处理!");
} }
if (preProcessText.value.text3 == "") return proxy.$modal.msgWarning("请先选择模型!"); if (preProcessText.value.text3 == "") return proxy.$modal.msgWarning("请先选择模型!");
if (preProcessText.value.text3 === "评论观点抽取" && s_commentType.value == "") {
return proxy.$modal.msgWarning("请先选择评论类型!");
}
if (g_analyzeTheNumberOfDataItems.value == "") return proxy.$modal.msgWarning("请先选择指标/手动输入进行情感分析!"); if (g_analyzeTheNumberOfDataItems.value == "") return proxy.$modal.msgWarning("请先选择指标/手动输入进行情感分析!");
loading.value = true; loading.value = true;
if (preProcessText.value.text3 === "情感倾向分析") { if (preProcessText.value.text3 === "情感倾向分析") {
@ -698,23 +724,25 @@ const sentimentAnalysis = () => {
const negPercentage = total !== 0 ? (neg / total) * 100 : 0; const negPercentage = total !== 0 ? (neg / total) * 100 : 0;
if (posPercentage > negPercentage) { if (posPercentage > negPercentage) {
g_emotionAnalysis.value = 2; g_emotionAnalysis.value = 2;
n_emotiveTendency.value = posPercentage; n_emotiveTendency.value = Math.floor(posPercentage);
} else if (negPercentage > posPercentage) { } else if (negPercentage > posPercentage) {
g_emotionAnalysis.value = 0; g_emotionAnalysis.value = 0;
n_emotiveTendency.value = negPercentage; n_emotiveTendency.value = Math.floor(posPercentage);
} }
if (posPercentage == negPercentage) { if (posPercentage == negPercentage) {
g_emotionAnalysis.value = 1; g_emotionAnalysis.value = 1;
n_emotiveTendency.value = 50; n_emotiveTendency.value = 50;
} }
loading.value = false; loading.value = false;
downloadStatus.value = true;
proxy.$modal.msgSuccess("分析成功");
}) })
.catch((err) => { .catch((err) => {
loading.value = false; loading.value = false;
}); });
} else { } else if (preProcessText.value.text3 !== "评论观点抽取") {
marketingAlgorithmApi marketingAlgorithmApi
.getMarketingAlgorithmSentiment({ id: s_commentType.value, userId: n_dataTableQuery.value.userId, content: g_analyzeTheNumberOfDataItems.value, modelType: preProcessText.value.text3 == "词云生成" ? "词频分析" : preProcessText.value.text3 }) .getMarketingAlgorithmSentiment({ userId: n_dataTableQuery.value.userId, content: g_analyzeTheNumberOfDataItems.value, modelType: preProcessText.value.text3 == "词云生成" ? "词频分析" : preProcessText.value.text3 })
.then((res) => { .then((res) => {
if (preProcessText.value.text3 === "词云生成") { if (preProcessText.value.text3 === "词云生成") {
nOriginalWordFrequency.value = res.data; nOriginalWordFrequency.value = res.data;
@ -723,17 +751,32 @@ const sentimentAnalysis = () => {
nOriginalWordFrequency.value = res.data; nOriginalWordFrequency.value = res.data;
aWordFrequency.value = res.data.slice(0, 5); aWordFrequency.value = res.data.slice(0, 5);
nOriginalWordFrequencyNum.value = res.data.length; nOriginalWordFrequencyNum.value = res.data.length;
}
downloadStatus.value = true;
g_submitVerification.value.n_maximumQuantity = nOriginalWordFrequency.value.reduce((longest, current) => {
return current.keyword.length > longest.keyword.length ? current.keyword : longest.keyword;
}, nOriginalWordFrequency.value[0]);
g_submitVerification.value.n_frequency = nOriginalWordFrequency.value.reduce((longest, current) => {
return item.frequency > max.frequency ? item.n_frequency : max.n_frequency;
}, nOriginalWordFrequency.value[0]);
console.log(g_submitVerification.value, "g_submitVerification.value.");
loading.value = false;
proxy.$modal.msgSuccess("分析成功");
})
.catch((err) => {
loading.value = false;
});
} else { } else {
aCommentOpinion.value = JSON.parse(res.data).items.reduce((groups, item) => { portraitModel
// sentiment .getCommentPoint(JSON.stringify({ text: g_analyzeTheNumberOfDataItems.value }))
if (!groups[item.sentiment]) { .then((res) => {
groups[item.sentiment] = []; aCommentOpinion.value = res.singleAnalysisResult.reduce((groups, item) => {
if (!groups[item.sentiment == "正向" ? 2 : 0]) {
groups[item.sentiment == "正向" ? 2 : 0] = [];
} }
// item groups[item.sentiment == "正向" ? 2 : 0].push(item);
groups[item.sentiment].push(item);
return groups; return groups;
}, {}); }, {});
}
downloadStatus.value = true; downloadStatus.value = true;
loading.value = false; loading.value = false;
proxy.$modal.msgSuccess("分析成功"); proxy.$modal.msgSuccess("分析成功");
@ -748,6 +791,7 @@ const clear = () => {
if (!g_analyzeTheNumberOfDataItems.value) return proxy.$modal.msgWarning("请先分析数据!"); if (!g_analyzeTheNumberOfDataItems.value) return proxy.$modal.msgWarning("请先分析数据!");
g_analyzeTheNumberOfDataItems.value = ""; g_analyzeTheNumberOfDataItems.value = "";
aWordFrequency.value = []; aWordFrequency.value = [];
loading.value = false;
proxy.$modal.msgSuccess("清空成功"); proxy.$modal.msgSuccess("清空成功");
}; };
const initChart = () => { const initChart = () => {
@ -814,9 +858,7 @@ const initChart = () => {
], ],
}); });
}; };
const commentType = (text) => {
s_commentType.value = text.id;
};
const wordFrequencyNext = () => { const wordFrequencyNext = () => {
if (mWordFrequency.value.frequency !== "" || mWordFrequency.value.namenum !== "") { if (mWordFrequency.value.frequency !== "" || mWordFrequency.value.namenum !== "") {
wordFrequencySearch(); wordFrequencySearch();
@ -849,7 +891,6 @@ const switchingModels = () => {
mWordFrequency.value.size = 5; mWordFrequency.value.size = 5;
mWordFrequency.value.frequency = ""; mWordFrequency.value.frequency = "";
mWordFrequency.value.namenum = ""; mWordFrequency.value.namenum = "";
s_commentType.value = "";
}; };
</script> </script>
@ -1198,4 +1239,8 @@ p {
border-color: #6fa8de !important; border-color: #6fa8de !important;
} }
} }
p,
h4 {
color: #ffffff;
}
</style> </style>

@ -2,7 +2,7 @@
<!-- <el-scrollbar ref="scrollbar" height="800px"> --> <!-- <el-scrollbar ref="scrollbar" height="800px"> -->
<div class="main-top"> <div class="main-top">
<span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb">任务描述</span>
<p style="font-weight: 400; font-size: 12px; color: #e6e6e6">给出任务清单参考做哪些数据的统计分析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.</p> <p style="font-weight: 400; font-size: 12px; color: #e6e6e6">使用销售预测数据建立回归模型并预测销量是84610下的销售额最后提交实训任务</p>
</div> </div>
<div class="main-but"> <div class="main-but">
<el-button @click="runResultShow = true"> <el-button @click="runResultShow = true">

@ -44,30 +44,18 @@
background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`, background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`,
}" }"
> >
<el-table-column label="用户ID" align="center" prop="userId"> <el-table-column label="用户ID" align="center" prop="userId"></el-table-column>
</el-table-column> <el-table-column label="登录名" align="center" prop="loginName"></el-table-column>
<el-table-column label="登录名" align="center" prop="loginName"> <el-table-column label="用户姓名" align="center" prop="userName"></el-table-column>
</el-table-column> <el-table-column label="学号" align="center" prop="studentId"></el-table-column>
<el-table-column label="用户姓名" align="center" prop="userName"> <el-table-column label="班级" align="center" prop="stuClass"></el-table-column>
</el-table-column> <el-table-column label="专业" align="center" prop="major"></el-table-column>
<el-table-column label="学号" align="center" prop="studentId"> <el-table-column label="学校" align="center" prop="school"></el-table-column>
</el-table-column> <el-table-column label="角色名称" align="center" prop="roleName"></el-table-column>
<el-table-column label="班级" align="center" prop="stuClass"> <el-table-column label="角色性别" align="center" prop="roleGender"></el-table-column>
</el-table-column> <el-table-column label="角色年龄" align="center" prop="roleAge"></el-table-column>
<el-table-column label="专业" align="center" prop="major"> <el-table-column label="注册时间" align="center" prop="updateTime"></el-table-column>
</el-table-column> <el-table-column label="所在地" align="center" prop="location"></el-table-column>
<el-table-column label="学校" align="center" prop="school">
</el-table-column>
<el-table-column label="角色名称" align="center" prop="roleName">
</el-table-column>
<el-table-column label="角色性别" align="center" prop="roleGender">
</el-table-column>
<el-table-column label="角色年龄" align="center" prop="roleAge">
</el-table-column>
<el-table-column label="注册时间" align="center" prop="updateTime">
</el-table-column>
<el-table-column label="所在地" align="center" prop="location">
</el-table-column>
</el-table> </el-table>
<el-table <el-table
v-if="menuIndex == 2" v-if="menuIndex == 2"
@ -79,30 +67,18 @@
background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`, background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`,
}" }"
> >
<el-table-column label="用户ID" align="center" prop="userId"> <el-table-column label="用户ID" align="center" prop="userId"></el-table-column>
</el-table-column> <el-table-column label="登录名" align="center" prop="loginName"></el-table-column>
<el-table-column label="登录名" align="center" prop="loginName"> <el-table-column label="用户姓名" align="center" prop="userName"></el-table-column>
</el-table-column> <el-table-column label="学号" align="center" prop="studentId"></el-table-column>
<el-table-column label="用户姓名" align="center" prop="userName"> <el-table-column label="班级" align="center" prop="stuClass"></el-table-column>
</el-table-column> <el-table-column label="专业" align="center" prop="major"></el-table-column>
<el-table-column label="学号" align="center" prop="studentId"> <el-table-column label="学校" align="center" prop="school"></el-table-column>
</el-table-column> <el-table-column label="角色名称" align="center" prop="roleName"></el-table-column>
<el-table-column label="班级" align="center" prop="stuClass"> <el-table-column label="常登录地" align="center" prop="frequentLoginLocation"></el-table-column>
</el-table-column> <el-table-column label="最近登录日期" align="center" prop="lastLoginDate"></el-table-column>
<el-table-column label="专业" align="center" prop="major"> <el-table-column label="登录频次" align="center" prop="loginFrequency"></el-table-column>
</el-table-column> <el-table-column label="登录时长" align="center" prop="loginDuration"></el-table-column>
<el-table-column label="学校" align="center" prop="school">
</el-table-column>
<el-table-column label="角色名称" align="center" prop="roleName">
</el-table-column>
<el-table-column label="常登录地" align="center" prop="frequentLoginLocation">
</el-table-column>
<el-table-column label="最近登录日期" align="center" prop="lastLoginDate">
</el-table-column>
<el-table-column label="登录频次" align="center" prop="loginFrequency">
</el-table-column>
<el-table-column label="登录时长" align="center" prop="loginDuration">
</el-table-column>
</el-table> </el-table>
<el-table <el-table
v-if="menuIndex == 3" v-if="menuIndex == 3"
@ -114,71 +90,21 @@
background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`, background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`,
}" }"
> >
<el-table-column label="用户ID" align="center" prop="a1"> <el-table-column label="用户ID" align="center" prop="a1"></el-table-column>
</el-table-column> <el-table-column label="登录名" align="center" prop="a1"></el-table-column>
<el-table-column label="登录名" align="center" prop="a1"> <el-table-column label="用户姓名" align="center" prop="a1"></el-table-column>
</el-table-column> <el-table-column label="学号" align="center" prop="a1"></el-table-column>
<el-table-column label="用户姓名" align="center" prop="a1"> <el-table-column label="班级" align="center" prop="a1"></el-table-column>
</el-table-column> <el-table-column label="专业" align="center" prop="a1"></el-table-column>
<el-table-column label="学号" align="center" prop="a1"> <el-table-column label="学校" align="center" prop="a1"></el-table-column>
</el-table-column> <el-table-column label="角色名称" align="center" prop="a1"></el-table-column>
<el-table-column label="班级" align="center" prop="a1"> <el-table-column label="消费商品小类" align="center" prop="consumerGoods" width="110"></el-table-column>
</el-table-column> <el-table-column label="消费商品类型" align="center" prop="a1" width="110"></el-table-column>
<el-table-column label="专业" align="center" prop="a1"> <el-table-column label="累计消费金额" align="center" prop="a1" width="110"></el-table-column>
</el-table-column> <el-table-column label="累计消费次数" align="center" prop="a1" width="110"></el-table-column>
<el-table-column label="学校" align="center" prop="a1"> <el-table-column label="近七天消费金额" align="center" prop="a1" width="130"></el-table-column>
</el-table-column> <el-table-column label="近七天消费次数" align="center" prop="a1" width="130"></el-table-column>
<el-table-column label="角色名称" align="center" prop="a1"> <el-table-column label="最近消费时间" align="center" prop="a1" width="110"></el-table-column>
</el-table-column>
<el-table-column
label="消费商品小类"
align="center"
prop="consumerGoods"
width="110"
>
</el-table-column>
<el-table-column
label="消费商品类型"
align="center"
prop="a1"
width="110"
>
</el-table-column>
<el-table-column
label="累计消费金额"
align="center"
prop="a1"
width="110"
>
</el-table-column>
<el-table-column
label="累计消费次数"
align="center"
prop="a1"
width="110"
>
</el-table-column>
<el-table-column
label="近七天消费金额"
align="center"
prop="a1"
width="130"
>
</el-table-column>
<el-table-column
label="近七天消费次数"
align="center"
prop="a1"
width="130"
>
</el-table-column>
<el-table-column
label="最近消费时间"
align="center"
prop="a1"
width="110"
>
</el-table-column>
</el-table> </el-table>
<el-table <el-table
v-if="menuIndex == 4" v-if="menuIndex == 4"
@ -190,65 +116,23 @@
background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`, background: `linear-gradient(0deg, #002651 0%, #0087F9 100%)`,
}" }"
> >
<el-table-column label="用户ID" align="center" prop="userId"> <el-table-column label="用户ID" align="center" prop="userId"></el-table-column>
</el-table-column> <el-table-column label="登录名" align="center" prop="loginName"></el-table-column>
<el-table-column label="登录名" align="center" prop="loginName"> <el-table-column label="用户姓名" align="center" prop="userName"></el-table-column>
</el-table-column> <el-table-column label="学号" align="center" prop="studentId"></el-table-column>
<el-table-column label="用户姓名" align="center" prop="userName"> <el-table-column label="班级" align="center" prop="stuClass"></el-table-column>
</el-table-column> <el-table-column label="专业" align="center" prop="major"></el-table-column>
<el-table-column label="学号" align="center" prop="studentId"> <el-table-column label="学校" align="center" prop="school"></el-table-column>
</el-table-column> <el-table-column label="角色名称" align="center" prop="roleName"></el-table-column>
<el-table-column label="班级" align="center" prop="stuClass"> <el-table-column label="商品名称" align="center" prop="goodsName" width="110"></el-table-column>
</el-table-column> <el-table-column label="商品小类" align="center" prop="goodsSubcategories" width="110"></el-table-column>
<el-table-column label="专业" align="center" prop="major"> <el-table-column label="商品类型" align="center" prop="goodsType" width="110"></el-table-column>
</el-table-column> <el-table-column label="用户行为类型" align="center" prop="userBehaviorType" width="110"></el-table-column>
<el-table-column label="学校" align="center" prop="school"> <el-table-column label="行为日期" align="center" prop="behaviorDate" width="130"></el-table-column>
</el-table-column>
<el-table-column label="角色名称" align="center" prop="roleName">
</el-table-column>
<el-table-column
label="商品名称"
align="center"
prop="goodsName"
width="110"
>
</el-table-column>
<el-table-column
label="商品小类"
align="center"
prop="goodsSubcategories"
width="110"
>
</el-table-column>
<el-table-column
label="商品类型"
align="center"
prop="goodsType"
width="110"
>
</el-table-column>
<el-table-column
label="用户行为类型"
align="center"
prop="userBehaviorType"
width="110"
>
</el-table-column>
<el-table-column
label="行为日期"
align="center"
prop="behaviorDate"
width="130"
>
</el-table-column>
</el-table> </el-table>
</div> </div>
</div> </div>
<main-content <main-content v-if="menuIndex == 0" :currentComponent="currentComponent" ref="contentRef"></main-content>
v-if="menuIndex == 0"
:currentComponent="currentComponent"
ref="contentRef"
></main-content>
<div class="btn" v-if="currentComponent"> <div class="btn" v-if="currentComponent">
<div class="submit" @click="submit"></div> <div class="submit" @click="submit"></div>
<div class="retrain" @click="retrain"></div> <div class="retrain" @click="retrain"></div>
@ -269,61 +153,61 @@ const fileTable = ref([]);
const tabList = ref([ const tabList = ref([
{ {
id: "1", id: "1",
key: () => import('./components/rfmAnalysis.vue'), key: () => import("./components/rfmAnalysis.vue"),
title: "RFM分析", title: "RFM分析",
backImg: "/src/assets/images/icon1.png", backImg: "/src/assets/images/icon1.png",
}, },
{ {
id: "2", id: "2",
key: () => import('./components/abcAnalysis.vue'), key: () => import("./components/abcAnalysis.vue"),
title: "帕累托/ABC分析", title: "帕累托/ABC分析",
backImg: "/src/assets/images/icon2.png", backImg: "/src/assets/images/icon2.png",
}, },
{ {
id: "3", id: "3",
key: () => import('./components/bostonAnalysis.vue'), key: () => import("./components/bostonAnalysis.vue"),
title: "波士顿矩阵分析", title: "波士顿矩阵分析",
backImg: "/src/assets/images/icon3.png", backImg: "/src/assets/images/icon3.png",
}, },
{ {
id: "4", id: "4",
key: () => import('./components/funnelAnalysis.vue'), key: () => import("./components/funnelAnalysis.vue"),
title: "转化分析-漏斗模型", title: "转化分析-漏斗模型",
backImg: "/src/assets/images/icon4.png", backImg: "/src/assets/images/icon4.png",
}, },
{ {
id: "5", id: "5",
key: () => import('./components/basketAnalysis.vue'), key: () => import("./components/basketAnalysis.vue"),
title: "购物篮分析", title: "购物篮分析",
backImg: "/src/assets/images/icon5.png", backImg: "/src/assets/images/icon5.png",
}, },
{ {
id: "6", id: "6",
key: () => import('./components/repurchaseAnalysis.vue'), key: () => import("./components/repurchaseAnalysis.vue"),
title: "复购分析", title: "复购分析",
backImg: "/src/assets/images/icon6.png", backImg: "/src/assets/images/icon6.png",
}, },
{ {
id: "7", id: "7",
key: () => import('./components/retainAnalysis.vue'), key: () => import("./components/retainAnalysis.vue"),
title: "留存分析", title: "留存分析",
backImg: "/src/assets/images/icon7.png", backImg: "/src/assets/images/icon7.png",
}, },
{ {
id: "8", id: "8",
key: () => import('./components/viscosityAnalysis.vue'), key: () => import("./components/viscosityAnalysis.vue"),
title: "用户粘性分析", title: "用户粘性分析",
backImg: "/src/assets/images/icon8.png", backImg: "/src/assets/images/icon8.png",
}, },
{ {
id: "9", id: "9",
key: () => import('./components/AARRRAnalysis.vue'), key: () => import("./components/AARRRAnalysis.vue"),
title: "AARRR用户运营分析", title: "AARRR用户运营分析",
backImg: "/src/assets/images/icon9.png", backImg: "/src/assets/images/icon9.png",
}, },
{ {
id: "10", id: "10",
key: () => import('./components/portraitAnalysis.vue'), key: () => import("./components/portraitAnalysis.vue"),
title: "用户画像分析", title: "用户画像分析",
backImg: "/src/assets/images/icon10.png", backImg: "/src/assets/images/icon10.png",
}, },
@ -331,7 +215,7 @@ const tabList = ref([
// defineExpose({ submitMethod }); // defineExpose({ submitMethod });
onMounted(() => { onMounted(() => {
// getTableData(""); // getTableData("");
currentComponent.value =defineAsyncComponent( tabList.value[0].key) currentComponent.value = defineAsyncComponent(tabList.value[0].key);
}); });
const getTableData = (name) => { const getTableData = (name) => {
fileTable.value = []; fileTable.value = [];
@ -451,7 +335,8 @@ const retrain = () => {
width: 172px; width: 172px;
background-size: 172px 56px; background-size: 172px 56px;
} }
.tabs:nth-of-type(6),.tabs:nth-of-type(7) { .tabs:nth-of-type(6),
.tabs:nth-of-type(7) {
// background-image: url("@/assets/images/itembg1.png"); // background-image: url("@/assets/images/itembg1.png");
width: 133px; width: 133px;
background-size: 133px 56px; background-size: 133px 56px;

Loading…
Cancel
Save