Merge remote-tracking branch 'origin/master'

master
chaiyapeng 2024-09-02 20:23:15 +08:00
commit 13c1905b57
8 changed files with 555 additions and 42 deletions

View File

@ -49,6 +49,7 @@
"@vue/composition-api": "^1.7.2", "@vue/composition-api": "^1.7.2",
"axios": "0.24.0", "axios": "0.24.0",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"codemirror": "^5.65.12",
"core-js": "3.25.3", "core-js": "3.25.3",
"echarts": "5.4.0", "echarts": "5.4.0",
"element-ui": "2.9.1", "element-ui": "2.9.1",

View File

@ -79,7 +79,7 @@ export function findById(id) {
//通过id删除数据 //通过id删除数据
export function dels(id) { export function dels(id) {
return request({ return request({
url: '/engine/engine/delete/' + id, url: '/engine/version/delete/' + id,
method: 'post', method: 'post',
data: id data: id
}) })
@ -107,5 +107,13 @@ export function selectEngineById(id){
}) })
} }
//根据版本id查询版本信息
export function sel(id){
return request({
url: "/engine/version/selectListById/" + id,
method: "post"
})
}

View File

@ -108,6 +108,15 @@ export function delUser(userId) {
}) })
} }
//修改手机号
export function updatePhone(data) {
return request({
url: '/system/user/profile/updatePhonenumber/'+data,
method: 'POST'
})
}
// 用户密码重置 // 用户密码重置
export function resetUserPwd(userId, password) { export function resetUserPwd(userId, password) {
const data = { const data = {

View File

@ -0,0 +1,57 @@
<template>
<codemirror ref="mycode" :value="curCode" :options="cmOptions" class="code" v-show="aaa">
</codemirror>
</template>
<script>
import { codemirror } from 'vue-codemirror'
import "codemirror/theme/ambiance.css"; // theme
require("codemirror/mode/javascript/javascript"); // jsmode
export default {
name: 'ExecuteAction',
data() {
return {
curCode: '测试',
cmOptions: {
// autorefresh: true,
// tabSize: 4,
// mode: 'text/x-properties',
// theme: 'ayu-mirage',
// line: true,
// viewportMargin: Infinity, //使
// highlightDifferences: true,
// autofocus: false,
// indentUnit: 2,
// smartIndent: true,
// readOnly: true, //
// showCursorWhenSelecting: true,
// firstLineNumber: 1
lineNumbers: true, //
mode: 'text/x-yaml', // model
gutters: ['CodeMirror-lint-markers'], //
theme: "ambiance",
lint: true, //
}
}
},
components: {
codemirror
},
}
</script>
<style scoped>
.information-box>>>.CodeMirror {
font-family: monospace;
height: 71vh;
direction: ltr;
}
</style>

View File

@ -1,6 +1,23 @@
import Vue from 'vue' import Vue from 'vue'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
//引入文件、、
import VueCodeMirror from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'
Vue.use(VueCodeMirror)
//
//codemirror
import VueCodemirror from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'
Vue.use(VueCodemirror)
import 'codemirror/lib/codemirror.css'
import Element from 'element-ui' import Element from 'element-ui'
import './assets/styles/element-variables.scss' import './assets/styles/element-variables.scss'

View File

@ -66,17 +66,21 @@
</el-form> </el-form>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="findSelectSourceExport" <el-button type="warning" plain icon="el-icon-download" size="mini" @click="findSelectSourceExport"
v-hasPermi="['source:data:export']">导出 v-hasPermi="['source:data:export']">导出
</el-button> </el-button>
<!-- 添加按钮 /--> <!-- 添加按钮 /-->
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['source:data:add']"> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['source:data:add']">
新增 新增
</el-button> </el-button>
<!-- 添加或修改规则引擎对话框 --> <!-- 添加或修改规则引擎对话框 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body> <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
@ -564,8 +568,6 @@ export default {
handleAdd() { handleAdd() {
// this.reset();
this.open = true; this.open = true;
this.title = "添加规则引擎"; this.title = "添加规则引擎";
@ -576,8 +578,6 @@ export default {
handleUpdate(row) { handleUpdate(row) {
// this.reset();
this.form = row; this.form = row;
this.open = true; this.open = true;
@ -673,20 +673,35 @@ export default {
beforeCreate() { beforeCreate() {
}, // - ", }, // - ",
beforeMount() { beforeMount() {
}, // - ", }, // - ",
beforeUpdate() { beforeUpdate() {
}, // - ", }, // - ",
updated() { updated() {
}, // - ", }, // - ",
beforeDestroy() { beforeDestroy() {
}, // - ", }, // - ",
destroyed() { destroyed() {
}, // - ", }, // - ",
activated() { activated() {
} //keep-alive", } //keep-alive",
}; };
</script> </script>
<style scoped> <style scoped>
</style> </style>

View File

@ -2,119 +2,232 @@
<div> <div>
<el-button type="text" @click="dialogFormVisible = true">新增</el-button> <el-button type="text" @click="addVersion()"></el-button>
<el-dialog title="添加版本信息" :visible.sync="dialogFormVisible"> <el-dialog title="添加版本信息" :visible.sync="dialogFormVisible">
<el-form :model="versions"> <el-form :model="versions">
<el-form-item label="版本类名" :label-width="formLabelWidth"> <el-form-item label="版本类名" :label-width="formLabelWidth">
<el-input v-model="versions.versionClass" autocomplete="off"></el-input> <el-input v-model="versions.versionClass" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="版本名称" :label-width="formLabelWidth"> <el-form-item label="版本名称" :label-width="formLabelWidth">
<el-input v-model="versions.name" autocomplete="off"></el-input> <el-input v-model="versions.name" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="版本编码" :label-width="formLabelWidth"> <el-form-item label="版本编码" :label-width="formLabelWidth">
<el-input v-model="versions.versionCode" autocomplete="off"></el-input> <el-input v-model="versions.versionCode" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="是否激活" :label-width="formLabelWidth"> <el-form-item label="是否激活" :label-width="formLabelWidth">
<el-input v-model="versions.isActivate" autocomplete="off"></el-input>
<el-input v-model="versions.isActivate" disabled autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="版本状态" :label-width="formLabelWidth"> <el-form-item label="版本状态" :label-width="formLabelWidth">
<el-input v-model="versions.status" autocomplete="off"></el-input>
<el-input v-model="versions.status" disabled autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="版本测试状态" :label-width="formLabelWidth"> <el-form-item label="是否测试" :label-width="formLabelWidth">
<el-input v-model="versions.testStatus" autocomplete="off"></el-input>
<el-input v-model="versions.testStatus" disabled autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="规则内容" :label-width="formLabelWidth"> <el-form-item label="版本描述" :label-width="formLabelWidth">
<el-input v-model="versions.ruleContent" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="引擎维护编号" :label-width="formLabelWidth">
<el-input v-model="versions.engineMaintenanceId" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="描述" :label-width="formLabelWidth">
<el-input v-model="versions.description" autocomplete="off"></el-input> <el-input v-model="versions.description" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<!-- ref="mycode" :value="curCode" class="code"-->
<codemirror :options="cmOptions" v-show="opens">
</codemirror>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button> <el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click=handleInsert()> </el-button> <el-button type="primary" @click=handleInsert()> </el-button>
<el-button type="primary" @click=showCode()>生成引擎类</el-button>
</div> </div>
</el-dialog> </el-dialog>
<el-table :data="maintenance.engineMaintenanceList" style="width: 100%"> <el-table :data="maintenance.engineMaintenanceList" style="width: 100%">
<el-table-column prop="id" label="编号"></el-table-column>
<el-table-column prop="versionClass" label="版本类名"></el-table-column> <el-table-column prop="versionClass" label="版本类名"></el-table-column>
<el-table-column prop="name" label="版本名称"></el-table-column> <el-table-column prop="name" label="版本名称"></el-table-column>
<el-table-column prop="versionCode" label="版本编码"></el-table-column> <el-table-column prop="versionCode" label="版本编码"></el-table-column>
<el-table-column prop="isActivate" label="是否激活"> <el-table-column prop="isActivate" label="是否激活">
<template v-slot="scope"> <template v-slot="scope">
<span v-if="scope.row.isActivate==1"></span> <span v-if="scope.row.isActivate==1"></span>
<span v-if="scope.row.isActivate==2"></span> <span v-if="scope.row.isActivate==2"></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="status" label="版本状态"> <el-table-column prop="status" label="版本状态">
<template v-slot="scope"> <template v-slot="scope">
<span v-if="scope.row.status===1"></span> <span v-if="scope.row.status===1"></span>
<span v-if="scope.row.status===2"></span> <span v-if="scope.row.status===2"></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="testStatus" label="版本测试状态"> <el-table-column prop="testStatus" label="版本测试状态">
<template v-slot="scope"> <template v-slot="scope">
<span v-if="scope.row.testStatus===1"></span> <span v-if="scope.row.testStatus===1"></span>
<span v-if="scope.row.testStatus===2"></span> <span v-if="scope.row.testStatus===2"></span>
<span v-if="scope.row.testStatus===3"></span> <span v-if="scope.row.testStatus===3"></span>
</template>
</el-table-column>
<el-table-column prop="ruleContent" label="规则内容"></el-table-column>
<el-table-column prop="engineMaintenanceId" label="引擎维护编号"></el-table-column>
<el-table-column prop="description" label="描述"></el-table-column>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="120"> <el-table-column fixed="right" label="操作" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button @click.native.prevent="del(scope.row.id)" type="text" size="small"> <el-button @click.native.prevent="del(scope.row.id)" type="text" size="small">
删除 删除
</el-button> </el-button>
<el-button v-show="scope.row.isActivate==1" @click="forbiddenEngines(scope.row.id)" type="text" size="small"></el-button> <el-button v-show="scope.row.isActivate==1" @click="forbiddenEngines(scope.row.id)" type="text" size="small">
关闭引擎
<el-button v-show="scope.row.isActivate==2" @click="onEngines(scope.row.id)" type="text" size="small"></el-button> </el-button>
<el-button v-show="scope.row.isActivate==2" @click="onEngines(scope.row.id)" type="text" size="small">
开启引擎
</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" width="120"> <el-table-column fixed="right" label="操作" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button @click.native.prevent="selectEngineById(scope.row.id)" type="text" size="small"> <el-button @click.native.prevent="selectEngineById(scope.row.id)" type="text" size="small">
规则详情 规则详情
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!--回显-->
<el-dialog title="收货地址" :visible.sync="versionFormVisible">
<el-form :model="versions">
<el-form-item label="版本类名" :label-width="formLabelWidth">
<el-input v-model="versions.versionClass" disabled autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="版本名称" :label-width="formLabelWidth">
<el-input v-model="versions.name" disabled autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="版本编码" :label-width="formLabelWidth">
<el-input v-model="versions.versionCode" disabled autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="是否激活" :label-width="formLabelWidth">
<el-input v-model="versions.isActivate" disabled autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="版本状态" :label-width="formLabelWidth">
<el-input v-model="versions.status" disabled autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="版本测试" :label-width="formLabelWidth">
<el-input v-model="versions.testStatus" disabled autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="back()"> </el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import {add, dels, findById, forbiddenEngine, onEngine, selectEngineById} from "@/api/engine/engine"; import {add, dels, findById, forbiddenEngine, onEngine, sel, selectEngineById} from "@/api/engine/engine";
import Java from "@/components/JavaIDE.vue/java.vue";
import {codemirror} from 'vue-codemirror'
import "codemirror/theme/ambiance.css"; // theme
require("codemirror/mode/javascript/javascript"); // jsmode
export default { export default {
@ -122,7 +235,10 @@ export default {
//import使" //import使"
components: {}, components: {
codemirror,
Java
},
props: {}, props: {},
@ -133,12 +249,39 @@ export default {
return { return {
direction: 'rtl', direction: 'rtl',
versionFormVisible: false,
maintenance: { maintenance: {
engineMaintenanceList: [], engineMaintenanceList: [],
}, },
opens: false,
javaClass: "package com.muyu.rule.engine.custom;\n" +
"\n" +
"import com.muyu.engine.action.ActionDiscard;\n" +
"import com.muyu.engine.scope.DataModelEngine;\n" +
"\n" +
"/**\n" +
" * @Author: DongZeLiang\n" +
" * @date: 2024/5/6\n" +
" * @Description: 231-231\n" +
" * @Version: 1.0\n" +
" */\n" +
"public class undefined_231 extends DataModelEngine {\n" +
" @Override\n" +
" public void execution () {\n" +
" Object value = getValue();\n" +
"\n" +
" if (value == null || \"\".equals(value) || \"null\".equals(value)) {\n" +
" throw new ActionDiscard();\n" +
" }\n" +
" }\n" +
"}",
title: "", title: "",
open: false, open: false,
@ -147,6 +290,51 @@ export default {
versions: { versions: {
isActivate: '未激活',
testStatus: '未测试',
status: '初始化'
},
cmOptions: {
// autorefresh: true,
// tabSize: 4,
// mode: 'text/x-properties',
// theme: 'ayu-mirage',
// line: true,
// viewportMargin: Infinity, //使
// highlightDifferences: true,
// autofocus: false,
// indentUnit: 2,
// smartIndent: true,
// readOnly: true, //
// showCursorWhenSelecting: true,
// firstLineNumber: 1
lineNumbers: true, //
mode: 'text/x-yaml', // model
gutters: ['CodeMirror-lint-markers'], //
theme: "ambiance",
lint: true, //
}, },
size: '', size: '',
@ -162,18 +350,68 @@ export default {
}, },
methods: { methods: {
selectEngineById,
showCode() {
this.opens = true
this.javaClass;
},
//
addVersion() {
this.versions = {},
this.versions.isActivate = '未激活',
this.versions.testStatus = '未测试',
this.versions.status = '初始化';
this.dialogFormVisible = true
},
back() {
this.versionFormVisible = false;
},
//id
selectEngineById(id) {
this.versionFormVisible = true;
sel(id).then(res => {
this.versions = res.data;
})
},
handleInsert() { handleInsert() {
this.dialogFormVisible = true
this.dialogFormVisible = false;
this.versions.isActivate = 1
this.versions.testStatus = 1
this.versions.status = 1
add(this.versions).then(res => { add(this.versions).then(res => {
this.$modal.msgSuccess(res.msg || "新增成功") this.$modal.msgSuccess(res.msg || "新增成功")
}) })
this.dialogFormVisible=false;
this.List(); this.findById();
}, },
@ -184,7 +422,7 @@ export default {
this.$message.success(res.msg || "开启成功") this.$message.success(res.msg || "开启成功")
}) })
this.List(); this.findById();
}, },
forbiddenEngines(id) { forbiddenEngines(id) {
@ -247,4 +485,16 @@ export default {
<style scoped> <style scoped>
.information-box >>> .CodeMirror {
font-family: monospace;
height: 71vh;
direction: ltr;
}
</style> </style>

View File

@ -2,9 +2,59 @@
<div> <div>
<h1 style="text-align: center; margin-bottom: 30px;">安全设置</h1> <h1 style="text-align: center; margin-bottom: 30px;">安全设置</h1>
<el-divider></el-divider> <el-divider></el-divider>
<label>登录密码</label>
<label>安全性高的密码可以使帐号更安全</label> <div class="container">
<div class="card left-card">
<el-card style="margin-top: 50px;">
<h2>登录密码</h2>
<div class="container">
<label>安全性高的密码可以使帐号更安全.建议你定期更换密码,设置6-20位登录密码</label>
<div class="button-wrapper">
<button @click="openModal"></button> <button @click="openModal"></button>
</div>
</div>
</el-card>
</div>
<div class="card right-card">
<el-card style="margin-top: 50px;">
<h2>手机号码</h2>
<label>安全手机可以用于登录帐号重置密码或其他安全验证</label>
<button @click="openCurrentPhoneModal"></button>
<!-- 输入当前手机号的弹出框 -->
<div v-if="isCurrentPhoneModalVisible" class="modal-overlay">
<div class="modal-content">
<h3>当前手机号</h3>
<div>旧手机号({{ user.phonenumber }})</div>
<button @click="sendVerificationCode"></button>
<button @click="closeCurrentPhoneModal"></button>
</div>
</div>
<!-- 输入验证码的弹出框 -->
<div v-if="isVerificationModalVisible" class="modal-overlay">
<div class="modal-content">
<h3>输入验证码</h3>
<input v-model="code" placeholder="验证码" />
<button @click="verCode"></button>
<button @click="closeVerificationModal"></button>
</div>
</div>
<!-- 输入新手机号的弹出框 -->
<div v-if="isNewPhoneModalVisible" class="modal-overlay">
<div class="modal-content">
<h3>输入新手机号</h3>
<input v-model="newPhone" placeholder="新手机号" />
<button @click="updatePhoneNumber"></button>
<button @click="closeNewPhoneModal"></button>
</div>
</div>
</el-card>
</div>
</div>
<!-- 弹出框 --> <!-- 弹出框 -->
<div v-if="showModal" class="modal"> <div v-if="showModal" class="modal">
@ -47,7 +97,7 @@
<script> <script>
import axios from 'axios'; import axios from 'axios';
import {getUserProfile,sendCode,checkCode} from "@/api/system/user"; import {getUserProfile,sendCode,checkCode,updatePhone} from "@/api/system/user";
import {updateUserPwd} from "@/api/system/user"; import {updateUserPwd} from "@/api/system/user";
export default { export default {
@ -60,6 +110,13 @@ export default {
} }
}; };
return { return {
isVisible: false,
currentPhone: '',
newPhone: '',
verificationCode: '',
isCurrentPhoneModalVisible: false,
isVerificationModalVisible: false,
isNewPhoneModalVisible: false,
// //
rules: { rules: {
oldPassword: [ oldPassword: [
@ -80,6 +137,7 @@ export default {
confirmPassword: undefined confirmPassword: undefined
}, },
showModal: false, showModal: false,
aModel: false,
phonenumber: '', phonenumber: '',
code: '', code: '',
oldPassword: '', oldPassword: '',
@ -92,6 +150,38 @@ export default {
this.getUser(); this.getUser();
}, },
methods: { methods: {
updatePhoneNumber() {
updatePhone(this.newPhone).then(response => {
this.closeNewPhoneModal();
this.$message({
message: '修改成功',
type: 'success'
});
});
},
closeNewPhoneModal() {
this.isNewPhoneModalVisible = false;
},
closeVerificationModal() {
this.isVerificationModalVisible = false;
},
sendVerificationCode() {
try {
sendCode(this.user.phonenumber)
this.closeCurrentPhoneModal();
this.isVerificationModalVisible = true;
alert('验证码已发送');
} catch (error) {
console.error('发送验证码失败', error);
alert('发送验证码失败');
}
},
openCurrentPhoneModal() {
this.isCurrentPhoneModalVisible = true;
},
closeCurrentPhoneModal() {
this.isCurrentPhoneModalVisible = false;
},
getUser() { getUser() {
getUserProfile().then(response => { getUserProfile().then(response => {
this.user = response.data.sysUser; this.user = response.data.sysUser;
@ -123,6 +213,17 @@ export default {
} }
}); });
}, },
async verCode() {
checkCode(this.user.phonenumber, this.code).then(response => {
if (response.code === 200) {
this.closeVerificationModal();
this.isNewPhoneModalVisible = true; //
alert('验证码验证成功');
} else {
alert('验证码验证失败');
}
})
},
async verifyCode() { async verifyCode() {
checkCode(this.user.phonenumber, this.code).then(response => { checkCode(this.user.phonenumber, this.code).then(response => {
if (response.code === 200) { if (response.code === 200) {
@ -135,6 +236,7 @@ export default {
} }
}, },
resetForm() { resetForm() {
this.phonenumber = ''; this.phonenumber = '';
this.code = ''; this.code = '';
@ -160,6 +262,16 @@ export default {
justify-content: center; justify-content: center;
} }
.container {
display: flex;
justify-content: space-between;
}
.button-wrapper {
margin-left: auto; /* 将按钮移动到右侧 */
}
.modal-content { .modal-content {
background: #fff; background: #fff;
padding: 20px; padding: 20px;
@ -186,6 +298,50 @@ input {
border-radius: 4px; border-radius: 4px;
} }
.card {
width: 50%;
padding: 20px;
box-sizing: border-box;
}
.modal {
/* 样式设置 */
}
.modal-content {
/* 样式设置 */
}
.left-card {
background-color: #f1f1f1;
}
.right-card {
background-color: #e1e1e1;
}
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
}
.modal-content {
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
button { button {
margin-top: 20px; margin-top: 20px;
padding: 10px 15px; padding: 10px 15px;