|
|
@@ -78,7 +78,7 @@
|
|
|
<el-table-column label="算法ID" align="center" prop="algoId" />
|
|
|
<el-table-column label="算法名称" align="center" prop="algoName" />
|
|
|
<el-table-column label="算法描述" align="center" prop="algoDesc" />
|
|
|
- <el-table-column label="算法脚本" align="center" prop="algoScript" />
|
|
|
+ <el-table-column label="算法脚本" align="center" prop="algoScript" show-overflow-tooltip/>
|
|
|
<el-table-column label="算法是否正确" align="center" prop="algoOk">
|
|
|
<template #default="scope">
|
|
|
<dict-tag :options="sys_common_status" :value="scope.row.algoOk"/>
|
|
|
@@ -111,41 +111,71 @@
|
|
|
/>
|
|
|
|
|
|
<!-- 添加或修改算法管理对话框 -->
|
|
|
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
|
|
+ <el-dialog :title="title" v-model="open" width="800px" append-to-body>
|
|
|
<el-form ref="algoRef" :model="form" :rules="rules" label-width="80px">
|
|
|
- <el-form-item label="算法名称" prop="algoName">
|
|
|
+ <el-form-item label="算法名称" prop="algoName" label-width="100px">
|
|
|
<el-input v-model="form.algoName" placeholder="请输入算法名称" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="算法描述" prop="algoDesc">
|
|
|
+ <el-form-item label="算法描述" prop="algoDesc" label-width="100px">
|
|
|
<el-input v-model="form.algoDesc" placeholder="请输入算法描述" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="算法脚本" prop="algoScript">
|
|
|
- <el-input v-model="form.algoScript" type="textarea" placeholder="请输入内容" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="算法是否正确" prop="algoOk">
|
|
|
- <el-radio-group v-model="form.algoOk">
|
|
|
+ <el-form-item label="算法参数" prop="algoPara" label-width="100px">
|
|
|
+ <el-radio-group v-model="form.algoPara">
|
|
|
<el-radio
|
|
|
- v-for="dict in sys_common_status"
|
|
|
+ v-for="dict in algo_para"
|
|
|
:key="dict.value"
|
|
|
:label="dict.value"
|
|
|
>{{dict.label}}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="算法类别" prop="algoType">
|
|
|
- <el-radio-group v-model="form.algoType">
|
|
|
+ <el-form-item label="算法脚本" prop="algoScript" label-width="100px">
|
|
|
+ <el-tabs style="width: 100%;" v-model="activeTabsName" @tab-click="handleTabClick">
|
|
|
+ <el-tab-pane label="脚本" name="100">
|
|
|
+ <div :ref="(el)=>setItemRef(el)" class="code-editor"></div>
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="验证" name="200">
|
|
|
+ <el-tabs style="width:100%;height: 100%;" v-model="activeTabsParaName">
|
|
|
+ <el-tab-pane label="数据样例:一周" name="lastweek" style="width:100%;height: 100%;">
|
|
|
+ <el-input
|
|
|
+ v-model="lastweek_value"
|
|
|
+ type="textarea"
|
|
|
+ :rows="9"
|
|
|
+ placeholder="请输入内容"
|
|
|
+ />
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="数据样例:两周" name="currweek" style="width:100%;height: 100%;" v-if="form.algoPara=='2'">
|
|
|
+ <el-input
|
|
|
+ v-model="currweek_value"
|
|
|
+ type="textarea"
|
|
|
+ :rows="9"
|
|
|
+ placeholder="请输入内容"
|
|
|
+ />
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ <div v-if="activeTabsName=='200'"><el-button type="primary" @click="checkJS">验 证</el-button></div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="算法验证结果" label-width="100px">
|
|
|
+ <div class="width:100%;height:50px">{{ jsCheckResult }}</div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="算法是否正确" prop="algoOk" label-width="100px">
|
|
|
+ <el-radio-group v-model="form.algoOk">
|
|
|
<el-radio
|
|
|
- v-for="dict in algo_type"
|
|
|
+ v-for="dict in sys_common_status"
|
|
|
:key="dict.value"
|
|
|
:label="dict.value"
|
|
|
+ disabled
|
|
|
>{{dict.label}}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="算法参数" prop="algoPara">
|
|
|
- <el-radio-group v-model="form.algoPara">
|
|
|
+ <el-form-item label="算法类别" prop="algoType" label-width="100px">
|
|
|
+ <el-radio-group v-model="form.algoType">
|
|
|
<el-radio
|
|
|
- v-for="dict in algo_para"
|
|
|
+ v-for="dict in algo_type"
|
|
|
:key="dict.value"
|
|
|
:label="dict.value"
|
|
|
+ :disabled="form.algoOk!='0'"
|
|
|
>{{dict.label}}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
@@ -161,9 +191,15 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup name="Algo">
|
|
|
- import { listAlgo, getAlgo, delAlgo, addAlgo, updateAlgo } from "@/api/biz/algo";
|
|
|
-
|
|
|
- const { proxy } = getCurrentInstance();
|
|
|
+import { listAlgo, getAlgo, delAlgo, addAlgo, updateAlgo } from "@/api/biz/algo";
|
|
|
+import { listData, getData } from "@/api/biz/data";
|
|
|
+import { EditorView, keymap } from '@codemirror/view'
|
|
|
+import { EditorState } from '@codemirror/state'
|
|
|
+import { defaultKeymap } from '@codemirror/commands'
|
|
|
+import { highlightSelectionMatches } from '@codemirror/search'
|
|
|
+import { javascript } from '@codemirror/lang-javascript'
|
|
|
+import { oneDark } from '@codemirror/theme-one-dark'
|
|
|
+const { proxy } = getCurrentInstance();
|
|
|
const { sys_common_status, algo_type, algo_para } = proxy.useDict('sys_common_status', 'algo_type', 'algo_para');
|
|
|
|
|
|
const algoList = ref([]);
|
|
|
@@ -175,22 +211,110 @@ const single = ref(true);
|
|
|
const multiple = ref(true);
|
|
|
const total = ref(0);
|
|
|
const title = ref("");
|
|
|
+const activeTabsName = ref("100");
|
|
|
+const activeTabsParaName = ref("lastweek");
|
|
|
+const lastweek_value = ref("");
|
|
|
+const currweek_value = ref("");
|
|
|
|
|
|
+const editorContainer = ref(null);
|
|
|
+let editorView = null;
|
|
|
+const modelValue = ref('这是一段js脚本 !');
|
|
|
const data = reactive({
|
|
|
- form: {},
|
|
|
+ form: {algoPara: "1"},
|
|
|
queryParams: {
|
|
|
pageNum: 1,
|
|
|
pageSize: 10,
|
|
|
algoName: null,
|
|
|
algoDesc: null,
|
|
|
algoType: null,
|
|
|
- algoPara: null,
|
|
|
+ algoPara: "1",
|
|
|
},
|
|
|
rules: {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+const jsCheckResult = ref("未验证"); //脚本验证结果
|
|
|
+
|
|
|
const { queryParams, form, rules } = toRefs(data);
|
|
|
+const setItemRef = (el) => {
|
|
|
+ if (el) {
|
|
|
+ editorContainer.value = el
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handleTabClick=()=>{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const checkJS=()=>{
|
|
|
+ let scriptStr=editorView.state.doc.toString();
|
|
|
+ if(scriptStr==''){
|
|
|
+ proxy.$modal.msgError("算法脚本不能为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //lastweek_value
|
|
|
+ let paramsStr = "";
|
|
|
+ if(lastweek_value.value==''){
|
|
|
+ proxy.$modal.msgError("数据样例(一周)不能为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ paramsStr = lastweek_value.value.substring(0,1)!='[' ? "'"+lastweek_value.value+"'" : lastweek_value.value;
|
|
|
+ if(form.value.algoPara=="2" && currweek_value.value==''){
|
|
|
+ proxy.$modal.msgError("数据样例(两周)不能为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(form.value.algoPara=="2"){
|
|
|
+ if(currweek_value.value.substring(0,1)!='[')
|
|
|
+ paramsStr += ",'"+currweek_value.value+"'";
|
|
|
+ else
|
|
|
+ paramsStr += ","+currweek_value.value;
|
|
|
+ }
|
|
|
+ try{
|
|
|
+ scriptStr = "const nonefun = "+scriptStr+"; nonefun("+paramsStr+")";
|
|
|
+ console.log(scriptStr)
|
|
|
+ var result = eval(scriptStr);
|
|
|
+ jsCheckResult.value=result
|
|
|
+ form.value.algoOk="0";
|
|
|
+ }catch(e){
|
|
|
+ console.log(e)
|
|
|
+ form.value.algoOk="1";
|
|
|
+ jsCheckResult.value="验证失败:脚本错误!";
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 创建编辑器配置
|
|
|
+const createEditorState = (content) => {
|
|
|
+ const extensions = [
|
|
|
+ keymap.of(defaultKeymap),
|
|
|
+ highlightSelectionMatches(),
|
|
|
+ EditorView.updateListener.of((update) => {
|
|
|
+ if (update.docChanged) {
|
|
|
+ //const content = update.state.doc.toString()
|
|
|
+ //emit('update:modelValue', content)
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ EditorView.editable.of(true)
|
|
|
+ ]
|
|
|
+
|
|
|
+ // 添加语言支持
|
|
|
+ extensions.push(javascript());
|
|
|
+ extensions.push(oneDark)
|
|
|
+
|
|
|
+ return EditorState.create({
|
|
|
+ doc: content,
|
|
|
+ extensions
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+// 初始化编辑器
|
|
|
+ const initEditor = () => {
|
|
|
+ if (editorContainer.value) {
|
|
|
+ editorView = new EditorView({
|
|
|
+ state: createEditorState(modelValue.value),
|
|
|
+ parent: editorContainer.value
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
/** 查询算法管理列表 */
|
|
|
function getList() {
|
|
|
@@ -202,6 +326,13 @@ function getList() {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+function getDataExp(){
|
|
|
+ listData({}).then(res=>{
|
|
|
+ lastweek_value.value = res.rows[0]["currData"];
|
|
|
+ currweek_value.value = res.rows[0]["lastData"];
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
// 取消按钮
|
|
|
function cancel() {
|
|
|
open.value = false;
|
|
|
@@ -214,10 +345,10 @@ function reset() {
|
|
|
algoId: null,
|
|
|
algoName: null,
|
|
|
algoDesc: null,
|
|
|
- algoScript: null,
|
|
|
- algoOk: null,
|
|
|
+ algoScript: "",
|
|
|
+ algoOk: "1",
|
|
|
algoType: null,
|
|
|
- algoPara: null,
|
|
|
+ algoPara: "1",
|
|
|
createBy: null,
|
|
|
createTime: null,
|
|
|
updateBy: null,
|
|
|
@@ -251,6 +382,9 @@ function handleAdd() {
|
|
|
reset();
|
|
|
open.value = true;
|
|
|
title.value = "添加算法管理";
|
|
|
+ setTimeout(() => {
|
|
|
+ initEditor();
|
|
|
+ }, 100);
|
|
|
}
|
|
|
|
|
|
/** 修改按钮操作 */
|
|
|
@@ -261,11 +395,21 @@ function handleUpdate(row) {
|
|
|
form.value = response.data;
|
|
|
open.value = true;
|
|
|
title.value = "修改算法管理";
|
|
|
+ modelValue.value = form.value.algoScript;
|
|
|
+ setTimeout(() => {
|
|
|
+ initEditor();
|
|
|
+ }, 100);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/** 提交按钮 */
|
|
|
function submitForm() {
|
|
|
+ //console.log("====:",editorView.state.doc.toString())
|
|
|
+ if(form.value.algoOk!="0"){
|
|
|
+ proxy.$modal.msgError("算法验证失败,不允许保存!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ form.value.algoScript = editorView.state.doc.toString()
|
|
|
proxy.$refs["algoRef"].validate(valid => {
|
|
|
if (valid) {
|
|
|
if (form.value.algoId != null) {
|
|
|
@@ -302,6 +446,29 @@ function handleExport() {
|
|
|
...queryParams.value
|
|
|
}, `algo_${new Date().getTime()}.xlsx`)
|
|
|
}
|
|
|
-
|
|
|
getList();
|
|
|
+getDataExp();
|
|
|
</script>
|
|
|
+<style scoped>
|
|
|
+.code-editor {
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ border-radius: 4px;
|
|
|
+ overflow: hidden;
|
|
|
+ height: 300px;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.cm-editor) {
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.cm-content) {
|
|
|
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 1.5;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.cm-selectionMatch) {
|
|
|
+ background-color: #ffff0055;
|
|
|
+}
|
|
|
+</style>
|