解决bug,增加情感分析

dev-QQq
qinzhenpen 2 years ago
parent 663511c644
commit af5535b5e0

@ -2,7 +2,7 @@
* @Author: qinzhenpen qzp1807@126.com * @Author: qinzhenpen qzp1807@126.com
* @Date: 2024-08-16 10:14:59 * @Date: 2024-08-16 10:14:59
* @LastEditors: qinzhenpen qzp1807@126.com * @LastEditors: qinzhenpen qzp1807@126.com
* @LastEditTime: 2024-08-17 16:57:01 * @LastEditTime: 2024-08-19 15:07:27
* @FilePath: \vue3\src\api\marketing-algorithm.js * @FilePath: \vue3\src\api\marketing-algorithm.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -55,3 +55,21 @@ export function getMarketingAlgorithmKnowledgeImport(data) {
data, data,
}); });
} }
//描述性统计分析下载
export function getMarketingAlgorithmDownload(data) {
return request({
url: "/api/analysis/dSExport",
//下载
responseType: "blob",
method: "post",
data,
});
}
// 情感分析
export function getMarketingAlgorithmSentiment(data) {
return request({
url: "/api/model/emotionalAnalysis",
method: "POST",
data,
});
}

@ -16,8 +16,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.28:9868/', baseURL:'http://192.168.2.28:9868/',
// 超时 // 超时
timeout: 100000 timeout: 100000
}) })

@ -74,7 +74,7 @@
</div> </div>
<div class="analysisResults" style="margin-top: 20px"> <div class="analysisResults" style="margin-top: 20px">
<span style="font-weight: bold; font-size: 18px; color: #3596eb; display: block">分析结果</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb; display: block">分析结果</span>
<el-button>下载</el-button> <el-button @click="download"></el-button>
<el-table :data="tableData" style="width: 100%; margin-top: 10px" :header-cell-style="headerCellStyle" height="350"> <el-table :data="tableData" style="width: 100%; margin-top: 10px" :header-cell-style="headerCellStyle" height="350">
<el-table-column v-for="column in tableLabel" :key="column.label" :prop="column.prop" :label="column.label" align="center"></el-table-column> <el-table-column v-for="column in tableLabel" :key="column.label" :prop="column.prop" :label="column.label" align="center"></el-table-column>
</el-table> </el-table>
@ -138,8 +138,7 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog v-model="b_introductionOfAlgorithmKnowledge" title="算法知识导入" width="60%" :show-close="false">
<el-dialog v-model="b_introductionOfAlgorithmKnowledge" title="算法知识导入" width="60%" :show-close="false">
<template #header="{ close, titleId, titleClass }"> <template #header="{ close, titleId, titleClass }">
<div class="my-header"> <div class="my-header">
<span :id="titleId" :class="titleClass">实训任务提交</span> <span :id="titleId" :class="titleClass">实训任务提交</span>
@ -147,9 +146,7 @@
</div> </div>
<img class="xtImg" src="../../../assets/images/线条.png" alt="" /> <img class="xtImg" src="../../../assets/images/线条.png" alt="" />
</template> </template>
<div class="from-item"> <div class="from-item"></div>
</div>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="submitTask"></el-button> <el-button @click="submitTask"></el-button>
@ -160,7 +157,7 @@
</template> </template>
<script setup> <script setup>
import * as portraitModel from "@/api/portraitModel"; import * as portraitModel from "@/api/portraitModel";
import {paginate} from '@/utils/index.js' import { paginate } from "@/utils/index.js";
import * as API from "@/api/AI.js"; import * as API from "@/api/AI.js";
import * as marketingAlgorithmApi from "@/api/marketing-algorithm.js"; import * as marketingAlgorithmApi from "@/api/marketing-algorithm.js";
import useAlgorithmStore from "@/store/modules/algorithm.js"; import useAlgorithmStore from "@/store/modules/algorithm.js";
@ -179,10 +176,10 @@ const n_dataTableQuery = ref({
tableName: "用户属性表", tableName: "用户属性表",
userId: userInfo.userId, userId: userInfo.userId,
}); });
const gAnalysisResults=ref({ const gAnalysisResults = ref({
index: 1, index: 1,
size: 5, size: 5,
}) });
const dialogVisible = ref(false); const dialogVisible = ref(false);
// //
const modelParams = reactive([ const modelParams = reactive([
@ -253,7 +250,6 @@ const formInline = ref({
summation: "", summation: "",
observations: "", observations: "",
}); });
const input = ref();
const g_indicatorData = ref([]); const g_indicatorData = ref([]);
const preProcessText = ref({ const preProcessText = ref({
text1: "数据去重", text1: "数据去重",
@ -263,8 +259,9 @@ const preProcessText = ref({
const n_analyzeTheNumberOfDataItems = ref(0); const n_analyzeTheNumberOfDataItems = ref(0);
const aAnalyzeTheRawData = ref([]); const aAnalyzeTheRawData = ref([]);
// //
const nNumberOfAnalysisResults=ref(0) const nNumberOfAnalysisResults = ref(0);
const aOriginalDataOfAnalysisResults=ref([]) const aOriginalDataOfAnalysisResults = ref([]);
const aOriginalDataOfAnalysisResults2 = ref({});
// //
const g_modelParameter = ref([]); const g_modelParameter = ref([]);
@ -329,11 +326,12 @@ const modelCalculation = () => {
} }
const processedData = processArrayData(analysisHanderKry.value, analysisData.value); const processedData = processArrayData(analysisHanderKry.value, analysisData.value);
marketingAlgorithmApi.getMarketingAlgorithmPreprocessing(JSON.stringify({ map: processedData, statistic: g_modelParameter.value, userId: n_dataTableQuery.value.userId })).then((res) => { marketingAlgorithmApi.getMarketingAlgorithmPreprocessing(JSON.stringify({ map: processedData, statistic: g_modelParameter.value, userId: n_dataTableQuery.value.userId })).then((res) => {
aOriginalDataOfAnalysisResults2.value = res.data;
tableData.value = res.data.map((item) => item.statistics); tableData.value = res.data.map((item) => item.statistics);
if(res.data.length>5){ if (res.data.length > 5) {
nNumberOfAnalysisResults.value=res.data.length nNumberOfAnalysisResults.value = res.data.length;
aOriginalDataOfAnalysisResults.value = res.data.map((item) => item.statistics) aOriginalDataOfAnalysisResults.value = res.data.map((item) => item.statistics);
tableData.value = res.data.map((item) => item.statistics).slice(0,5) tableData.value = res.data.map((item) => item.statistics).slice(0, 5);
} }
}); });
}; };
@ -360,7 +358,7 @@ const getIndicator = () => {
}; };
// //
const knowledgeImport = () => { const knowledgeImport = () => {
b_introductionOfAlgorithmKnowledge.value=true b_introductionOfAlgorithmKnowledge.value = true;
}; };
// //
const submitTask = () => { const submitTask = () => {
@ -412,11 +410,33 @@ const restart = () => {
}; };
// //
const analyzeDataNext = () => { const analyzeDataNext = () => {
analysisData.value =paginate(aAnalyzeTheRawData.value,n_dataTableQuery.value.index,n_dataTableQuery.value.size).data analysisData.value = paginate(aAnalyzeTheRawData.value, n_dataTableQuery.value.index, n_dataTableQuery.value.size).data;
};
const updatePageAnalysisResults = () => {
tableData.value = paginate(aOriginalDataOfAnalysisResults.value, gAnalysisResults.value.index, gAnalysisResults.value.size).data;
};
//
const download = () => {
aOriginalDataOfAnalysisResults2.value.forEach((item) => {
item.statistics.field = item.field;
for (let key in item.statistics) {
item.statistics[key] = item.statistics[key] ?? 0;
}
});
marketingAlgorithmApi.getMarketingAlgorithmDownload(aOriginalDataOfAnalysisResults2.value).then((res) => {
const blob = new Blob([res], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "描述性统计.xlsx";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
proxy.$modal.msgSuccess("下载成功");
});
}; };
const updatePageAnalysisResults=()=>{
tableData.value =paginate(aOriginalDataOfAnalysisResults.value,gAnalysisResults.value.index,gAnalysisResults.value.size).data
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

@ -0,0 +1,593 @@
<template>
<div class="main-top">
<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>
</div>
<div class="main-but">
<el-button @click="knowledgeImport">
<img src="../../../assets/images/导入.png" alt="" />
算法知识导入
</el-button>
<el-button @click="taskSubmit">
<img src="../../../assets/images/提交.png" alt="" />
实训任务提交
</el-button>
</div>
<div class="app-main">
<div class="main-left">
<div>
<div class="left-top">
<span>选择指标</span>
</div>
<div class="metrics">
<el-select v-model="n_dataTableQuery.tableName" placeholder="请选择数据" style="width: 180px" @change="selectType">
<el-option v-for="item in algorithmStore.userDataLabel" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="metrics-table" style="margin-top: 10px">
<el-table border ref="multipleTableRef" :data="algorithmStore.indexLibrary" style="width: 100%" :header-cell-style="headerCellStyle" @selection-change="handleSelectionChange">
<el-table-column type="selection" prop="date" label="Date" align="center" />
<el-table-column label="指标" align="center" prop="label" />
</el-table>
<el-button @click="submit"></el-button>
</div>
<div class="left-top">
<span>数据预处理</span>
</div>
<div class="metrics">
<el-select v-model="preProcessText.text1" placeholder="请选择数据" style="width: 180px">
<el-option label="数据去重" value="数据去重" />
</el-select>
</div>
<div class="metrics" style="margin-top: 15px">
<el-select v-model="preProcessText.text2" placeholder="请选择数据" style="width: 180px" @change="preProcess">
<el-option label="缺失值处理-剔除数据" value="缺失值处理-剔除数据" />
<el-option label="缺失值处理一均值替代" value="缺失值处理一均值替代" />
</el-select>
</div>
<div class="left-top" style="margin-top: 10px">
<span>模型参数设置</span>
</div>
<div class="metrics-table" style="margin-top: 10px">
<el-select v-model="preProcessText.text3" placeholder="请选择模型" style="width: 180px" @change="preProcess">
<el-option label="评论观点抽取" value="评论观点抽取" />
<el-option label="情感倾向分析" value="情感倾向分析" />
<el-option label="词频分析" value="词频分析" />
<el-option label="词云生成" value="词云生成" />
</el-select>
<el-button @click="modelCalculation"></el-button>
</div>
</div>
<div style="margin-top: auto">
<div class="startOver" @click="restart">
<img src="../../../assets/images/重新开始.png" alt="" />
<span>重新开始</span>
</div>
</div>
</div>
<div class="main-right">
<div>
<span style="font-weight: bold; font-size: 18px; color: #3596eb">分析数据</span>
<div class="text-type" v-show="preProcessText.text3 == '评论观点抽取'">
<el-button v-for="text in textType" :key="text" type="primary" plain>{{ text }}</el-button>
</div>
<div class="analysis">
<el-input v-model="g_analyzeTheNumberOfDataItems" :rows="2" type="textarea" placeholder="" />
</div>
<div class="footer">
<el-button type="primary" plain @click="sentimentAnalysis"></el-button>
<el-button type="primary" plain>清空</el-button>
</div>
</div>
<div class="analysisResults" style="margin-top: 20px">
<span style="font-weight: bold; font-size: 18px; color: #3596eb; display: block">分析结果</span>
<el-button @click="download"></el-button>
<h4>词频列表</h4>
<p>你可以对词频词语进行修改删除以及增加频次数越大显示越大最多200关键词</p>
<div class="conditions">
<label>显示条件:</label>
<div>
<span>频次>=</span>
<el-input v-model="input" style="width: 120px" placeholder="" />
</div>
<div>
<span>词语长度>=</span>
<el-input v-model="input" style="width: 120px" placeholder="" />
</div>
</div>
<el-table border :data="aWordFrequency" style="width: 80%" :header-cell-style="headerCellStyle">
<el-table-column label="内容5" align="center" prop="keyword" width="747"/>
<el-table-column label="频次" align="center" prop="frequency" />
</el-table>
</div>
</div>
</div>
<!-- </el-scrollbar> -->
<el-dialog v-model="dialogVisible" title="实训任务提交" width="565" custom-class="dialogClass" :show-close="false">
<template #header="{ close, titleId, titleClass }">
<div class="my-header">
<span :id="titleId" :class="titleClass">实训任务提交</span>
<img class="gbImg" src="../../../assets/images/关闭.png" @click="close" alt="" />
</div>
<img class="xtImg" src="../../../assets/images/线条.png" alt="" />
</template>
<div class="from-item">
<el-form :inline="true" label-position="right" label-width="84px" :model="form" class="demo-form-inline">
<el-form-item label="平均数:">
<el-input style="width: 120px" v-model="formInline.average" clearable />
</el-form-item>
<el-form-item label="众数:">
<el-input style="width: 120px" v-model="formInline.mode" clearable />
</el-form-item>
<el-form-item label="中位数:">
<el-input style="width: 120px" v-model="formInline.median" clearable />
</el-form-item>
<el-form-item label="标准差:">
<el-input style="width: 120px" v-model="formInline.standardDeviation" clearable />
</el-form-item>
<el-form-item label="方差:">
<el-input style="width: 120px" v-model="formInline.variance" clearable />
</el-form-item>
<el-form-item label="峰度:">
<el-input style="width: 120px" v-model="formInline.kurtosis" clearable />
</el-form-item>
<el-form-item label="标准误差:">
<el-input style="width: 120px" v-model="formInline.standardError" clearable />
</el-form-item>
<el-form-item label="偏度:">
<el-input style="width: 120px" v-model="formInline.skewness" clearable />
</el-form-item>
<el-form-item label="最大值:">
<el-input style="width: 120px" v-model="formInline.max" clearable />
</el-form-item>
<el-form-item label="最小值:">
<el-input style="width: 120px" v-model="formInline.min" clearable />
</el-form-item>
<el-form-item label="求和:">
<el-input style="width: 120px" v-model="formInline.summation" clearable />
</el-form-item>
<el-form-item label="观测数:">
<el-input style="width: 120px" v-model="formInline.observations" clearable />
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="submitTask"></el-button>
<el-button type="primary" @click="dialogVisible = false">返回</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import * as portraitModel from "@/api/portraitModel";
import * as API from "@/api/AI.js";
import * as marketingAlgorithmApi from "@/api/marketing-algorithm.js";
import useAlgorithmStore from "@/store/modules/algorithm.js";
import useUserStore from "@/store/modules/user";
import { getUserInfo } from "@/utils/auth";
const userInfo = JSON.parse(getUserInfo());
const loading = ref(false);
const { proxy } = getCurrentInstance();
const algorithmStore = useAlgorithmStore();
const multipleTableRef = ref(null);
const b_introductionOfAlgorithmKnowledge = ref(false);
const n_dataTableQuery = ref({
index: 1,
size: 5,
tableName: "用户属性表",
userId: userInfo.userId,
});
const textType = ["酒店", "KTV", "丽人", "关食", "旅游", "健束", "教育", "商业", "房产", "汽车", "生活", "购物", "3C"];
const dialogVisible = ref(false);
const analysisData = ref([]);
const analysisHanderKry = ref([]);
//
const aWordFrequency=ref([])
const tableLabel = reactive([
{ prop: "average", label: "平均数" },
{ prop: "median", label: "中位数" },
{ prop: "mode", label: "众数" },
{ prop: "standardDeviation", label: "标准差" },
{ prop: "variance", label: "方差" },
{ prop: "standardError", label: "标准误差" },
{ prop: "kurtosis", label: "峰度" },
{ prop: "skewness", label: "偏度" },
{ prop: "max", label: "最大值" },
{ prop: "min", label: "最小值" },
{ prop: "summation", label: "求和" },
{ prop: "observations", label: "观测数" },
]);
const formInline = ref({
average: "",
median: "",
mode: "",
standardDeviation: "",
variance: "",
standardError: "",
kurtosis: "",
skewness: "",
max: "",
min: "",
summation: "",
observations: "",
});
const g_indicatorData = ref([]);
const preProcessText = ref({
text1: "数据去重",
text2: "",
text3: "",
});
const aOriginalDataOfAnalysisResults2 = ref({});
//
const g_analyzeTheNumberOfDataItems = ref("");
//
const g_modelParameter = ref([]);
//
const preProcess = (tetx) => {
if (analysisData.value.length == 0) {
proxy.$modal.msgWarning("请先选择指标进行数据分析!");
preProcessText.value.text2 = "";
}
API.dataPreprocessing({
mapList: analysisData.value,
method: preProcessText.value.text2,
userId: n_dataTableQuery.value.userId,
}).then((res) => {
proxy.$modal.msgSuccess("预处理成功");
analysisData.value = res.data;
g_analyzeTheNumberOfDataItems.value = res.data.map((item) => (item ? item.text : "")).join(",");
});
};
//
const taskSubmit = () => {
dialogVisible.value = true;
};
const tableData = ref([]);
const headerCellStyle = () => {
return {
backgroundColor: "#1882DE !important", //
color: "#ffffff !important",
};
};
//
const selectType = (type) => {
n_dataTableQuery.value.tableName = type;
getIndicator();
};
//
const handleSelectionChange = (type) => {
g_indicatorData.value = type.map((item) => item.label);
};
//
const submit = () => {
if (g_indicatorData.value.length == 0) return proxy.$modal.msgWarning("请选择指标");
marketingAlgorithmApi.getMarketingAlgorithm({ userId: n_dataTableQuery.value.userId, tableName: n_dataTableQuery.value.tableName, fieldList: g_indicatorData.value }).then((res) => {
g_analyzeTheNumberOfDataItems.value = res.data.map((item) => (item ? item.text : "")).join(",");
analysisData.value = res.data.filter((item) => item !== null);
proxy.$modal.msgSuccess("分析数据成功");
});
};
//
const handlemodelSelectionChange = (type) => {
g_modelParameter.value = type.map((item) => item.name);
};
//
const modelCalculation = () => {
if (analysisData.value.length == 0 && g_modelParameter.value.length == 0) {
proxy.$modal.msgWarning("请先分析数据/未选择模型参数!");
return;
}
const processedData = processArrayData(analysisHanderKry.value, analysisData.value);
marketingAlgorithmApi.getMarketingAlgorithmPreprocessing(JSON.stringify({ map: processedData, statistic: g_modelParameter.value, userId: n_dataTableQuery.value.userId })).then((res) => {
aOriginalDataOfAnalysisResults2.value = res.data;
tableData.value = res.data.map((item) => item.statistics);
if (res.data.length > 5) {
nNumberOfAnalysisResults.value = res.data.length;
aOriginalDataOfAnalysisResults.value = res.data.map((item) => item.statistics);
tableData.value = res.data.map((item) => item.statistics).slice(0, 5);
}
});
};
function processArrayData(keys, data) {
//
const result = {};
//
keys.forEach((key) => {
// data
const values = data.map((item) => item[key]);
//
result[key] = values;
});
return result;
}
onMounted(() => {
getIndicator();
});
//
const getIndicator = () => {
algorithmStore.getUserDatabase({ userId: n_dataTableQuery.value.userId, tableName: n_dataTableQuery.value.tableName, algorithmName: "情感分析" });
};
//
const knowledgeImport = () => {
b_introductionOfAlgorithmKnowledge.value = true;
};
//
const submitTask = () => {
for (let key in formInline.value) {
if (formInline.value[key] == "") {
const label = tableLabel.find((item) => item.prop == key);
proxy.$modal.msgWarning(`${label.label}不能为空`);
return;
}
}
portraitModel
.submit({
userId: n_dataTableQuery.value.userId,
taskName: "描述性统计",
numberOfErrors: 0,
})
.then((res) => {
dialogVisible.value = false;
proxy.$modal.msgSuccess("提交成功");
});
};
//
const restart = () => {
//
formInline.value = {
average: "",
median: "",
mode: "",
standardDeviation: "",
variance: "",
standardError: "",
kurtosis: "",
skewness: "",
max: "",
min: "",
summation: "",
observations: "",
};
analysisData.value = [];
analysisHanderKry.value = [];
tableData.value = [];
g_indicatorData.value = [];
g_modelParameter.value = [];
preProcessText.value.text2 = "";
n_dataTableQuery.value.tableName = "用户属性表";
getIndicator();
proxy.$modal.msgSuccess("重新开始成功");
multipleTableRef.value.clearSelection();
};
//
const download = () => {
aOriginalDataOfAnalysisResults2.value.forEach((item) => {
item.statistics.field = item.field;
for (let key in item.statistics) {
item.statistics[key] = item.statistics[key] ?? 0;
}
});
marketingAlgorithmApi.getMarketingAlgorithmDownload(aOriginalDataOfAnalysisResults2.value).then((res) => {
const blob = new Blob([res], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "描述性统计.xlsx";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
proxy.$modal.msgSuccess("下载成功");
});
};
//
const sentimentAnalysis = () => {
marketingAlgorithmApi.getMarketingAlgorithmSentiment({ userId: n_dataTableQuery.value.userId, content: g_analyzeTheNumberOfDataItems.value, modelType: preProcessText.value.text3 }).then(res=>{
aWordFrequency.value=res.data
})
};
</script>
<style lang="scss" scoped>
.main-top {
margin: 20px 20px 0;
margin-top: 10px;
height: 85px;
background: #001d40;
border: 1px solid #0452c6;
padding: 5px 20px;
}
.main-but {
margin: 5px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 180px;
height: 56px;
background: url("../../../assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
}
.el-button:nth-child(2) {
width: 180px;
height: 56px;
background: url("../../../assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
}
}
.app-main {
// background-color: #f5f5f5;
min-height: 965px;
margin: 5px 20px 0;
height: 100%;
display: flex;
overflow: auto;
.main-left {
//
flex-direction: column;
min-height: 965px;
display: flex;
width: 205px;
height: 100%;
background: #041c49;
padding: 0px 10px;
.left-top {
padding: 10px;
span {
font-weight: bold;
font-size: 18px;
color: #3596eb;
}
}
.metrics-table {
.el-button {
width: 149px;
height: 48px;
background: url("../../../assets/images/确定.png");
color: #ffffff;
border-color: #ffffff00;
background-size: 100% 100%;
margin: 15px;
}
}
.startOver {
margin-left: -10px;
width: 205px;
height: 55px;
background: #00f4ff;
//
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
:deep(.el-table) {
--el-table-row-hover-bg-color: #002651 !important;
--el-table-border-color: #7ac1ff;
.el-table__row {
background-color: #002652 !important;
color: #e6e6e6;
}
}
}
.main-right {
width: 1639px;
// height: 100%;
padding: 20px;
border: 1px solid #0452c6;
.text-type {
margin: 29px 0 20px 0px;
transition: all 3s;
.el-button {
width: 90px;
height: 28px;
--el-button-bg-color: #041d3b;
--el-button-border-color: #1983dd;
}
}
.analysis {
.el-textarea {
height: 343px;
background: #002652;
border-radius: 10px;
:deep(.el-textarea__inner) {
min-height: 343px !important;
background: transparent;
box-shadow: 0 0 0 1px #1983dd;
color: #ffffff;
}
}
}
.footer {
padding-top: 20px;
text-align: center;
}
}
.metrics,
.metrics-table {
: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;
}
}
}
}
.analysisResults {
.el-button {
width: 89px;
height: 31px;
background: url("../../../assets/images/下载.png");
color: black;
border-color: #ffffff00;
// background-size: 100% 100%;
margin: 15px 0px 5px;
}
.conditions {
display: flex;
align-items: center;
color: #ffffff;
font-size: 14px;
margin: 16px 0;
label {
width: 80px;
color: #ffffff;
}
div {
span {
display: inline-block;
color: #ffffff;
margin-right: 10px;
}
:deep(.el-input) {
.el-input__wrapper {
background-color: #002651 !important;
box-shadow: 0 0 0 1px #67b3d6;
border: radius 0px;
.el-input__inner {
color: #ffffff;
caret-color: #ffffff;
cursor: pointer;
}
}
}
margin-right: 55px;
}
}
}
:deep(.el-form-item__label) {
color: #ffffff;
}
.from-item {
padding: 20px;
.el-input {
--el-input-text-color: #ffffff;
--el-input-bg-color: #002651;
--el-input-border-color: #67b3d6;
}
}
.dialog-footer {
margin-bottom: 20px;
}
h4,
p {
color: #ffffff !important;
font-size: 14px;
}
</style>

@ -1,111 +1,111 @@
<template> <template>
<div class="rgzn_top app-container"> <div class="rgzn_top app-container">
<div class="top_item"> <div class="top_item">
<el-button :class="{'active':isActive===1}" @click="activeIndex(1)"></el-button> <el-button :class="{ active: isActive === 1 }" @click="activeIndex(1)"></el-button>
<el-button :class="{'active':isActive===2}" @click="activeIndex(2)"></el-button> <el-button :class="{ active: isActive === 2 }" @click="activeIndex(2)"></el-button>
<el-button :class="{'active':isActive===3}" @click="activeIndex(3)"></el-button> <el-button :class="{ active: isActive === 3 }" @click="activeIndex(3)"></el-button>
<el-button :class="{'active':isActive===4}" @click="activeIndex(4)"></el-button> <el-button :class="{ active: isActive === 4 }" @click="activeIndex(4)"></el-button>
<el-button :class="{'active':isActive===5}" @click="activeIndex(5)"></el-button> <el-button :class="{ active: isActive === 5 }" @click="activeIndex(5)"></el-button>
<el-button :class="{'active':isActive===6}" @click="activeIndex(6)">/</el-button> <el-button :class="{ active: isActive === 6 }" @click="activeIndex(6)">/</el-button>
<el-button :class="{'active':isActive===7}" @click="activeIndex(7)"></el-button> <!-- <el-button :class="{'active':isActive===7}" @click="activeIndex(7)"></el-button> -->
</div>
<div>
<component :is="component"></component>
</div>
</div> </div>
</template> <div>
<component :is="component"></component>
</div>
</div>
</template>
<script setup> <script setup>
// import AIGC from './AIGCLargeModel/index.vue' // import AIGC from './AIGCLargeModel/index.vue'
import big from './components/bigData.vue' import big from "./components/bigData.vue";
import descriptiveStatistics from './components/descriptiveStatistics.vue' import descriptiveStatistics from "./components/descriptiveStatistics.vue";
import clusterAnalysis from './components/clusterAnalysis.vue' import clusterAnalysis from "./components/clusterAnalysis.vue";
import associationRuleMining from './components/associationRuleMining.vue' import associationRuleMining from "./components/associationRuleMining.vue";
import regressionAnalysis from './components/regressionAnalysis.vue' import regressionAnalysis from "./components/regressionAnalysis.vue";
const component=ref(big) import emotionAnalysis from "./components/emotion-analysis.vue";
const pageData=[big,descriptiveStatistics,clusterAnalysis,associationRuleMining,regressionAnalysis] const component = ref(emotionAnalysis);
const isActive=ref(1) const pageData = [big, descriptiveStatistics, clusterAnalysis, associationRuleMining, regressionAnalysis, emotionAnalysis];
const activeIndex=(index)=>{ const isActive = ref(1);
isActive.value=index const activeIndex = (index) => {
component.value=pageData[index-1] isActive.value = index;
} component.value = pageData[index - 1];
</script> };
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
.content{ .content {
color: #fff; color: #fff;
} }
.rgzn_top{ .rgzn_top {
margin-top: 20px; margin-top: 20px;
.top_item{ .top_item {
img{ img {
margin-right: 5px; margin-right: 5px;
} }
.el-button{ .el-button {
padding-left: 49px !important; padding-left: 49px !important;
} }
.el-button:nth-child(1) { .el-button:nth-child(1) {
width: 170px; width: 170px;
height: 50px; height: 50px;
background: url('../../assets/images/11.png'); background: url("../../assets/images/11.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 47px; padding: 8px 5px 8px 47px;
} }
.el-button:nth-child(2) { .el-button:nth-child(2) {
width: 170px; width: 170px;
height: 50px; height: 50px;
background: url('../../assets/images/22.png'); background: url("../../assets/images/22.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 47px; padding: 8px 5px 8px 47px;
} }
.el-button:nth-child(3) { .el-button:nth-child(3) {
width: 170px; width: 170px;
height: 50px; height: 50px;
background: url('../../assets/images/33.png'); background: url("../../assets/images/33.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 47px; padding: 8px 5px 8px 47px;
} }
.el-button:nth-child(4) { .el-button:nth-child(4) {
width: 170px; width: 170px;
height: 50px; height: 50px;
background: url('../../assets/images/44.png'); background: url("../../assets/images/44.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 30px; padding: 8px 5px 8px 30px;
} }
.el-button:nth-child(5) { .el-button:nth-child(5) {
width: 170px; width: 170px;
height: 50px; height: 50px;
background: url('../../assets/images/55.png'); background: url("../../assets/images/55.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 25px; padding: 8px 5px 8px 25px;
} }
.el-button:nth-child(6) { .el-button:nth-child(6) {
width: 190px; width: 190px;
height: 50px; height: 50px;
background: url('../../assets/images/66.png'); background: url("../../assets/images/66.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 30px; padding: 8px 5px 8px 30px;
background-size: 100% 100%; background-size: 100% 100%;
} }
.el-button:nth-child(7) { .el-button:nth-child(7) {
width: 170px; width: 170px;
height: 50px; height: 50px;
background: url('../../assets/images/77.png'); background: url("../../assets/images/77.png");
color:#FFFFFF; color: #ffffff;
border-color:#FFFFFF00; border-color: #ffffff00;
padding:8px 5px 8px 20px; padding: 8px 5px 8px 20px;
} }
.active{ .active {
background: url('../../assets/images/亮(钮).png'); transform: scale(1.1);
} transition: all 0.3s;
} }
} }
</style> }
</style>

@ -1,65 +1,64 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-scrollbar height="780px" always> <el-scrollbar height="780px" always>
<!-- <div class="app-container"> --> <!-- <div class="app-container"> -->
<div class="main"> <div class="main">
<el-row :gutter="40"> <el-row :gutter="40">
<el-col :span="3" v-for="i in item" :key="i"> <el-col :span="3" v-for="i in item" :key="i">
<div class="zs"> <div class="zs">
<div class="el_top"> <div class="el_top">
<a target="_blank" @click="showResource(i.resourcesUrl)"> <a target="_blank" @click="showResource(i.resourcesUrl)">
<span style="color:#FFFFFF">{{i.resourcesName}}</span> <span>{{ i.resourcesName }}</span>
</a> </a>
</div> </div>
<div class="el_bon"> <div class="el_bon">
<!-- <a :href="getImgLink(i.resourcesUrl)" target="_blank"> --> <!-- <a :href="getImgLink(i.resourcesUrl)" target="_blank"> -->
<a target="_blank" @click="showResource(i.resourcesUrl)"> <a target="_blank" @click="showResource(i.resourcesUrl)">
<img :src="getImg(i.resourcesImg)"/> <img :src="getImg(i.resourcesImg)" />
</a> </a>
</div> </div>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<!-- </div> --> <!-- </div> -->
</el-scrollbar> </el-scrollbar>
</div> </div>
</template>
<script setup>
import * as API from "@/api/prtrait/prtrait.js";
import { getAssetsFile } from "@/utils";
import { getUserInfo } from "@/utils/auth";
import { onMounted } from "vue";
const getImg = (i) => {
return getAssetsFile(i);
};
const getImgLink = (i) => {
return i;
};
const data = ref({
stuScoreDetailsDTO: {
learningProjects: "资源学习",
assessmentItems: "观看资源",
viewingTime: 0,
userId: JSON.parse(getUserInfo()).userId,
},
});
const item = ref({});
</template> onMounted(() => {
<script setup> API.learningResourcesView({ module: data.value.stuScoreDetailsDTO.module }).then((res) => {
import * as API from "@/api/prtrait/prtrait.js" item.value = res.data;
import { getAssetsFile } from '@/utils'; });
import { getUserInfo } from '@/utils/auth' });
import { onMounted } from "vue";
const getImg=(i)=>{
return getAssetsFile(i)
}
const getImgLink=(i)=>{
return i
}
const data=ref({
"stuScoreDetailsDTO":{
"learningProjects":"资源学习",
"assessmentItems":"观看资源",
"viewingTime":0,
"userId":JSON.parse(getUserInfo()).userId,
}
})
const item=ref({})
onMounted(()=>{
API.learningResourcesView({module:data.value.stuScoreDetailsDTO.module}).then((res)=>{
item.value=res.data
})
})
const showResource=async(i)=>{ const showResource = async (i) => {
// const newWindow=window.open(`http://192.168.2.4:8800/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${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}`) // window.open(`http://qkljr.sztzjy.com:90/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}`)
if(i.includes('mp4')){ if (i.includes("mp4")) {
const newWindow=window.open('','_blank') const newWindow = window.open("", "_blank");
newWindow.document.write(` newWindow.document.write(`
<html> <html>
<head> <head>
<title>视频播放</title> <title>视频播放</title>
@ -86,99 +85,96 @@
</html> </html>
`); `);
} }
if(i.includes('pdf')){ if (i.includes("pdf")) {
// window.open(`http://qkljr.sztzjy.com:90/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}#toolbar=0`) // window.open(`http://qkljr.sztzjy.com:90/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}#toolbar=0`)
window.open(`http://118.31.7.2:8042/file/${i}#toolbar=0`) window.open(`http://118.31.7.2:8042/file/${i}#toolbar=0`);
// window.open(`http://202.199.90.115:8800/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}`) // window.open(`http://202.199.90.115:8800/api/stu/concept/block/getResource?`+`module=${data2.module}`+`&name=${i}`)
} }
};
const timer = ref(null);
let seconds = 0;
onMounted(() => {
timer.value = setInterval(() => {
seconds++;
}, 1000);
});
onBeforeUnmount(() => {
item.value = {};
if (timer.value) {
clearInterval(timer.value);
} }
const timer=ref(null) data.value.stuScoreDetailsDTO.viewingTime = seconds;
let seconds=0 API.resourcesLearningScoreStatistics(data.value);
onMounted(()=>{ });
timer.value=setInterval(()=>{
seconds++
},1000)
})
onBeforeUnmount(()=>{
item.value={}
if(timer.value){
clearInterval(timer.value)
}
data.value.stuScoreDetailsDTO.viewingTime=seconds
API.resourcesLearningScoreStatistics(data.value)
})
const taskTime=async()=>{
const taskTime = async () => {};
</script>
<style lang="scss" scoped>
.app-container {
// background-color: #fff;
// border-radius: 6px;
// padding: 25px 25px 25px 0;
.k_main {
width: 100%;
display: inline-block;
margin: 20px;
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3);
height: 750px;
background-color: white;
border-radius: 10px;
} }
</script> .el-col-4 {
<style lang="scss" scoped> margin-bottom: 30px;
.app-container { }
// background-color: #fff; .zs {
// border-radius: 6px; margin-bottom: 36px;
// padding: 25px 25px 25px 0; border: 1px solid #dcdfe6;
.k_main { border-radius: 8px;
width: 100%; }
display: inline-block; .main {
margin: 20px; width: 100%; /* 确保宽度不超过容器宽度 */
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3); overflow-x: hidden; /* 确保不出现水平滚动条 */
height: 750px; }
background-color: white; .el_top {
border-radius: 10px; height: 66px;
} display: flex;
.el-col-4 { justify-content: center;
margin-bottom: 30px; align-items: center;
} font-size: 12px;
.zs { font-family: Source Han Sans CN;
margin-bottom: 36px; font-weight: 550;
border: 1px solid #dcdfe6; // color: #333333;
border-radius: 8px; padding: 7px;
} text-align: center;
.main { background: #ffffff;
width: 100%; /* 确保宽度不超过容器宽度 */ border-radius: 6px 6px 0 0;
overflow-x: hidden; /* 确保不出现水平滚动条 */ }
} .el_bon {
.el_top { display: flex;
height: 66px; justify-content: center;
display: flex; background-color: whitesmoke;
justify-content: center; // padding: 10px 27px 10px 27px;
align-items: center; img {
font-size: 12px; width: 159px;
font-family: Source Han Sans CN; height: 184px;
font-weight: 550;
color: #333333;
padding: 7px;
text-align: center;
}
.el_bon {
display: flex;
justify-content: center;
background-color: whitesmoke;
// padding: 10px 27px 10px 27px;
img {
width: 159px;
height: 184px;
}
}
.el-row {
margin-bottom: 20px;
}
.el-row:last-child {
margin-bottom: 0;
}
.el-col {
border-radius: 4px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 500;
}
.grid-content {
border-radius: 4px;
min-height: 36px;
} }
} }
</style> .el-row {
margin-bottom: 20px;
}
.el-row:last-child {
margin-bottom: 0;
}
.el-col {
border-radius: 4px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 500;
}
.grid-content {
border-radius: 4px;
min-height: 36px;
}
}
</style>

Loading…
Cancel
Save