Commit 5f063afd authored by 张俊's avatar 张俊
parents 77b323c0 07cf72aa
...@@ -98,7 +98,7 @@ export default { ...@@ -98,7 +98,7 @@ export default {
}, },
userInfo: { userInfo: {
handler() { handler() {
this.initMsg(); // this.initMsg();
}, },
deep: true, deep: true,
}, },
...@@ -126,6 +126,8 @@ export default { ...@@ -126,6 +126,8 @@ export default {
this.readFlag = !this.readFlag; this.readFlag = !this.readFlag;
}, },
initMsg() { initMsg() {
console.log(this.userInfo);
console.log(this.$trace);
if (this.userInfo && this.userInfo.system_id) { if (this.userInfo && this.userInfo.system_id) {
this.$trace.setOptionValue("userId", this.userInfo.system_id); this.$trace.setOptionValue("userId", this.userInfo.system_id);
// this.$trace.setOptionValue('userType',this.userInfo.userType) // this.$trace.setOptionValue('userType',this.userInfo.userType)
......
...@@ -2,20 +2,22 @@ ...@@ -2,20 +2,22 @@
<div class="login-by-account"> <div class="login-by-account">
<el-form ref="loginFormRef" label-position="top" :model="loginForm" :rules="steploginFormRules"> <el-form ref="loginFormRef" label-position="top" :model="loginForm" :rules="steploginFormRules">
<el-form-item prop="userid"> <el-form-item prop="userid">
<el-input v-model="loginForm.userid" placeholder="请输入账号" @keyup.enter.native="loginAction()" /> <el-input v-model="loginForm.userid" placeholder="请输入账号" @keyup.enter="loginAction()" />
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input <el-input
:type="hidePassword ? 'password' : 'text'" :type="hidePassword ? 'password' : 'text'"
v-model="loginForm.password" v-model="loginForm.password"
placeholder="请输入密码" placeholder="请输入密码"
@keyup.enter.native="loginAction()"> @keyup.enter="loginAction()">
<span <template #suffix>
slot="suffix" <span :title="!hidePassword ? '隐藏密码' : '显示密码'">
:title="hidePassword ? '显示密码' : '隐藏密码'" <bg-icon
:class="hidePassword ? 'hide-password' : 'show-password'" @click="hidePassword = !hidePassword"
@click="hidePassword = !hidePassword" style="font-size: 16px; color: #a9b1c7; cursor: pointer"
style="cursor: pointer"></span> :icon="hidePassword ? '#bg-ic-eye' : '#bg-ic-eye-close'"></bg-icon>
</span>
</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="yzm"> <el-form-item prop="yzm">
...@@ -23,7 +25,7 @@ ...@@ -23,7 +25,7 @@
<el-input <el-input
v-model="loginForm.yzm" v-model="loginForm.yzm"
placeholder="请输入验证码" placeholder="请输入验证码"
@keyup.enter.native="loginAction()" @keyup.enter="loginAction()"
style="width: 240px" /> style="width: 240px" />
<div class="yzm_img"> <div class="yzm_img">
<img title="看不清?换一张" :src="imgSrc" @click="getImg()" style="width: 100%" /> <img title="看不清?换一张" :src="imgSrc" @click="getImg()" style="width: 100%" />
...@@ -57,6 +59,9 @@ import { ElMessage } from "element-plus"; ...@@ -57,6 +59,9 @@ import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { Encrypt } from "@/services/secret.js"; import { Encrypt } from "@/services/secret.js";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { useRouter } from "vue-router";
const router = useRouter();
const state = reactive({ const state = reactive({
loginForm: { loginForm: {
...@@ -125,7 +130,7 @@ const getMenu = (search) => { ...@@ -125,7 +130,7 @@ const getMenu = (search) => {
return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`); return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`);
}; };
const getUser = () => { const getUser = () => {
Promise.all([getUserInfo(), getMenu("dadb2d3f-e263-48d1-9389-42acb9ea49f8")]).then((res) => { Promise.all([getUserInfo(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")]).then((res) => {
if (res[0].data.code == 200 && res[1].data.code == 200) { if (res[0].data.code == 200 && res[1].data.code == 200) {
let data = (res[1].data.data && res[1].data.data[0].children) || []; let data = (res[1].data.data && res[1].data.data[0].children) || [];
store.commit("setUserInfo", res[0].data.data); store.commit("setUserInfo", res[0].data.data);
...@@ -143,9 +148,7 @@ const getUser = () => { ...@@ -143,9 +148,7 @@ const getUser = () => {
store.commit("setMenuObj", menuObj); store.commit("setMenuObj", menuObj);
// } // }
generateRoutes(); generateRoutes();
// this.$router.push("/"); router.push("/");
//跳转到工作台页面
window.location.href = "/apaas/portal/ui/#/";
} }
}); });
}; };
......
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
v-model="loginForm.mobile" v-model="loginForm.mobile"
autofocus="autofocus" autofocus="autofocus"
placeholder="请输入手机号码" placeholder="请输入手机号码"
@keyup.enter.native="loginAction()" /> @keyup.enter="loginAction()" />
</el-form-item> </el-form-item>
<el-form-item prop="code"> <el-form-item prop="code">
<div class="msg-code"> <div class="msg-code">
<el-input <el-input
v-model="loginForm.code" v-model="loginForm.code"
placeholder="请输入验证码" placeholder="请输入验证码"
@keyup.enter.native="loginAction()" @keyup.enter="loginAction()"
style="width: 280px"> style="width: 280px">
</el-input> </el-input>
<div class="yzm_img"> <div class="yzm_img">
...@@ -34,9 +34,7 @@ ...@@ -34,9 +34,7 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click.prevent="loginAction()" style="width: 100%"> <el-button type="primary" @click.prevent="loginAction()" style="width: 100%"> 登 录 </el-button>
登 录
</el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button class="register_btn" @click.prevent="$emit('register')" style="width: 100%"> <el-button class="register_btn" @click.prevent="$emit('register')" style="width: 100%">
...@@ -58,6 +56,9 @@ import { generateRoutes } from "../router/index"; ...@@ -58,6 +56,9 @@ import { generateRoutes } from "../router/index";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { useRouter } from "vue-router";
const router = useRouter();
const validatePhone = (rule, value, callback) => { const validatePhone = (rule, value, callback) => {
const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/; const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
...@@ -93,15 +94,13 @@ const loginFormRef = ref(null); ...@@ -93,15 +94,13 @@ const loginFormRef = ref(null);
const getMsgCode = () => { const getMsgCode = () => {
loginFormRef.value.validateField("mobile", (valid) => { loginFormRef.value.validateField("mobile", (valid) => {
if (valid) { if (valid) {
axios axios.post("/apaas/system/v5/sms/verifyCode", { phone: state.loginForm.mobile }).then(({ data }) => {
.post("/apaas/system/v5/sms/verifyCode", { phone: state.loginForm.mobile }) if (data.code == 200) {
.then(({ data }) => { countDownAction();
if (data.code == 200) { } else {
countDownAction(); ElMessage.error(data.data);
} else { }
ElMessage.error(data.data); });
}
});
} }
}); });
}; // 获取验证码 }; // 获取验证码
...@@ -149,7 +148,7 @@ const getMenu = (search) => { ...@@ -149,7 +148,7 @@ const getMenu = (search) => {
return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`); return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`);
}; };
const getUser = () => { const getUser = () => {
Promise.all([getUserInfo(), getMenu("dadb2d3f-e263-48d1-9389-42acb9ea49f8")]).then((res) => { Promise.all([getUserInfo(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")]).then((res) => {
if (res[0].data.code == 200 && res[1].data.code == 200) { if (res[0].data.code == 200 && res[1].data.code == 200) {
let data = (res[1].data.data && res[1].data.data[0].children) || []; let data = (res[1].data.data && res[1].data.data[0].children) || [];
store.commit("setUserInfo", res[0].data.data); store.commit("setUserInfo", res[0].data.data);
...@@ -167,9 +166,7 @@ const getUser = () => { ...@@ -167,9 +166,7 @@ const getUser = () => {
store.commit("setMenuObj", menuObj); store.commit("setMenuObj", menuObj);
// } // }
generateRoutes(); generateRoutes();
// this.$router.push("/"); router.push("/");
//跳转到工作台页面
window.location.href = "/apaas/portal/ui/#/";
} }
}); });
}; };
......
...@@ -12,7 +12,7 @@ import * as ElementPlusIconsVue from "@element-plus/icons-vue"; ...@@ -12,7 +12,7 @@ import * as ElementPlusIconsVue from "@element-plus/icons-vue";
import bgui from "@/bg-ui"; import bgui from "@/bg-ui";
import "@/bg-ui/index.scss"; import "@/bg-ui/index.scss";
import "./assets/css/common.scss" import "./assets/css/common.scss";
import msgSdk from "./msg-sdk/index.js"; import msgSdk from "./msg-sdk/index.js";
...@@ -109,13 +109,7 @@ Promise.all([getUser(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")]) ...@@ -109,13 +109,7 @@ Promise.all([getUser(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")])
console.error(e); console.error(e);
}) })
.finally(() => { .finally(() => {
createVue createVue.use(ElementPlus, { locale }).use(store).use(router).use(i18n).use(bgui).use(mavonEditor);
.use(ElementPlus, { locale })
.use(store)
.use(router)
.use(i18n)
.use(bgui)
.use(mavonEditor);
createVue.mount("#app"); createVue.mount("#app");
}); });
......
...@@ -25,22 +25,15 @@ ...@@ -25,22 +25,15 @@
</div> </div>
<div class="flex_right"> <div class="flex_right">
<div class="main_container"> <div class="main_container">
<bg-filter-group <bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字">
@search="changeSearch" <template v-slot:left_action v-if="nodeClassifyId != '263758a4-0349-4d49-a816-e8ff8d33a8bb'">
v-model="filter.search"
placeholder="请输入关键字">
<template
v-slot:left_action
v-if="nodeClassifyId != '263758a4-0349-4d49-a816-e8ff8d33a8bb'">
<div class="apaas_button"> <div class="apaas_button">
<el-button type="primary" @click="backDict" v-if="dictLevel != 1"> <el-button type="primary" @click="backDict" v-if="dictLevel != 1">
<!-- <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> --> <!-- <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> -->
返回上级 返回上级
</el-button> </el-button>
<el-button type="primary" @click="register"> <el-button type="primary" @click="register">
<bg-icon <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
style="font-size: 12px; color: #fff; margin-right: 8px"
icon="#bg-ic-add"></bg-icon>
新增 新增
</el-button> </el-button>
</div> </div>
...@@ -67,12 +60,7 @@ ...@@ -67,12 +60,7 @@
</bg-filter-group> </bg-filter-group>
<div class="table_container"> <div class="table_container">
<div class="table bg-scroll"> <div class="table bg-scroll">
<bg-table <bg-table ref="bgTable" :headers="headers" :rows="tableRows" :isIndex="true" :stripe="true">
ref="bgTable"
:headers="headers"
:rows="tableRows"
:isIndex="true"
:stripe="true">
<template v-slot:name="{ row }"> <template v-slot:name="{ row }">
<span class="can_click_text" @click="getChildren(row)" v-if="row.children"> <span class="can_click_text" @click="getChildren(row)" v-if="row.children">
{{ row.name }} {{ row.name }}
...@@ -93,33 +81,17 @@ ...@@ -93,33 +81,17 @@
</template> </template>
<template v-slot:action="{ row }"> <template v-slot:action="{ row }">
<!-- 除技术类型之外的字典可以删除 --> <!-- 除技术类型之外的字典可以删除 -->
<bg-table-btns2 <bg-table-btns2 :limit="3" v-if="nodeClassifyId !== '263758a4-0349-4d49-a816-e8ff8d33a8bb'">
:limit="3" <bg-table-btn @click="edit_row(row)" :disabled="row.state == 1">编辑</bg-table-btn>
v-if="nodeClassifyId !== '263758a4-0349-4d49-a816-e8ff8d33a8bb'"> <bg-table-btn @click="delete_row(row)" :disabled="row.state == 1">删除</bg-table-btn>
<bg-table-btn @click="edit_row(row)" :disabled="row.state == 1" <bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp">上移</bg-table-btn>
>编辑</bg-table-btn <bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown">下移</bg-table-btn>
>
<bg-table-btn @click="delete_row(row)" :disabled="row.state == 1"
>删除</bg-table-btn
>
<bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp"
>上移</bg-table-btn
>
<bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown"
>下移</bg-table-btn
>
</bg-table-btns2> </bg-table-btns2>
<!-- 技术类型字典不可删除 --> <!-- 技术类型字典不可删除 -->
<bg-table-btns2 :limit="3" v-else> <bg-table-btns2 :limit="3" v-else>
<bg-table-btn @click="edit_row(row)" :disabled="row.state == 1" <bg-table-btn @click="edit_row(row)" :disabled="row.state == 1">编辑</bg-table-btn>
>编辑</bg-table-btn <bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp">上移</bg-table-btn>
> <bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown">下移</bg-table-btn>
<bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp"
>上移</bg-table-btn
>
<bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown"
>下移</bg-table-btn
>
</bg-table-btns2> </bg-table-btns2>
</template> </template>
</bg-table> </bg-table>
...@@ -136,11 +108,7 @@ ...@@ -136,11 +108,7 @@
</div> </div>
</div> </div>
<!-- 新增/编辑弹窗 --> <!-- 新增/编辑弹窗 -->
<el-dialog <el-dialog class="dialog_box" :title="addType == 1 ? '新增' : '编辑'" v-model="addDialog" width="758px">
class="dialog_box"
:title="addType == 1 ? '新增' : '编辑'"
v-model="addDialog"
width="758px">
<el-form ref="bgForm" :model="formData" :rules="rules" label-width="80px" class="bg_form"> <el-form ref="bgForm" :model="formData" :rules="rules" label-width="80px" class="bg_form">
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input <el-input
...@@ -208,11 +176,12 @@ ...@@ -208,11 +176,12 @@
</template> </template>
<script setup> <script setup>
import { reactive, ref, onBeforeMount, toRefs, computed, watch, nextTick, watchEffect } from "vue"; import { reactive, ref, onBeforeMount, toRefs, computed, nextTick } from "vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "../../../../request/http.js";
import { Search } from "@element-plus/icons-vue"; import { Search } from "@element-plus/icons-vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import axios from "../../../../request/http.js";
const bgForm = ref(null); const bgForm = ref(null);
const headers = computed(() => { const headers = computed(() => {
......
...@@ -28,10 +28,7 @@ ...@@ -28,10 +28,7 @@
<el-input disabled v-model="authorizeFormData.system_version" /> <el-input disabled v-model="authorizeFormData.system_version" />
</el-form-item> </el-form-item>
<el-form-item label="User" prop="system_user"> <el-form-item label="User" prop="system_user">
<el-input <el-input placeholder="统一管理用户认证平台" v-model="authorizeFormData.system_user" maxlength="30" />
placeholder="统一管理用户认证平台"
v-model="authorizeFormData.system_user"
maxlength="30" />
</el-form-item> </el-form-item>
<el-form-item label="Key" prop="license"> <el-form-item label="Key" prop="license">
<el-input <el-input
...@@ -45,15 +42,12 @@ ...@@ -45,15 +42,12 @@
<el-input disabled v-model="authorizeFormData.license_dead_date" /> <el-input disabled v-model="authorizeFormData.license_dead_date" />
</el-form-item> </el-form-item>
<el-form-item label="剩余有效期提醒" prop="license_inform_day"> <el-form-item label="剩余有效期提醒" prop="license_inform_day">
<el-input <el-input placeholder="请输入" v-model.trim.number="authorizeFormData.license_inform_day">
placeholder="请输入"
v-model.trim.number="authorizeFormData.license_inform_day">
<template #append></template> <template #append></template>
</el-input> </el-input>
<el-tooltip placement="top-start" effect="light"> <el-tooltip placement="top-start" effect="light">
<template #content> <template #content>
范围(0~90),单位:天, 范围(0~90),单位:天, 当剩余有效期在配置区间内时,系统会在用户登录系统时发出提醒,0表示不提醒
当剩余有效期在配置区间内时,系统会在用户登录系统时发出提醒,0表示不提醒
</template> </template>
<div class="tip-image"></div> <div class="tip-image"></div>
</el-tooltip> </el-tooltip>
...@@ -97,19 +91,14 @@ ...@@ -97,19 +91,14 @@
</el-form-item> </el-form-item>
</div> </div>
<el-form-item label="密码有效期" prop="pwd_validity"> <el-form-item label="密码有效期" prop="pwd_validity">
<el-input <el-input placeholder="请输入" v-model.trim.number="secureFormData.pwd_validity" maxlength="3">
placeholder="请输入"
v-model.trim.number="secureFormData.pwd_validity"
maxlength="3">
<template #append></template> <template #append></template>
</el-input> </el-input>
<el-tooltip placement="top-start" effect="light"> <el-tooltip placement="top-start" effect="light">
<template #content> <template #content>
<span>单位,天</span> <span>单位,天</span>
<br /> <br />
<span <span>密码有效期是指强制修改密码的周期,例如60天表示用户需要每60天修改一次密码。</span>
>密码有效期是指强制修改密码的周期,例如60天表示用户需要每60天修改一次密码。</span
>
<br /> <br />
<span>若配置为0,表示密码有效期为永久</span> <span>若配置为0,表示密码有效期为永久</span>
</template> </template>
...@@ -122,7 +111,7 @@ ...@@ -122,7 +111,7 @@
</el-input> </el-input>
<el-tooltip placement="top-start" effect="light"> <el-tooltip placement="top-start" effect="light">
<template #content> <template #content>
<span>{{`范围(10~${session_validity_max})`}}</span> <span>{{ `范围(10~${session_validity_max})` }}</span>
<br /> <br />
<span>单位,分钟</span> <span>单位,分钟</span>
<br /> <br />
...@@ -242,9 +231,7 @@ const state = reactive({ ...@@ -242,9 +231,7 @@ const state = reactive({
}, },
//授权表单校验规则 //授权表单校验规则
authorizeRules: { authorizeRules: {
license_inform_day: [ license_inform_day: [{ type: "number", min: 0, max: 90, message: "请输入0~90的整数", trigger: "blur" }],
{ type: "number", min: 0, max: 90, message: "请输入0~90的整数", trigger: "blur" },
],
}, },
//安全相关信息表单 //安全相关信息表单
......
This diff is collapsed.
<template>
<div>日志管理</div>
</template>
<script setup></script>
<style lang="scss" scoped></style>
<template>
<div class="detail_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="flex_row">
<div class="flex_left">
<div class="box">
<el-date-picker
style="width: 100%"
type="date"
value-format="YYYY-MM-DD"
v-model="date"
placeholder="请选择日期" />
<div class="type_station bg-scroll">
<div
class="type-box"
:class="{ 'current-type': selectedNodeContainer == item.value }"
@click="nodeClick(item)"
v-for="(item, index) in containerList"
:key="index"
:title="item.name">
{{ item.name }}
</div>
</div>
</div>
</div>
<div class="flex_right">
<div class="form-filter">
<el-form :model="filterForm" inline>
<el-form-item label="级别">
<el-select placeholder="全部" style="width: 160px" v-model="filterForm.level">
<el-option label="info" value="info"> </el-option>
<el-option label="warning" value="warning"> </el-option>
<el-option label="error" value="error"> </el-option>
</el-select>
</el-form-item>
<el-form-item label="关键字">
<el-input
placeholder="请输入"
maxlength="100"
style="width: 240px"
v-model="filterForm.search"></el-input>
</el-form-item>
</el-form>
<div class="operate_btns">
<el-button type="primary" @click="search"> 查询 </el-button>
<el-button type="default" @click="reset"> 重置 </el-button>
</div>
</div>
<div class="search-result">
<div class="item-container apaas_scroll">
<p v-for="(item, index) in logList" :key="index">{{ item }}</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, watch, onBeforeMount, toRefs } from "vue";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const state = reactive({
date: "",
containerList: [], // 容器数据
selectedNodeContainer: "",
filterForm: {
level: "",
search: "",
},
logList: [],
});
watch(
() => state.date,
(val) => {
state.selectedNodeContainer = "";
getContainerList();
}
);
const nodeClick = (item) => {
state.selectedNodeContainer = item.value;
reset();
};
// 获取容器列表
const getContainerList = () => {
let params = {
date: state.date,
};
axios
.get("/apaas/system/v5/log/system/tree", { params })
.then((res) => {
if (res.data.code == 200) {
state.containerList = res.data.data || [];
state.selectedNodeContainer = state.containerList.length ? state.containerList[0].value : "";
state.selectedNodeContainer ? reset() : (state.logList = []);
} else {
ElMessage.error(res.data.data);
}
})
.catch((err) => {
console.error(err);
});
};
//查询
const search = () => {
let params = {
index: state.selectedNodeContainer,
...state.filterForm,
};
axios
.get("/apaas/system/v5/log/system/log", { params })
.then((res) => {
if (res.data.code == 200) {
state.logList = (res.data.data || []).map((item) => JSON.stringify(item));
state.logList = state.logList.concat(state.logList);
} else {
ElMessage.error(res.data.data);
}
})
.catch((err) => {
console.error(err);
});
};
//重置
const reset = () => {
state.filterForm = {
level: "",
search: "",
};
search();
};
onBeforeMount(() => {
getContainerList();
});
const { date, containerList, selectedNodeContainer, filterForm, logList } = toRefs(state);
</script>
<style lang="scss" scoped>
.detail_container {
width: 100%;
height: calc(100vh - 56px);
padding: 0 24px;
min-height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
.flex_row {
// flex-grow: 1;
width: 100%;
display: flex;
margin-bottom: 16px;
position: relative;
height: calc(100% - 62px);
.flex_left {
width: 240px;
background-color: #fff;
margin-right: 16px;
border-radius: 6px;
padding: 16px;
height: 100%;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
overflow: hidden;
.box {
width: 208px;
height: 100%;
overflow: hidden;
.type_station {
width: 100%;
margin-top: 16px;
height: calc(100% - 50px);
.type-box {
overflow: hidden;
text-overflow: ellipsis;
height: 32px;
white-space: nowrap;
line-height: 32px;
text-align: center;
font-size: 14px;
color: #404a62;
cursor: pointer;
&:hover {
background-color: #f2f3f7;
}
}
.current-type {
background-color: #f2f3f7;
border-radius: 4px;
}
}
}
}
.flex_right {
flex: 1;
height: 100%;
.form-filter {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
height: 68px;
width: 100%;
padding: 16px 16px 16px 24px;
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
.el-form {
width: calc(100% - 144px);
}
.el-form-item {
margin-bottom: 0px;
}
.operate_btns {
width: 144px;
}
}
.search-result {
width: 100%;
height: calc(100% - 84px);
padding: 15px 0;
color: #fff;
background-color: #1a1a1a;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
.item-container {
overflow: auto;
padding: 0 15px;
height: 100%;
}
p {
word-wrap: break-word;
word-break: break-all;
}
}
}
}
}
</style>
This diff is collapsed.
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="page_content">
<bg-form-gap title="详情"></bg-form-gap>
<bg-detail-table2 class="detail_info" :list="instanceData.detailInfo">
<template #req_url_value="{ data }">
<el-popover placement="top-start" :width="600" trigger="hover" :content="data.value">
<template #reference>
<p class="show_in_line">{{ data.value }}</p>
</template>
</el-popover>
</template>
<template #res_fields_value="{ data }">
<el-popover placement="bottom-start" :width="800" trigger="hover" :content="data.value">
<template #reference>
<p class="show_in_line">{{ data.value }}</p>
</template>
</el-popover>
</template>
</bg-detail-table2>
</div>
</div>
</template>
<script setup>
import { reactive, onBeforeMount } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import { useRoute } from "vue-router";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
const route = useRoute();
const instanceData = reactive({
detailInfo: [
{
key: "system_account",
label: "账号",
value: "",
// slot: "approvalStatus",
},
{
key: "phone",
label: "手机号",
value: "",
},
{
key: "user_type",
label: "用户类型",
value: "",
},
{
key: "org_name",
label: "所属组织",
value: "",
},
{
key: "system_module",
label: "系统模块",
value: "",
},
{
key: "created_time",
label: "操作时间",
value: "",
},
{
key: "operate_type",
label: "操作类型",
value: "",
},
{
key: "req_method_str",
label: "请求方式",
value: "",
},
{
key: "operate_status_str",
label: "操作状态",
value: "",
},
{
key: "operate_ip",
label: "操作地址",
value: "",
},
{
key: "operate_addr",
label: "操作地点",
value: "",
width: "100%",
},
{
key: "req_url",
label: "请求地址",
value: "",
width: "100%",
childSlot: "req_url_value",
},
{
key: "req_param",
label: "请求参数",
value: "",
},
{
key: "operate_method",
label: "操作方法",
value: "",
},
{
key: "res_fields",
label: "返回参数",
value: "",
childSlot: "res_fields_value",
},
],
});
onBeforeMount(() => {
getDetailInfo();
});
const getDetailInfo = () => {
axios
.get(`/apaas/system/v5/log/userBehavior/detail/${route.query.id}`)
.then((res) => {
if (res.data.code == 200) {
const result = res.data.data || {};
instanceData.detailInfo.forEach((item) => {
item.value = result[item.key];
});
} else {
ElMessage.error(res.data.data);
}
})
.catch((err) => {
ElMessage.error(err);
});
};
</script>
<style lang="scss" scoped>
.page_content {
position: relative;
padding: 24px 0 68px 24px;
.detail_info,
.approve_info {
margin-bottom: 24px;
width: 960px;
}
.show_in_line {
overflow: hidden;
width: 824px;
text-overflow: ellipsis;
white-space: nowrap;
}
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<el-form
ref="authorizeFormRef"
:model="authorizeFormData"
:rules="authorizeRules"
label-width="110px"
class="authorizeForm">
<el-form-item label="当前版本号" prop="system_version">
<el-input disabled v-model="authorizeFormData.system_version" />
</el-form-item>
<el-form-item label="User" prop="system_user">
<el-input placeholder="统一管理用户认证平台" v-model="authorizeFormData.system_user" maxlength="30" />
</el-form-item>
<el-form-item label="Key" prop="license">
<el-input
placeholder="请输入"
rows="5"
v-model="authorizeFormData.license"
type="textarea"
@blur="getLicenseInfo" />
</el-form-item>
<el-form-item label="有效期至" prop="license_dead_date">
<el-input disabled v-model="authorizeFormData.license_dead_date" />
</el-form-item>
<el-form-item label="剩余有效期提醒" prop="license_inform_day">
<el-input placeholder="请输入" v-model.trim.number="authorizeFormData.license_inform_day">
<template #append></template>
</el-input>
<el-tooltip placement="top-start" effect="light">
<template #content>
范围(0~90),单位:天, 当剩余有效期在配置区间内时,系统会在用户登录系统时发出提醒,0表示不提醒
</template>
<div class="tip-image"></div>
</el-tooltip>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, toRefs } from "vue";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
const props = defineProps({
authorizeFormData: {
type: Object,
default: () => ({}),
},
});
const state = reactive({
authorizeRules: {
license_inform_day: [{ type: "number", min: 0, max: 90, message: "请输入0~90的整数", trigger: "blur" }],
},
});
//根据license获取授权信息
const getLicenseInfo = () => {
if (!state.authorizeFormData.license) return;
axios
.post("/apaas/system/v5/sysOptions/getLicenseInfo", {
license: state.authorizeFormData.license,
})
.then((res) => {
if (res.data.code == 200) {
const data = res.data.data || {};
state.authorizeFormData.system_version = data.version;
state.authorizeFormData.license_dead_date = data.deadDate;
} else {
ElMessage.error(res.data.data);
}
});
};
const { authorizeRules } = toRefs(state);
</script>
<template> <template>
<div>首选项配置</div> <div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="parent_container">
<div class="left_container bgc_white">
<el-menu default-active="1" @select="switchMenu">
<el-menu-item index="1">
<span>license授权</span>
</el-menu-item>
<el-menu-item index="2">
<span>登录页管理</span>
</el-menu-item>
<el-menu-item index="3">
<span>安全相关</span>
</el-menu-item>
<el-menu-item index="4">
<span>登录注册配置</span>
</el-menu-item>
</el-menu>
</div>
<div class="right_container bgc_white">
<!-- license授权表单 -->
<authorityForm v-if="activeIndex == 1" :authorizeFormData="authorizeFormData"></authorityForm>
<loginPageForm v-if="activeIndex == 2" :loginPageFormData="loginPageFormData"></loginPageForm>
<!-- 安全相关表单 -->
<secureForm v-if="activeIndex == 3" :secureFormData="secureFormData"></secureForm>
<!-- 登录注册配置表单 -->
<registerForm v-if="activeIndex == 4" :registerFormData="registerFormData"></registerForm>
<div class="operate_btns">
<el-button type="primary" @click="save"> 保存 </el-button>
</div>
</div>
</div>
<el-dialog class="dialog_box" title="提示" v-model="restoreDialog" width="420px">
<div>该操作将还原所有锁定账号和输错次数,是否继续?</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button type="default" @click="restoreDialog = false">取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup></script> <script setup>
import { reactive, toRefs, onBeforeMount, ref } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import { ElMessage } from "element-plus";
import authorityForm from "./authorityForm.vue";
import loginPageForm from "./loginPageForm.vue";
import secureForm from "./secureForm.vue";
import registerForm from "./registerForm.vue";
import axios from "@/request/http.js";
const authorizeFormRef = ref(null);
const secureFormRef = ref(null);
const registerFormRef = ref(null);
const state = reactive({
//授权信息表单
authorizeFormData: {
id: "",
system_version: "",
system_user: "",
license: "",
license_dead_date: "",
license_inform_day: "",
},
//登录页表单
loginPageFormData: {
logoUrl: [],
backgroundUrl: [],
patent: "",
icpFiling: "",
icpUrl: "",
publicSecurityFiling: "",
publicSecurityUrl: "",
legalStatementUrl: "",
privacyPolicyUrl: "",
},
//安全相关信息表单
secureFormData: {
id: "",
min_pwd_level: "",
force_update_state: 0,
pwd_validity: "",
session_validity: "",
access_rule_state: "",
},
//登录注册配置表单
registerFormData: {
id: "",
login_config_state: 0,
login_limit_time: "",
login_pwd_error: "",
login_lock_time: "",
register_config_state: 0,
},
//选中项索引
activeIndex: 1,
restoreDialog: false,
});
const { authorizeFormData, loginPageFormData, secureFormData, registerFormData, activeIndex, restoreDialog } =
toRefs(state);
onBeforeMount(() => {
getPreferenceConfig();
});
//切换菜单选项
const switchMenu = (index) => {
state.activeIndex = index;
};
//获取首选项配置
const getPreferenceConfig = () => {
axios.get("/apaas/system/v5/sysOptions").then((res) => {
if (res.data.code == 200) {
let data = res.data.data;
Object.keys(state.authorizeFormData).forEach((item) => {
state.authorizeFormData[item] = data[item];
});
Object.keys(state.secureFormData).forEach((item) => {
state.secureFormData[item] = data[item];
});
Object.keys(state.registerFormData).forEach((item) => {
state.registerFormData[item] = data[item];
});
} else {
ElMessage.error(res.data.data);
}
});
};
//保存表单项
const save = () => {
let params = {};
if (state.activeIndex == 1) {
authorizeFormRef.value.validate((valid) => {
if (valid) {
params = {
...state.authorizeFormData,
};
postData("/apaas/system/v5/sysOptions/licenseOpts", params);
}
});
} else if (state.activeIndex == 2) {
secureFormRef.value.validate((valid) => {
if (valid) {
params = {
...state.secureFormData,
};
postData("/apaas/system/v5/sysOptions/safeOpts", params);
}
});
} else {
registerFormRef.value.validate((valid) => {
if (valid) {
params = {
...state.registerFormData,
};
if (params.login_config_state == 0) {
params.login_limit_time = 0;
params.login_pwd_error = 0;
params.login_lock_time = 0;
}
postData("/apaas/system/v5/sysOptions/loginOpts", params);
}
});
}
};
// 请求接口发送消息
const postData = (url, params) => {
axios.post(url, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
} else {
ElMessage.error(res.data.data);
}
});
};
const confirm = () => {
axios.post(`/apaas/system/v5/sysOptions/reStartConfig`).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
state.restoreDialog = false;
} else {
ElMessage.error(res.data.data);
}
});
};
</script>
<style lang="scss" scoped>
.parent_container {
display: flex;
justify-content: space-between;
height: calc(100% - 46px - 20px);
.left_container {
width: 240px;
height: 100%;
padding: 24px 16px 0;
.el-menu {
border: none;
.el-menu-item {
justify-content: center;
height: 36px;
color: #404a62 !important;
&.is-active,
&:hover {
background-color: #f2f3f7;
border-radius: 4px;
}
}
}
}
.right_container {
position: relative;
width: calc(100% - 250px);
min-width: 852px;
height: 100%;
padding: 32px 0 68px 24px;
margin-left: 16px;
.authorizeForm,
.secureForm,
.registerForm {
:deep() .el-form-item {
margin-bottom: 24px;
width: 54%;
min-width: 580px;
font-size: 14px;
.el-form-item__label,
.el-radio__label {
color: var(--el-text-color-primary);
}
.el-select {
width: 100%;
}
.el-input-group__append {
width: 60px;
color: #404a62;
border-radius: 0 6px 6px 0;
background: #f7f7f9;
}
}
}
:deep() .secureForm {
.passwordItem {
display: flex;
align-items: center;
.el-form-item:nth-of-type(1) {
flex-shrink: 0;
margin-right: 56px;
}
.el-form-item:nth-of-type(2) {
min-width: auto;
}
}
}
:deep() .registerForm {
.input_password_config {
position: relative;
display: flex;
align-items: center;
width: 798px;
margin-bottom: 24px;
font-size: 14px;
color: var(--el-text-color-primary);
.el-form-item {
margin: 0px 8px;
min-width: auto;
&:nth-of-type(1),
&:nth-of-type(3) {
flex: 0;
min-width: 110px;
width: 120px;
}
&:nth-of-type(2) {
flex: 0;
min-width: 140px;
width: 150px;
}
}
.el-button {
margin-left: 18px;
}
}
.el-radio {
margin-right: 54px;
}
}
<style lang="scss" scoped></style> .operate_btns {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 68px;
padding-right: 16px;
line-height: 68px;
text-align: right;
border-top: solid 1px #e6e9ef;
.el-button {
width: 92px;
}
}
}
}
</style>
<template>
<div class="form_content apaas_scroll_nor">
<el-form
ref="loginPageRef"
:model="loginPageFormData"
:rules="loginPageRules"
label-width="96px"
class="registerForm">
<el-form-item label="LOGO" prop="logoUrl">
<bg-upload-image
v-model="loginPageFormData.logoUrl"
:showTips="true"
customTips="请选择图片上传:支持jpg、png等格式,图片需小于500KB"
:fileSize="500"
:fileSizeUnit="'KB'"
:limit="1"
listType="picture-card"
@change="changeLogo"
:accept="['.jpg', '.jpeg', '.png']"></bg-upload-image>
</el-form-item>
<el-form-item label="登录背景图" prop="backgroundUrl">
<bg-upload-image
v-model="loginPageFormData.backgroundUrl"
:fileSize="2"
:showTips="true"
customTips="请选择图片上传:大小1920 * 1026像素支持jpg、png等格式,图片需小于2MB"
:limit="1"
listType="picture-card"
@change="changeBanner"
:accept="['.jpg', '.jpeg', '.png']"></bg-upload-image>
</el-form-item>
<bg-form-gap title="底部所有权内容"></bg-form-gap>
<el-form-item label="内容" prop="patent">
<el-input
v-model.trim="loginPageFormData.patent"
placeholder="例如:Copyright © 某某大数据, All Rights Reserved."></el-input>
</el-form-item>
<bg-form-gap title="底部ICP备案"></bg-form-gap>
<el-form-item label="内容" prop="icpFiling">
<el-input placeholder="请输入" v-model.trim="loginPageFormData.icpFiling"></el-input>
</el-form-item>
<el-form-item label="跳转连接" prop="icpUrl">
<el-input placeholder="例如:https://...或http://..." v-model.trim="loginPageFormData.icpUrl"></el-input>
</el-form-item>
<bg-form-gap title="底部公安网备案"></bg-form-gap>
<el-form-item label="内容" prop="publicSecurityFiling">
<el-input placeholder="请输入" v-model.trim="loginPageFormData.publicSecurityFiling"></el-input>
</el-form-item>
<el-form-item label="跳转连接" prop="publicSecurityUrl">
<el-input
placeholder="例如:https://...或http://..."
v-model.trim="loginPageFormData.publicSecurityUrl"></el-input>
</el-form-item>
<bg-form-gap title="法律声明"></bg-form-gap>
<el-form-item label="跳转连接" prop="legalStatementUrl">
<el-input
placeholder="例如:https://...或http://..."
v-model.trim="loginPageFormData.legalStatementUrl"></el-input>
</el-form-item>
<bg-form-gap title="隐私政策"></bg-form-gap>
<el-form-item label="跳转连接" prop="privacyPolicyUrl">
<el-input
placeholder="例如:https://...或http://..."
v-model.trim="loginPageFormData.privacyPolicyUrl"></el-input>
</el-form-item>
</el-form>
</div>
</template>
<script setup>
import { reactive, ref, toRefs } from "vue";
import { validateLink } from "@/services/rules.js";
const props = defineProps({
loginPageFormData: {
type: Object,
default: () => ({}),
},
});
const loginPageRef = ref(null);
const state = reactive({
loginPageRules: {
logoUrl: [{ required: true, message: "请上传Logo", trigger: "change" }],
backgroundUrl: [{ required: true, message: "请上传背景图", trigger: "change" }],
icpUrl: [{ validator: validateLink, trigger: "blur" }],
publicSecurityUrl: [{ validator: validateLink, trigger: "blur" }],
legalStatementUrl: [{ validator: validateLink, trigger: "blur" }],
privacyPolicyUrl: [{ validator: validateLink, trigger: "blur" }],
},
});
const changeLogo = (value) => {
if (value && value.length > 0) {
loginPageRef.value.clearValidate("logoUrl");
}
};
const changeBanner = (value) => {
if (value && value.length > 0) {
refForm.value.clearValidate("backgroundUrl");
}
};
const { loginPageRules } = toRefs(state);
</script>
<style lang="scss" scoped>
.form_content {
overflow: auto;
height: 100%;
padding-left: 24px;
.el-form {
width: 60%;
:deep() .el-form-item {
&:nth-of-type(1) {
.el-upload--picture-card {
width: 120px;
height: 120px;
}
}
&:nth-of-type(2) {
.el-upload--picture-card {
width: 367px;
height: 196px;
}
}
}
}
:deep() .gap-title {
font-size: 16px;
color: #202531;
}
}
</style>
<template>
<el-form
ref="registerFormRef"
:model="registerFormData"
:rules="registerRules"
label-width="125px"
class="registerForm">
<bg-form-gap title="登录受限配置"></bg-form-gap>
<el-form-item label="登录受限是否启用" prop="login_config_state">
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="registerFormData.login_config_state"></bg-switch>
</el-form-item>
<div class="input_password_config" v-if="registerFormData.login_config_state == 1">
<span></span>
<el-form-item prop="login_limit_time" label-width="0">
<el-input
placeholder="请输入小时数"
v-model.trim.number="registerFormData.login_limit_time"
maxlength="3"></el-input>
</el-form-item>
<span>小时内</span>
<el-form-item prop="login_pwd_error" label-width="0">
<el-input
placeholder="请输入密码输错次数"
v-model.trim.number="registerFormData.login_pwd_error"
maxlength="3"></el-input>
</el-form-item>
<span>次输错密码,自动锁定</span>
<el-form-item prop="login_lock_time" label-width="0">
<el-input
placeholder="请输入分钟数"
v-model.trim.number="registerFormData.login_lock_time"
maxlength="3"></el-input>
</el-form-item>
<span>分钟</span>
<el-button type="primary" @click="restoreDialog = true">一键还原受限</el-button>
<el-tooltip placement="top-start" effect="light">
<template #content>
<span>必须为大于0的正整数且不能为空</span>
<br />
<span>一键还原按钮将所有锁定的账号解锁并将输错次数还原</span>
</template>
<div class="tip-image"></div>
</el-tooltip>
</div>
<bg-form-gap title="注册配置"></bg-form-gap>
<el-form-item label="允许注册" prop="register_config_state">
<el-radio-group v-model="registerFormData.register_config_state">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, toRefs } from "vue";
const props = defineProps({
registerFormData: {
type: Object,
default: () => ({}),
},
});
const state = reactive({
registerRules: {
login_limit_time: [
{
type: "number",
min: 1,
message: "请输入正整数",
trigger: "blur",
},
],
login_pwd_error: [
{
type: "number",
min: 1,
message: "请输入正整数",
trigger: "blur",
},
],
login_lock_time: [
{
type: "number",
min: 1,
message: "请输入正整数",
trigger: "blur",
},
],
},
});
const { registerRules } = toRefs(state);
</script>
<template>
<el-form ref="secureFormRef" :model="secureFormData" :rules="secureRules" label-width="110px" class="secureForm">
<div class="passwordItem">
<el-form-item label="最低密码强度" prop="min_pwd_level">
<el-select v-model="secureFormData.min_pwd_level" placeholder="请选择">
<el-option label="弱" :value="1" />
<el-option label="中" :value="2" />
<el-option label="强" :value="3" />
</el-select>
<el-tooltip placement="top-start" effect="light">
<template #content>
<span>支持大写字母/小写字符/数字/特殊符号</span>
<br />
<span>密码长度应至少8位字符</span>
<br />
<span>弱:至少包含一种组合。</span>
<br />
<span>中:至少包含两种组合。</span>
<br />
<span>强:至少包含三种及以上组合。</span>
</template>
<div class="tip-image"></div>
</el-tooltip>
</el-form-item>
<el-form-item label="是否强制修改" prop="force_update_state">
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="secureFormData.force_update_state"></bg-switch>
</el-form-item>
</div>
<el-form-item label="密码有效期" prop="pwd_validity">
<el-input placeholder="请输入" v-model.trim.number="secureFormData.pwd_validity" maxlength="3">
<template #append></template>
</el-input>
<el-tooltip placement="top-start" effect="light">
<template #content>
<span>单位,天</span>
<br />
<span>密码有效期是指强制修改密码的周期,例如60天表示用户需要每60天修改一次密码。</span>
<br />
<span>若配置为0,表示密码有效期为永久</span>
</template>
<div class="tip-image"></div>
</el-tooltip>
</el-form-item>
<el-form-item label="会话有效期" prop="session_validity">
<el-input placeholder="请输入" v-model.trim.number="secureFormData.session_validity">
<template #append>分钟</template>
</el-input>
<el-tooltip placement="top-start" effect="light">
<template #content>
<span>{{ `范围(10~${session_validity_max})` }}</span>
<br />
<span>单位,分钟</span>
<br />
<span>会话有效期是指您登录后,一定时间内无操作,系统将自动登出</span>
</template>
<div class="tip-image"></div>
</el-tooltip>
</el-form-item>
<el-form-item label="访问规则模式" prop="access_rule_state">
<el-select placeholder="请选择" v-model="secureFormData.access_rule_state">
<el-option label="关闭" :value="0"> </el-option>
<el-option label="打开" :value="1"> </el-option>
</el-select>
<el-tooltip placement="top-start" effect="light">
<template #content>
<span>访问规则模式开启后,按照【访问规则管理】配置执行。</span>
<br />
<span>该模式针对超管无效</span>
</template>
<div class="tip-image"></div>
</el-tooltip>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, toRefs } from "vue";
const props = defineProps({
secureFormData: {
type: Object,
default: () => ({}),
},
});
const session_validity_max = window.defaultConfig.session_validity_max;
const state = reactive({
//安全相关表单校验规则
secureRules: {
pwd_validity: [
{
type: "number",
message: "请输入大于或等于0的整数",
trigger: "blur",
},
],
session_validity: [
{
type: "number",
min: 10,
max: session_validity_max,
message: `请输入10~${session_validity_max}的整数`,
trigger: "blur",
},
],
},
});
const { secureRules } = toRefs(state);
</script>
This diff is collapsed.
This diff is collapsed.
...@@ -278,6 +278,9 @@ function getViews(path) { ...@@ -278,6 +278,9 @@ function getViews(path) {
var menuToRouter = (menu) => { var menuToRouter = (menu) => {
menu.forEach((e) => { menu.forEach((e) => {
e.name = getName(e.path); e.name = getName(e.path);
if (e.path.indexOf("#") != -1) {
e.path = e.path.split("#")[1];
}
if (e.children && e.menuType == 0) { if (e.children && e.menuType == 0) {
// 其他层级作为文件夹,只提供父级 // 其他层级作为文件夹,只提供父级
e.component = () => import("../page/parent/parent.vue"); e.component = () => import("../page/parent/parent.vue");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment