Commit 35f720d7 authored by 张俊's avatar 张俊
parents 14418db1 215579d7
...@@ -37,4 +37,9 @@ export const GetRuleTypeOptions = () => { ...@@ -37,4 +37,9 @@ export const GetRuleTypeOptions = () => {
export const Empty = (key, Obj) => { export const Empty = (key, Obj) => {
let item = Obj[key] let item = Obj[key]
return !item || item.label == '' return !item || item.label == ''
} }
\ No newline at end of file export const dateStringToDate = (str) => {
if (!str || typeof str != 'string') return str || "-";
return str.split("+")[0].replace("T", " ").replace("Z", " ")
}
export const delay = (time = 1000) => new Promise((resolve, reject) => setTimeout(resolve, time))
\ No newline at end of file
...@@ -60,7 +60,6 @@ import axios from "@/request/http.js"; ...@@ -60,7 +60,6 @@ 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"; import { useRouter } from "vue-router";
import { menuData } from "./menu";
const router = useRouter(); const router = useRouter();
...@@ -126,13 +125,10 @@ const getUserInfo = () => { ...@@ -126,13 +125,10 @@ const getUserInfo = () => {
return axios.get(`/v1/api/user/getUserInfo`); return axios.get(`/v1/api/user/getUserInfo`);
}; };
const getMenu = (search) => { const getMenu = (search) => {
// return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`); return axios.get(`/v1/api/menu/user/tree?search=${search}`);
return new Promise((resolve, reject) => {
resolve(menuData);
});
}; };
const getUser = () => { const getUser = () => {
Promise.all([getUserInfo(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")]).then((res) => { Promise.all([getUserInfo(), getMenu("1e99371c-187f-4966-94cf-32f116f42ce6")]).then((res) => {
console.log("res", res); console.log("res", 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) || [];
......
...@@ -145,10 +145,10 @@ const getUserInfo = () => { ...@@ -145,10 +145,10 @@ const getUserInfo = () => {
return axios.get(`/v1/api/user/getUserInfo`); return axios.get(`/v1/api/user/getUserInfo`);
}; };
const getMenu = (search) => { const getMenu = (search) => {
return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`); return axios.get(`/v1/api/menu/user/tree?search=${search}`);
}; };
const getUser = () => { const getUser = () => {
Promise.all([getUserInfo(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")]).then((res) => { Promise.all([getUserInfo(), getMenu("1e99371c-187f-4966-94cf-32f116f42ce6")]).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);
......
This diff is collapsed.
export const STATUS_OBJ = { export const STATUS_OBJ = {
success: "已恢复", 1: "已恢复",
error: '未恢复' 2: '未恢复'
} }
export const PUSH_STATUS = { export const PUSH_STATUS = {
1: '成功', 1: '成功',
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
</Info> </Info>
</div> </div>
<div class="tabs"> <div class="tabs">
<Tab :tabs="tabs" /> <Tab :labels="tabLabels" :data="tabDatas" />
</div> </div>
</div> </div>
</template> </template>
...@@ -27,10 +27,14 @@ const props = defineProps({ ...@@ -27,10 +27,14 @@ const props = defineProps({
type: Object, type: Object,
default: () => ({}), default: () => ({}),
}, },
tabs: { tabLabels: {
type: Array, type: Array,
default: () => [], default: () => [],
}, },
tabDatas: {
type: Object,
default: () => ({}),
},
}); });
</script> </script>
......
<template> <template>
<el-tabs v-model="activeTab" tab-position="top"> <el-tabs v-model="activeTab" tab-position="top">
<el-tab-pane v-for="item in tabs" :key="item.prop" :label="item.label" :name="item.prop"> <el-tab-pane v-for="item in labels" :key="item.prop" :label="item.label" :name="item.prop">
<bg-table <bg-table
ref="listtable" ref="listtable"
:headers="headers[item.prop]" :headers="headers[item.prop]"
:rows="item.lists" :rows="data[item.prop]"
height="100%" height="100%"
:isIndex="true" :isIndex="true"
:stripe="true"> :stripe="true">
...@@ -31,10 +31,14 @@ import { STATUS_OBJ, PUSH_STATUS } from "./env.js"; ...@@ -31,10 +31,14 @@ import { STATUS_OBJ, PUSH_STATUS } from "./env.js";
import { METHODS } from "@/components/manual-distribution/env.js"; import { METHODS } from "@/components/manual-distribution/env.js";
const activeTab = ref("push"); const activeTab = ref("push");
const props = defineProps({ const props = defineProps({
tabs: { labels: {
type: Array, type: Array,
default: () => [], default: () => [],
}, },
data: {
type: Object,
default: () => ({}),
},
methodLists: { methodLists: {
type: Object, type: Object,
default: METHODS, default: METHODS,
......
...@@ -33,8 +33,6 @@ import axios from "./request/http.js"; ...@@ -33,8 +33,6 @@ import axios from "./request/http.js";
import api from "./request/api.js"; import api from "./request/api.js";
import config from "../package.json"; import config from "../package.json";
import { menuData } from "@/components/menu.js";
const createVue = createApp(App); const createVue = createApp(App);
// createVue.use(ElementPlus, { locale }); // createVue.use(ElementPlus, { locale });
...@@ -72,10 +70,7 @@ function getUser() { ...@@ -72,10 +70,7 @@ function getUser() {
//获取用户菜单信息 //获取用户菜单信息
function getMenu(search) { function getMenu(search) {
// return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`); return axios.get(`/v1/api/menu/user/tree?search=${search}`);
return new Promise((resolve, reject) => {
resolve(menuData);
});
} }
//处理菜单成为对象 //处理菜单成为对象
...@@ -89,7 +84,7 @@ function getMenuObj(menu, parentRowPath, menuObj) { ...@@ -89,7 +84,7 @@ function getMenuObj(menu, parentRowPath, menuObj) {
}); });
} }
store.commit("setWhiteList", ["/login", "/register", "/password"]); store.commit("setWhiteList", ["/login", "/register", "/password"]);
Promise.all([getUser(), getMenu("79a8f214-db78-4db7-9c28-db66276b4be2")]) Promise.all([getUser(), getMenu("1e99371c-187f-4966-94cf-32f116f42ce6")])
.then((res) => { .then((res) => {
if (res[0].data.code == 200 && res[1].data.code == 200) { if (res[0].data.code == 200 && res[1].data.code == 200) {
//已登录则记录菜单和用户信息 //已登录则记录菜单和用户信息
......
...@@ -3,9 +3,7 @@ ...@@ -3,9 +3,7 @@
class="login-container" class="login-container"
:style="{ :style="{
'background-image': `url(${ 'background-image': `url(${
configOptions.backgroundUrl configOptions.backgroundUrl ? JSON.parse(configOptions.backgroundUrl)[0].url : getImageUrl('bg.png')
? JSON.parse(configOptions.backgroundUrl)[0].url
: getImageUrl('bg.png')
})`, })`,
}"> }">
<el-alert v-if="showValidityDays" class="bg-warning" :title="validityTips" type="warning" /> <el-alert v-if="showValidityDays" class="bg-warning" :title="validityTips" type="warning" />
...@@ -15,11 +13,7 @@ ...@@ -15,11 +13,7 @@
</div> --> </div> -->
<div class="bg-content"> <div class="bg-content">
<bg-tabs <bg-tabs class="login-tab" v-model="loginTab" style="width: 480px" v-if="pageType === 'login'">
class="login-tab"
v-model="loginTab"
style="width: 480px"
v-if="pageType === 'login'">
<bg-tab label="账号密码登录" name="account"> <bg-tab label="账号密码登录" name="account">
<LoginByAccount @register="switchPageType('account')" @password="password" /> <LoginByAccount @register="switchPageType('account')" @password="password" />
</bg-tab> </bg-tab>
...@@ -33,9 +27,7 @@ ...@@ -33,9 +27,7 @@
<div class="bg-msg"> <div class="bg-msg">
<p v-if="configOptions && configOptions.patent">{{ configOptions.patent }}</p> <p v-if="configOptions && configOptions.patent">{{ configOptions.patent }}</p>
<p v-if="configOptions"> <p v-if="configOptions">
<span class="can_click_text" @click="open(configOptions.icpUrl)"> <span class="can_click_text" @click="open(configOptions.icpUrl)"> {{ configOptions.icpFiling }} | </span>
{{ configOptions.icpFiling }} |
</span>
<span class="can_click_text" @click="open(configOptions.publicSecurityUrl)"> <span class="can_click_text" @click="open(configOptions.publicSecurityUrl)">
{{ configOptions.publicSecurityFiling }} {{ configOptions.publicSecurityFiling }}
</span> </span>
...@@ -104,7 +96,7 @@ const getLoginPageConfig = () => { ...@@ -104,7 +96,7 @@ const getLoginPageConfig = () => {
}; };
//获取首选项配置 //获取首选项配置
const getSysOptions = () => { const getSysOptions = () => {
axios.get(`/apaas/system/v5/sysOptions`).then((res) => { axios.get(`/v1/api/sysOptions`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
const result = res.data.data || {}; const result = res.data.data || {};
if (result.license_dead_date && result.license_inform_day) { if (result.license_dead_date && result.license_inform_day) {
......
...@@ -12,14 +12,10 @@ ...@@ -12,14 +12,10 @@
</span> </span>
</template> </template>
<template #create_time="{ valueData }"> <template #create_time="{ valueData }">
<span>{{ <span>{{ dateStringToDate(valueData.create_time) }}</span>
valueData.create_time ? valueData.create_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-"
}}</span>
</template> </template>
<template #update_time="{ valueData }"> <template #update_time="{ valueData }">
<span>{{ <span>{{ dateStringToDate(valueData.update_time) }}</span>
valueData.update_time ? valueData.update_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-"
}}</span>
</template> </template>
</Info> </Info>
</div> </div>
...@@ -70,7 +66,7 @@ import gapTitle from "@/components/gap-title.vue"; ...@@ -70,7 +66,7 @@ import gapTitle from "@/components/gap-title.vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import Info from "@/components/warn-detail/info.vue"; import Info from "@/components/warn-detail/info.vue";
import { METHODS } from "@/components/manual-distribution/env.js"; import { METHODS } from "@/components/manual-distribution/env.js";
import { GetRuleTypeOptions, Empty } from "@/components/env.js"; import { GetRuleTypeOptions, Empty, dateStringToDate } from "@/components/env.js";
const route = useRoute(); const route = useRoute();
const { id, type_name, target_name } = route.query; const { id, type_name, target_name } = route.query;
const STATUS_OBJ = { const STATUS_OBJ = {
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
v-model="row.is_enabled"></bg-switch> v-model="row.is_enabled"></bg-switch>
</template> </template>
<template v-slot:created_at="{ row }"> <template v-slot:created_at="{ row }">
{{ row.created_at ? row.created_at.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.created_at) }}
</template> </template>
<template v-slot:action="{ row }"> <template v-slot:action="{ row }">
<bg-table-btns2 :limit="3" :tableData="tableRows"> <bg-table-btns2 :limit="3" :tableData="tableRows">
...@@ -113,6 +113,7 @@ import Slide from "./modules/slide.vue"; ...@@ -113,6 +113,7 @@ import Slide from "./modules/slide.vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { dateStringToDate } from "@/components/env";
const router = useRouter(); const router = useRouter();
const node = ref({}); const node = ref({});
watch( watch(
......
<template> <template>
<div class="add-form"> <div class="add-form">
<el-form :model="state.form" ref="form_ref" :rules="state.rules" label-width="100px"> <el-form :model="state.form" ref="form_ref" :rules="state.rules" label-width="120px">
<div class="add-form-item"> <div class="add-form-item">
<el-form-item label="指标名称" prop="name"> <el-form-item label="指标名称" prop="name">
<el-input v-model="state.form.name" :disabled="isEdit" placeholder="请输入指标名称"></el-input> <el-input v-model="state.form.name" :disabled="isEdit" placeholder="请输入指标名称"></el-input>
......
...@@ -28,27 +28,33 @@ ...@@ -28,27 +28,33 @@
@focus="inputLabel($index, false)" @focus="inputLabel($index, false)"
@input="inputLabel($index, true)"></el-input> @input="inputLabel($index, true)"></el-input>
</template> </template>
<div class="filter-first-tree-lists"> <div class="filter-first-tree-lists" @mousedown.prevent="">
<ul class="bg-scroll" v-show="dataTree($index).length > 0"> <ul class="bg-scroll" v-show="dataTree($index).length > 0">
<li <li
v-for="data in dataTree($index)" v-for="(data, i) in dataTree($index)"
:key="data" :key="data"
:class="{ active: state.form.warningScopeRows[$index].indicator_scope == data.label }"> :class="{ active: state.form.warningScopeRows[$index].indicator_scope == data.label }">
<div class="first-label-main" @click="chooseTreeFirst($index, data)"> <div class="first-label-main" @click="chooseTreeFirst($index, data, i)">
<div class="tree-label">{{ data.label }}</div> <div class="tree-label" v-html="data.label_html"></div>
<div class="tree-icon"> <div class="tree-icon">
<bg-icon <bg-icon
style="font-size: 16px; color: #404a62" style="font-size: 15px; color: #404a62"
class="is-loading" class="is-loading"
:class="{ 'loading-show': data.isLoading }" :class="{ 'loading-show': data.isLoading }"
icon="#bg-ic-loading"></bg-icon> icon="#bg-ic-loading"></bg-icon>
<bg-icon style="font-size: 14px; color: #404a62" icon="#bg-ic-arrow-right"></bg-icon> <bg-icon style="font-size: 13px; color: #404a62" icon="#bg-ic-arrow-right"></bg-icon>
</div> </div>
</div> </div>
</li> </li>
</ul> </ul>
<ul v-show="dataTree($index).length == 0"> <ul v-show="dataTree($index).length == 0">
<li class="no-data">未查询到相关指标范围数据</li> <li class="no-data">
{{
state.form.warningScopeRows[$index].input_indicator_tag
? "未查询到相关指标范围数据"
: "请输入查询"
}}
</li>
</ul> </ul>
<ul class="bg-scroll" v-show="state.form.warningScopeRows[$index].lastOptions?.length > 0"> <ul class="bg-scroll" v-show="state.form.warningScopeRows[$index].lastOptions?.length > 0">
<li <li
...@@ -59,6 +65,13 @@ ...@@ -59,6 +65,13 @@
{{ child }} {{ child }}
</li> </li>
</ul> </ul>
<ul
v-show="
state.form.warningScopeRows[$index].indicator_scope &&
state.form.warningScopeRows[$index].lastOptions?.length == 0
">
<li class="no-data">未查询到相关指标标签</li>
</ul>
</div> </div>
</el-popover> </el-popover>
</div> </div>
...@@ -99,6 +112,7 @@ ...@@ -99,6 +112,7 @@
import { reactive, watch, nextTick, computed, ref, onMounted } from "vue"; import { reactive, watch, nextTick, computed, ref, onMounted } from "vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { delay } from "@/components/env";
const props = defineProps({ const props = defineProps({
indicator_expression: { indicator_expression: {
...@@ -162,13 +176,19 @@ const dataTree = computed(() => { ...@@ -162,13 +176,19 @@ const dataTree = computed(() => {
return (index) => { return (index) => {
const { firstOptions, input_indicator_tag, oldQuery } = state.form.warningScopeRows[index]; const { firstOptions, input_indicator_tag, oldQuery } = state.form.warningScopeRows[index];
let query = isInput.value ? input_indicator_tag : oldQuery; let query = isInput.value ? input_indicator_tag : oldQuery;
if (!query) return firstOptions; // if (!query) return firstOptions;
if (!query) return [];
let arr = firstOptions.filter((e) => e.label.includes(query)); let arr = firstOptions.filter((e) => e.label.includes(query));
if (arr == "") { if (arr == []) {
state.form.warningScopeRows[index].lastOptions = []; state.form.warningScopeRows[index].lastOptions = [];
state.form.warningScopeRows[index].indicator_scope = ""; state.form.warningScopeRows[index].indicator_scope = "";
} }
return arr; return arr.map((e) => {
return {
...e,
label_html: e.label.replaceAll(input_indicator_tag, `<span class='mate-str'>${input_indicator_tag}</span>`),
};
});
}; };
}); });
// 监听父组件传过来的指标表达式 // 监听父组件传过来的指标表达式
...@@ -230,9 +250,10 @@ watch( ...@@ -230,9 +250,10 @@ watch(
// 选择第一级,获取第二级数据 // 选择第一级,获取第二级数据
const chooseTreeFirst = (index, data) => { const chooseTreeFirst = (index, data) => {
inputRef.value[index].focus(); inputRef.value[index].focus();
let i = state.form.warningScopeRows[index].firstOptions.findIndex((e) => e.label == data.label);
state.form.warningScopeRows[index].firstOptions[i].isLoading = true;
state.form.warningScopeRows[activeIndex.value].indicator_tag = ""; state.form.warningScopeRows[activeIndex.value].indicator_tag = "";
state.form.warningScopeRows[index].indicator_scope = data.label; state.form.warningScopeRows[index].indicator_scope = data.label;
data.isLoading = true;
state.form.warningScopeRows[index].lastOptions = []; state.form.warningScopeRows[index].lastOptions = [];
const params = { const params = {
label_name: data.label, label_name: data.label,
...@@ -247,7 +268,7 @@ const chooseTreeFirst = (index, data) => { ...@@ -247,7 +268,7 @@ const chooseTreeFirst = (index, data) => {
} }
}) })
.finally(() => { .finally(() => {
data.isLoading = false; state.form.warningScopeRows[index].firstOptions[i].isLoading = false;
}); });
}; };
// 获取第一级数据 // 获取第一级数据
...@@ -268,34 +289,35 @@ const getDataTreeLevelFirst = () => { ...@@ -268,34 +289,35 @@ const getDataTreeLevelFirst = () => {
}; };
let timer = null; let timer = null;
// 输入模糊查询数据 // 输入模糊查询数据
const inputLabel = (index, type) => { const inputLabel = async (index, type) => {
state.form.warningScopeRows[index].visible = true;
activeIndex.value = index; activeIndex.value = index;
isInput.value = type;
if (state.form.warningScopeRows[index].input_indicator_tag == "") {
state.form.warningScopeRows[index].lastOptions = [];
}
// 用户输入节流 // 用户输入节流
timer && clearTimeout(timer); timer && clearTimeout(timer);
timer = setTimeout(() => { timer = setTimeout(() => {
state.form.warningScopeRows[index].visible = true;
isInput.value = type;
if (state.form.warningScopeRows[index].input_indicator_tag == "") {
state.form.warningScopeRows[index].lastOptions = [];
}
if (type) { if (type) {
state.form.warningScopeRows[index].oldQuery = state.form.warningScopeRows[index].input_indicator_tag; state.form.warningScopeRows[index].oldQuery = state.form.warningScopeRows[index].input_indicator_tag;
state.form.warningScopeRows[index].indicator_scope = ""; state.form.warningScopeRows[index].indicator_scope = "";
state.form.warningScopeRows[index].indicator_tag = ""; state.form.warningScopeRows[index].indicator_tag = "";
state.form.warningScopeRows[index].lastOptions = []; state.form.warningScopeRows[index].lastOptions = [];
} }
}, 200); }, 500);
}; };
// 失去焦点是隐藏popper // 失去焦点是隐藏popper
const blurInput = (index) => { const blurInput = (index) => {
state.form.warningScopeRows[index].visible = false; state.form.warningScopeRows[index].visible = false;
}; };
// 选择范围中的属性 // 选择范围中的属性
const chooseTreeLast = (last, index, type) => { const chooseTreeLast = async (last, index, type) => {
isInput.value = type; isInput.value = type;
state.form.warningScopeRows[activeIndex.value].input_indicator_tag = last; state.form.warningScopeRows[activeIndex.value].input_indicator_tag = last;
state.form.warningScopeRows[activeIndex.value].indicator_tag = last; state.form.warningScopeRows[activeIndex.value].indicator_tag = last;
await delay(500);
blurInput(index);
}; };
// form表单元素 // form表单元素
const form_ref = ref(null); const form_ref = ref(null);
...@@ -347,6 +369,7 @@ defineExpose({ ...@@ -347,6 +369,7 @@ defineExpose({
.filter-first-tree-lists { .filter-first-tree-lists {
height: 240px; height: 240px;
display: flex; display: flex;
min-width: 100%;
ul { ul {
min-width: 180px; min-width: 180px;
height: 100%; height: 100%;
...@@ -356,7 +379,7 @@ defineExpose({ ...@@ -356,7 +379,7 @@ defineExpose({
li { li {
padding-left: 20px; padding-left: 20px;
line-height: 34px; line-height: 34px;
max-width: 400px; // max-width: 400px;
word-break: break-all; word-break: break-all;
transition: all 300ms; transition: all 300ms;
&:hover { &:hover {
...@@ -415,4 +438,7 @@ defineExpose({ ...@@ -415,4 +438,7 @@ defineExpose({
} }
} }
} }
.mate-str {
font-weight: bold;
}
</style> </style>
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<bg-breadcrumb /> <bg-breadcrumb />
</div> </div>
<div class="content bg-scroll"> <div class="content bg-scroll">
<warn-detail :label-data="labelData" :value-data="info" :tabs="tabs"> <warn-detail :label-data="labelData" :value-data="info" :tabLabels="tabLabels" :tabDatas="tabDatas">
<template #status="{ item, valueData }"> <template #status="{ item, valueData }">
<span class="status-body"> <span class="status-body">
<span class="status" :class="`status-${valueData.status}`"></span> <span class="status" :class="`status-${valueData.status}`"></span>
...@@ -23,6 +23,7 @@ import { useRoute } from "vue-router"; ...@@ -23,6 +23,7 @@ import { useRoute } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { ref, onBeforeMount } from "vue"; import { ref, onBeforeMount } from "vue";
import { dateStringToDate } from "@/components/env";
const route = useRoute(); const route = useRoute();
const { id } = route.query; const { id } = route.query;
const ruleTypeOptions = ref({}); const ruleTypeOptions = ref({});
...@@ -80,31 +81,21 @@ const labelData = [ ...@@ -80,31 +81,21 @@ const labelData = [
], ],
]; ];
const info = ref({}); const info = ref({});
const tabs = ref([ const tabLabels = [
{ {
label: "推送记录", label: "推送记录",
prop: "push", prop: "push",
lists: [],
}, },
{ {
label: "处置记录", label: "处置记录",
prop: "dispose", prop: "dispose",
lists: [
{
status: "error",
feedback: "暂时无法处理,需要时间",
feedback_time: "2022-07-29 10:23:59",
feedback_person: "张三",
},
{
status: "success",
feedback: "暂时无法处理,需要时间",
feedback_time: "2022-07-29 10:23:59",
feedback_person: "张三",
},
],
}, },
]); ];
const tabDatas = ref({});
const pushType = {
1: "自动推送",
2: "手动推送",
};
const getInfo = () => { const getInfo = () => {
const params = { const params = {
id, id,
...@@ -122,7 +113,28 @@ const getInfo = () => { ...@@ -122,7 +113,28 @@ const getInfo = () => {
ruleTypeOptions.value[data.alert_rule_type]?.unit || "" ruleTypeOptions.value[data.alert_rule_type]?.unit || ""
}-${data.alert_condition.thresholds_max}${ruleTypeOptions.value[data.alert_rule_type]?.unit || ""}`, }-${data.alert_condition.thresholds_max}${ruleTypeOptions.value[data.alert_rule_type]?.unit || ""}`,
current_alarm_value: data.current_value + (ruleTypeOptions.value[data.alert_rule_type]?.unit || ""), current_alarm_value: data.current_value + (ruleTypeOptions.value[data.alert_rule_type]?.unit || ""),
warning_time: data.alert_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", warning_time: dateStringToDate(data.alert_time),
};
tabDatas.value = {
push:
data.push_records?.map((e) => {
return {
method: e.notify_method,
person: e.system_account,
push_time: dateStringToDate(e.push_time),
push_type: pushType[e.push_type],
status: e.status,
};
}) || [],
dispose:
data.disposed_list?.map((e) => {
return {
status: e.is_disposed,
feedback: e.disposal_content,
feedback_time: dateStringToDate(e.disposal_time),
feedback_person: e.disposal_user,
};
}) || [],
}; };
} }
}); });
...@@ -146,29 +158,8 @@ const GetRuleTypeOptions = () => { ...@@ -146,29 +158,8 @@ const GetRuleTypeOptions = () => {
} }
}); });
}; };
const pushType = {
1: "自动推送",
2: "手动推送",
};
const getPushLog = () => {
axios.get("/v1/api/push_record/list", { params: { alert_list_id: id } }).then((res) => {
if (res.data.code == 200) {
tabs.value[0].lists =
res.data.data.list?.map((e) => {
return {
method: e.notify_method,
person: e.system_account,
push_time: e.push_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-",
push_type: pushType[e.push_type],
status: e.status,
};
}) || [];
}
});
};
onBeforeMount(() => { onBeforeMount(() => {
GetRuleTypeOptions(); GetRuleTypeOptions();
getPushLog();
}); });
</script> </script>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="detail_container"> <div class="detail_container">
<bg-breadcrumb></bg-breadcrumb> <bg-breadcrumb></bg-breadcrumb>
<div class="main_container"> <div class="main_container">
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入预警点/分类/指标"> <bg-filter-group @search="changeSearch" v-model="filter.keyword" placeholder="请输入预警点/分类/指标">
<template v-slot:left_action> <template v-slot:left_action>
<div class="apaas_button"> <div class="apaas_button">
<el-button type="primary" @click="batchPush"> <el-button type="primary" @click="batchPush">
...@@ -43,10 +43,10 @@ ...@@ -43,10 +43,10 @@
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">预警时间</span> <span class="filter_title">预警时间</span>
<el-date-picker <el-date-picker
style="width: 300px" style="width: 400px"
v-model="filter.time" v-model="filter.time"
type="daterange" type="datetimerange"
value-format="yyyy-MM-DD" value-format="YYYY-MM-DD HH:mm:ss"
range-separator="至" range-separator="至"
start-placeholder="开始日期" start-placeholder="开始日期"
end-placeholder="结束日期" /> end-placeholder="结束日期" />
...@@ -86,17 +86,17 @@ ...@@ -86,17 +86,17 @@
{{ row.alert_condition.thresholds_max }}{{ ruleTypeOptions[row.alert_rule_type]?.unit || "" }} {{ row.alert_condition.thresholds_max }}{{ ruleTypeOptions[row.alert_rule_type]?.unit || "" }}
</template> </template>
<template v-slot:alert_time="{ row }"> <template v-slot:alert_time="{ row }">
{{ row.alert_time ? row.alert_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.alert_time) }}
</template> </template>
<template v-slot:last_push_time="{ row }"> <template v-slot:last_push_time="{ row }">
{{ row.last_push_time ? row.last_push_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.last_push_time) }}
</template> </template>
<template #status="{ row }"> <template #status="{ row }">
<span :class="`circle status-${row.status}`"></span> <span :class="`circle status-${row.status}`"></span>
{{ statusOptions[row.status] }} {{ statusOptions[row.status] }}
</template> </template>
<template v-slot:action="{ row }"> <template v-slot:action="{ row }">
<bg-table-btns2 :limit="3" :tableData="tableRows"> <bg-table-btns2 :page_size="3" :tableData="tableRows">
<bg-table-btn :disabled="row.status != 2" @click="pushWarning(row)">推送提醒</bg-table-btn> <bg-table-btn :disabled="row.status != 2" @click="pushWarning(row)">推送提醒</bg-table-btn>
<bg-table-btn :disabled="row.status != 2" @click="closeWarning(row)">关闭预警</bg-table-btn> <bg-table-btn :disabled="row.status != 2" @click="closeWarning(row)">关闭预警</bg-table-btn>
</bg-table-btns2> </bg-table-btns2>
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
v-model="closeFormData.close_notes" v-model="closeFormData.close_notes"
type="textarea" type="textarea"
:autosize="{ minRows: 2 }" :autosize="{ minRows: 2 }"
show-word-limit show-word-page_size
maxlength="30" maxlength="30"
resize="vertical" resize="vertical"
placeholder="请输入内容"></el-input> placeholder="请输入内容"></el-input>
...@@ -174,10 +174,9 @@ import { ElMessage } from "element-plus"; ...@@ -174,10 +174,9 @@ import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; 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 userInputTable from "./user-input-table.vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import ManualDistributionForm from "@/components/manual-distribution/form.vue"; import ManualDistributionForm from "@/components/manual-distribution/form.vue";
import { GetRuleTypeOptions } from "@/components/env.js"; import { GetRuleTypeOptions, dateStringToDate } from "@/components/env";
const router = useRouter(); const router = useRouter();
...@@ -264,14 +263,12 @@ const state = reactive({ ...@@ -264,14 +263,12 @@ const state = reactive({
selected: [], //选择数据 selected: [], //选择数据
tableTotal: 0, // 表格数据条数 tableTotal: 0, // 表格数据条数
filter: { filter: {
warning_type: "", // 预警类型
warning_target: "", // 预警指标
risk_level: "", // 风险等级 risk_level: "", // 风险等级
status: "", // 状态 status: "", // 状态
time: [], time: [],
search: "", keyword: "",
page: 1, page: 1,
limit: 10, page_size: 10,
}, // 表格筛选项 }, // 表格筛选项
actionRow: null, // 当前操作的数据 actionRow: null, // 当前操作的数据
closeWarningDialog: false, // 删除弹窗 closeWarningDialog: false, // 删除弹窗
...@@ -314,7 +311,7 @@ const goDetail = (row) => { ...@@ -314,7 +311,7 @@ const goDetail = (row) => {
}; // 查看详情 }; // 查看详情
const changeSearch = (val) => { const changeSearch = (val) => {
state.filter.search = val; state.filter.keyword = val;
changePage(1); changePage(1);
}; // 表格关键字筛选 }; // 表格关键字筛选
...@@ -328,10 +325,10 @@ const filterClear = () => { ...@@ -328,10 +325,10 @@ const filterClear = () => {
warning_target: "", // 预警指标 warning_target: "", // 预警指标
risk_level: "", // 风险等级 risk_level: "", // 风险等级
status: "", // 状态 status: "", // 状态
time: "", time: [],
search: "", keyword: "",
page: 1, page: 1,
limit: 10, page_size: 10,
}; };
changePage(1); changePage(1);
}; // 重置筛选项 }; // 重置筛选项
...@@ -339,7 +336,13 @@ const selectable = (row, index) => { ...@@ -339,7 +336,13 @@ const selectable = (row, index) => {
return row.status === 2; return row.status === 2;
}; };
const getTableRows = () => { const getTableRows = () => {
let params = { ...state.filter }; let [start_time = "", end_time = ""] = state.filter.time || [];
let params = {
...state.filter,
start_time,
end_time,
};
Reflect.deleteProperty(params, "time");
axios.get("/v1/api/alert_list/list", { params }).then((res) => { axios.get("/v1/api/alert_list/list", { params }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
let { list, total_count } = res.data.data; let { list, total_count } = res.data.data;
...@@ -357,7 +360,7 @@ const changePage = (page) => { ...@@ -357,7 +360,7 @@ const changePage = (page) => {
}; // 改变页码 }; // 改变页码
const changeSize = (size) => { const changeSize = (size) => {
state.filter.limit = size; state.filter.page_size = size;
changePage(1); changePage(1);
}; // 改变每页条数 }; // 改变每页条数
......
<template>
<el-form ref="ruleFormRef" class="ruleForm" :model="tableRows" :size="formSize" :rules="formRules">
<bg-table-pro showIndex :headers="headers" :data="tableRows" ref="input-table" :border="true" :stripe="false">
<template v-slot:account="{ row, index }">
<el-form-item :prop="`[${index}].account`" :rules="formRules.account" style="width: 100%">
<el-select
v-model="row.account"
placeholder="请选择帐号"
style="width: 100%"
@change="changeAccount(row)"
:disabled="disabled">
<el-option
v-for="(item, index) in userLists"
:key="'userItem' + index"
:disabled="item.disabled"
:label="item.account"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</template>
<template v-slot:name="{ row, index }">
<el-form-item :prop="`[${index}].name`" :rules="formRules.name" style="width: 100%">
<el-input @change="changeName" placeholder="请输入姓名" :disabled="disabled" v-model.trim="row.name" />
</el-form-item>
</template>
<template v-slot:mobile="{ row, index }">
<el-form-item :prop="`[${index}].mobile`" :rules="formRules.mobile" style="width: 100%">
<el-input
@change="changeMobile"
placeholder="请输入联系方式"
:disabled="disabled"
v-model.trim="row.mobile" />
</el-form-item>
</template>
<template v-slot:action="{ row, index }">
<bg-table-btn
:disabled="disabled"
:click="
() => {
addParam(index);
}
"
>增加</bg-table-btn
>
<bg-table-btn
:disabled="disabled"
:click="
() => {
removeParam(row, index);
}
">
删除
</bg-table-btn>
</template>
</bg-table-pro>
</el-form>
</template>
<script setup>
import { reactive, toRefs, onBeforeMount, onMounted, ref, getCurrentInstance, watch, computed } from "vue";
import { v4 as uuidv4 } from "uuid";
import { validatePhone } from "@/services/rules.js";
const props = defineProps({
data: {
type: Array,
default: () => [],
},
disabled: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(["change"]);
const formSize = ref("default");
const ruleFormRef = ref(null);
const formRules = reactive({
name: [
{
required: true,
message: "请输入键",
trigger: "blur",
},
{
max: 50,
message: "最多50个字符",
trigger: "blur",
},
],
account: [
{
required: true,
message: "请选择帐号",
trigger: "change",
},
],
mobile: [
{
required: true,
message: "请输入联系方式",
trigger: "blur",
},
{ validator: validatePhone, trigger: "blur" },
],
});
const headers = reactive([
{
label: "帐号",
prop: "account",
required: true,
},
{
label: "姓名",
prop: "name",
required: true,
},
{
label: "联系方式",
prop: "mobile",
required: true,
},
{
label: "操作",
prop: "action",
width: 120,
},
]);
const state = reactive({
tableRows: [],
userLists: [
{
account: "admin",
id: 1,
name: "张一",
mobile: "13111111111",
},
{
account: "ys-admin",
id: 2,
name: "张二",
mobile: "13222222222",
},
{
account: "yf-user",
id: 3,
name: "张三",
mobile: "13333333333",
},
{
account: "putong",
id: 4,
name: "张四",
mobile: "13444444444",
},
],
});
watch(
() => state.tableRows,
(n, o) => {
let list = state.tableRows.map((e) => {
return e.account;
});
state.userLists.forEach((e) => {
if (list.indexOf(e.id) > -1) {
e.disabled = true;
} else {
e.disabled = false;
}
});
},
{
deep: true,
}
);
// const canAdd = computed(() => {
// return state.tableRows.length >= 5 ? false : true;
// }); // 最多五条数据,控制下新增按钮的禁用
onBeforeMount(() => {
initTable();
});
var initTable = () => {
if (props.data && props.data.length >= 1) {
state.tableRows = props.data;
} else {
state.tableRows = [];
addParam(0);
}
};
var createRow = () => {
return {
id: uuidv4(),
account: "",
name: "",
mobile: "",
};
};
var addParam = (index) => {
state.tableRows.splice(index + 1, 0, createRow());
};
var removeParam = (row, index) => {
state.tableRows.splice(index, 1);
if (state.tableRows.length === 0) {
addParam(0);
}
};
const changeAccount = (row) => {
state.userLists.forEach((e) => {
if (e.id == row.account) {
row.name = e.name;
row.mobile = e.mobile;
}
});
emit("change", {
type: "account",
data: state.tableRows,
});
};
const changeName = () => {
emit("change", {
type: "name",
data: state.tableRows,
});
};
const changeMobile = () => {
emit("change", {
type: "mobile",
data: state.tableRows,
});
};
var getInputData = () => {
let lastData = [];
let tempObj = {};
state.tableRows.forEach((e) => {
tempObj[e.name] = e;
});
for (const key in tempObj) {
if (key && tempObj[key].value) {
lastData.push(tempObj[key]);
}
}
return lastData;
};
const { tableRows, userLists } = toRefs(state);
//暴露获取数据方法
defineExpose({
getInputData,
initTable,
});
</script>
<style scoped></style>
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
v-model="row.is_enabled"></bg-switch> v-model="row.is_enabled"></bg-switch>
</template> </template>
<template v-slot:created_at="{ row }"> <template v-slot:created_at="{ row }">
{{ row.created_at ? row.created_at.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.created_at) }}
</template> </template>
<template v-slot:action="{ row }"> <template v-slot:action="{ row }">
<bg-table-btns2 :limit="3" :tableData="tableRows"> <bg-table-btns2 :limit="3" :tableData="tableRows">
...@@ -131,6 +131,7 @@ import axios from "@/request/http.js"; ...@@ -131,6 +131,7 @@ 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 { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { dateStringToDate } from "@/components/env";
const METHODS = { const METHODS = {
dingtalk: "钉钉", dingtalk: "钉钉",
sms: "短信", sms: "短信",
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
style="width: 100%" style="width: 100%"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
v-model="date" v-model="logTime"
placeholder="请选择日期" /> placeholder="请选择日期" />
<div class="type_station bg-scroll"> <div class="type_station bg-scroll">
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
@click="nodeClick(item)" @click="nodeClick(item)"
v-for="(item, index) in containerList" v-for="(item, index) in containerList"
:key="index" :key="index"
:title="item.name"> :title="item">
{{ item.name }} {{ item }}
</div> </div>
</div> </div>
</div> </div>
...@@ -28,10 +28,10 @@ ...@@ -28,10 +28,10 @@
<div class="form-filter"> <div class="form-filter">
<el-form :model="filterForm" inline> <el-form :model="filterForm" inline>
<el-form-item label="级别"> <el-form-item label="级别">
<el-select placeholder="全部" style="width: 160px" v-model="filterForm.level"> <el-select placeholder="全部" style="width: 160px" v-model="filterForm.logLevel">
<el-option label="info" value="info"> </el-option> <el-option label="INFO" value="INFO"> </el-option>
<el-option label="warning" value="warning"> </el-option> <el-option label="WARNING" value="WARNING"> </el-option>
<el-option label="error" value="error"> </el-option> <el-option label="ERROR" value="ERROR"> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关键字"> <el-form-item label="关键字">
...@@ -63,37 +63,37 @@ import { ElMessage } from "element-plus"; ...@@ -63,37 +63,37 @@ import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const state = reactive({ const state = reactive({
date: "", logTime: "",
containerList: [], // 容器数据 containerList: [], // 容器数据
selectedNodeContainer: "", selectedNodeContainer: "",
filterForm: { filterForm: {
level: "", logLevel: "",
search: "", search: "",
}, },
logList: [], logList: [],
}); });
watch( watch(
() => state.date, () => state.logTime,
(val) => { (val) => {
state.selectedNodeContainer = ""; state.selectedNodeContainer = "";
getContainerList(); getContainerList();
} }
); );
const nodeClick = (item) => { const nodeClick = (item) => {
state.selectedNodeContainer = item.value; state.selectedNodeContainer = item;
reset(); reset();
}; };
// 获取容器列表 // 获取容器列表
const getContainerList = () => { const getContainerList = () => {
let params = { let params = {
date: state.date, logTime: state.logTime,
}; };
axios axios
.get("/apaas/system/v5/log/system/tree", { params }) .get("/v1/api/log/system/list", { params })
.then((res) => { .then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.containerList = res.data.data || []; state.containerList = res.data.data || [];
state.selectedNodeContainer = state.containerList.length ? state.containerList[0].value : ""; state.selectedNodeContainer = state.containerList.length ? state.containerList[0] : "";
state.selectedNodeContainer ? reset() : (state.logList = []); state.selectedNodeContainer ? reset() : (state.logList = []);
} else { } else {
ElMessage.error(res.data.data); ElMessage.error(res.data.data);
...@@ -106,11 +106,11 @@ const getContainerList = () => { ...@@ -106,11 +106,11 @@ const getContainerList = () => {
//查询 //查询
const search = () => { const search = () => {
let params = { let params = {
index: state.selectedNodeContainer, name: state.selectedNodeContainer,
...state.filterForm, ...state.filterForm,
}; };
axios axios
.get("/apaas/system/v5/log/system/log", { params }) .get("/v1/api/log/system/log", { params })
.then((res) => { .then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.logList = (res.data.data || []).map((item) => JSON.stringify(item)); state.logList = (res.data.data || []).map((item) => JSON.stringify(item));
...@@ -126,7 +126,7 @@ const search = () => { ...@@ -126,7 +126,7 @@ const search = () => {
//重置 //重置
const reset = () => { const reset = () => {
state.filterForm = { state.filterForm = {
level: "", logLevel: "",
search: "", search: "",
}; };
search(); search();
...@@ -135,7 +135,7 @@ onBeforeMount(() => { ...@@ -135,7 +135,7 @@ onBeforeMount(() => {
getContainerList(); getContainerList();
}); });
const { date, containerList, selectedNodeContainer, filterForm, logList } = toRefs(state); const { logTime, containerList, selectedNodeContainer, filterForm, logList } = toRefs(state);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -2,16 +2,11 @@ ...@@ -2,16 +2,11 @@
<div class="page_container"> <div class="page_container">
<bg-breadcrumb></bg-breadcrumb> <bg-breadcrumb></bg-breadcrumb>
<div class="main_container"> <div class="main_container">
<bg-filter-group <bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入账号、手机号和所属组织">
@search="changeSearch"
v-model="filter.search"
placeholder="请输入账号、手机号和所属组织">
<template v-slot:left_action> <template v-slot:left_action>
<div class="apaas_button"> <div class="apaas_button">
<el-button type="primary" @click="exportFile"> <el-button type="primary" @click="exportFile">
<bg-icon <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-file-send"></bg-icon>
style="font-size: 12px; color: #fff; margin-right: 8px"
icon="#bg-ic-file-send"></bg-icon>
导出 导出
</el-button> </el-button>
<el-popconfirm <el-popconfirm
...@@ -36,17 +31,6 @@ ...@@ -36,17 +31,6 @@
<template v-slot:filter_group> <template v-slot:filter_group>
<div class="left-filter filter_list"> <div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">用户类型</span>
<el-select v-model="filter.is_admin" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in userTypeList"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">上次访问时间</span> <span class="filter_title">上次访问时间</span>
<el-date-picker <el-date-picker
...@@ -61,22 +45,14 @@ ...@@ -61,22 +45,14 @@
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">活跃度</span> <span class="filter_title">活跃度</span>
<el-select v-model="filter.active" placeholder="请选择" style="width: 300px"> <el-select v-model="filter.active" placeholder="请选择" style="width: 300px">
<el-option <el-option v-for="(item, index) in activeOptions" :key="index" :label="item.label" :value="item.value">
v-for="(item, index) in activeOptions"
:key="index"
:label="item.label"
:value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">密码强度</span> <span class="filter_title">密码强度</span>
<el-select v-model="filter.pwd_level" placeholder="请选择" style="width: 300px"> <el-select v-model="filter.pwd_level" placeholder="请选择" style="width: 300px">
<el-option <el-option v-for="(item, index) in pwdLevelList" :key="index" :label="item.label" :value="item.value">
v-for="(item, index) in pwdLevelList"
:key="index"
:label="item.label"
:value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
...@@ -137,7 +113,7 @@ ...@@ -137,7 +113,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="filter.page" :page="filter.page"
:size="filter.limit" :size="filter.page_size"
:total="filter.total" :total="filter.total"
@change-page="changePage" @change-page="changePage"
@change-size="changeSize"> @change-size="changeSize">
...@@ -168,12 +144,11 @@ const accountTable = ref(null); ...@@ -168,12 +144,11 @@ const accountTable = ref(null);
const state = reactive({ const state = reactive({
filter: { filter: {
search: "", search: "",
is_admin: "",
time: [], time: [],
active: 0, active: 0,
pwd_level: "", pwd_level: "",
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}, },
activeOptions: [ activeOptions: [
...@@ -200,11 +175,6 @@ const state = reactive({ ...@@ -200,11 +175,6 @@ const state = reactive({
prop: "contact_phone", prop: "contact_phone",
// minWidth: 360, // minWidth: 360,
}, },
{
label: "用户类型",
prop: "is_admin",
// width: 200,
},
{ {
label: "所属组织", label: "所属组织",
prop: "name", prop: "name",
...@@ -252,14 +222,13 @@ const exportFile = () => { ...@@ -252,14 +222,13 @@ const exportFile = () => {
params.end_at = params.time ? params.time[1] || "" : ""; params.end_at = params.time ? params.time[1] || "" : "";
delete params.time; delete params.time;
axios axios
.get(`/apaas/system/v5/log/userAccountAudit/list/export`, { .get(`/v1/api/log/userAccountAudit/list/export`, {
params, params,
responseType: "blob", responseType: "blob",
}) })
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
const type = const type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
downloadBlob(res.data, type); downloadBlob(res.data, type);
} else { } else {
ElMessage.error(res.statusText); ElMessage.error(res.statusText);
...@@ -273,7 +242,7 @@ const forceModifyPwd = () => { ...@@ -273,7 +242,7 @@ const forceModifyPwd = () => {
const selectedRows = Object.values(selectedObj); const selectedRows = Object.values(selectedObj);
if (!selectedRows.length) return ElMessage.warning("请先选择修改项"); if (!selectedRows.length) return ElMessage.warning("请先选择修改项");
const ids = selectedRows.map((item) => item.id); const ids = selectedRows.map((item) => item.id);
axios.post("/apaas/system/v5/user/resetpwd", { ids }).then((res) => { axios.post("/v1/api/user/resetPwd", { ids }).then((res) => {
if (res.data.code === 200) { if (res.data.code === 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
cleanSelected(); cleanSelected();
...@@ -301,7 +270,7 @@ const getTableRows = () => { ...@@ -301,7 +270,7 @@ const getTableRows = () => {
params.end_at = params.time ? params.time[1] || "" : ""; params.end_at = params.time ? params.time[1] || "" : "";
delete params.time; delete params.time;
axios axios
.get(`/apaas/system/v5/log/userAccountAudit/list`, { .get(`/v1/api/log/userAccountAudit/list`, {
params, params,
}) })
.then((res) => { .then((res) => {
...@@ -317,18 +286,17 @@ const filterAction = () => { ...@@ -317,18 +286,17 @@ const filterAction = () => {
changePage(1); changePage(1);
}; };
const changeSize = (size) => { const changeSize = (size) => {
state.filter.limit = size; state.filter.page_size = size;
changePage(1); changePage(1);
}; };
const filterClear = () => { const filterClear = () => {
state.filter = { state.filter = {
search: "", search: "",
is_admin: "",
time: [], time: [],
active: 0, active: 0,
pwd_level: "", pwd_level: "",
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}; };
changePage(1); changePage(1);
......
...@@ -45,11 +45,6 @@ const instanceData = reactive({ ...@@ -45,11 +45,6 @@ const instanceData = reactive({
label: "手机号", label: "手机号",
value: "", value: "",
}, },
{
key: "user_type",
label: "用户类型",
value: "",
},
{ {
key: "org_name", key: "org_name",
label: "所属组织", label: "所属组织",
...@@ -121,7 +116,7 @@ onBeforeMount(() => { ...@@ -121,7 +116,7 @@ onBeforeMount(() => {
}); });
const getDetailInfo = () => { const getDetailInfo = () => {
axios axios
.get(`/apaas/system/v5/log/userBehavior/detail/${route.query.id}`) .get(`/v1/api/log/userBehavior/detail/${route.query.id}`)
.then((res) => { .then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
const result = res.data.data || {}; const result = res.data.data || {};
......
...@@ -2,16 +2,11 @@ ...@@ -2,16 +2,11 @@
<div class="page_container"> <div class="page_container">
<bg-breadcrumb></bg-breadcrumb> <bg-breadcrumb></bg-breadcrumb>
<div class="main_container"> <div class="main_container">
<bg-filter-group <bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入账号、手机号和所属组织">
@search="changeSearch"
v-model="filter.search"
placeholder="请输入账号、手机号和所属组织">
<template v-slot:left_action> <template v-slot:left_action>
<div class="apaas_button"> <div class="apaas_button">
<el-button type="primary" @click="exportFile"> <el-button type="primary" @click="exportFile">
<bg-icon <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-file-send"></bg-icon>
style="font-size: 12px; color: #fff; margin-right: 8px"
icon="#bg-ic-file-send"></bg-icon>
导出 导出
</el-button> </el-button>
<el-button @click="deleteBatch"> 批量删除 </el-button> <el-button @click="deleteBatch"> 批量删除 </el-button>
...@@ -25,17 +20,6 @@ ...@@ -25,17 +20,6 @@
<template v-slot:filter_group> <template v-slot:filter_group>
<div class="left-filter filter_list"> <div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">用户类型</span>
<el-select v-model="filter.is_admin" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in userTypeList"
:key="index"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">操作时间</span> <span class="filter_title">操作时间</span>
<el-date-picker <el-date-picker
...@@ -61,11 +45,7 @@ ...@@ -61,11 +45,7 @@
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">请求方式</span> <span class="filter_title">请求方式</span>
<el-select v-model="filter.req_method" placeholder="请选择" style="width: 300px"> <el-select v-model="filter.req_method" placeholder="请选择" style="width: 300px">
<el-option <el-option v-for="(item, index) in reqMethodList" :key="index" :label="item.label" :value="item.value">
v-for="(item, index) in reqMethodList"
:key="index"
:label="item.label"
:value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
...@@ -88,16 +68,7 @@ ...@@ -88,16 +68,7 @@
</template> </template>
</bg-filter-group> </bg-filter-group>
<div class="table_container"> <div class="table_container">
<bg-table <bg-table ref="userTable" :headers="headers" :rows="tableRows" :stripe="true" select @selectAc="selectChange">
ref="userTable"
:headers="headers"
:rows="tableRows"
:stripe="true"
select
@selectAc="selectChange">
<template v-slot:is_admin="{ row }">
<span>{{ userTypeConfig[row.is_admin] }}</span>
</template>
<template v-slot:operate_type="{ row }"> <template v-slot:operate_type="{ row }">
<span>{{ filterOperateType(row.operate_type) }}</span> <span>{{ filterOperateType(row.operate_type) }}</span>
</template> </template>
...@@ -118,7 +89,7 @@ ...@@ -118,7 +89,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="filter.page" :page="filter.page"
:size="filter.limit" :size="filter.page_size"
:total="filter.total" :total="filter.total"
@change-page="changePage" @change-page="changePage"
@change-size="changeSize"> @change-size="changeSize">
...@@ -163,13 +134,12 @@ const userTypeList = computed(() => { ...@@ -163,13 +134,12 @@ const userTypeList = computed(() => {
const state = reactive({ const state = reactive({
filter: { filter: {
search: "", search: "",
is_admin: "",
time: [], time: [],
operate_type: "", operate_type: "",
req_method: "", req_method: "",
operate_status: "", operate_status: "",
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}, },
operateStatusList: [ operateStatusList: [
...@@ -184,11 +154,6 @@ const state = reactive({ ...@@ -184,11 +154,6 @@ const state = reactive({
prop: "system_account", prop: "system_account",
// minWidth: 280, // minWidth: 280,
}, },
{
label: "用户类型",
prop: "is_admin",
// minWidth: 360,
},
{ {
label: "系统模块", label: "系统模块",
prop: "system_module", prop: "system_module",
...@@ -259,8 +224,7 @@ const state = reactive({ ...@@ -259,8 +224,7 @@ const state = reactive({
deleteTips: "", deleteTips: "",
}); });
const { filter, operateStatusList, headers, selectedNum, tableRows, deleteDialog, deleteTips } = const { filter, operateStatusList, headers, selectedNum, tableRows, deleteDialog, deleteTips } = toRefs(state);
toRefs(state);
//导出 //导出
const exportFile = () => { const exportFile = () => {
let params = { ...state.filter }; let params = { ...state.filter };
...@@ -269,14 +233,13 @@ const exportFile = () => { ...@@ -269,14 +233,13 @@ const exportFile = () => {
delete params.time; delete params.time;
delete params.total; delete params.total;
axios axios
.get(`/apaas/system/v5/log/userBehavior/list/export`, { .get(`/v1/api/log/userBehavior/list/export`, {
params, params,
responseType: "blob", responseType: "blob",
}) })
.then((res) => { .then((res) => {
if (res.status === 200) { if (res.status === 200) {
const type = const type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
downloadBlob(res.data, type); downloadBlob(res.data, type);
} else { } else {
ElMessage.error(res.statusText); ElMessage.error(res.statusText);
...@@ -316,7 +279,7 @@ const deleteCurrent = (row) => { ...@@ -316,7 +279,7 @@ const deleteCurrent = (row) => {
const confirmDelete = () => { const confirmDelete = () => {
const ids = state.selectedRows.map((item) => item.id); const ids = state.selectedRows.map((item) => item.id);
axios axios
.delete(`/apaas/system/v5/log/userBehavior/delete?ids=${ids.join(",")}`) .delete(`/v1/api/log/userBehavior/delete?ids=${ids.join(",")}`)
.then((res) => { .then((res) => {
if (res.data.code === 200) { if (res.data.code === 200) {
ElMessage.success(res.data.data); ElMessage.success(res.data.data);
...@@ -348,7 +311,7 @@ const getTableRows = () => { ...@@ -348,7 +311,7 @@ const getTableRows = () => {
params.end_at = params.time ? params.time[1] || "" : ""; params.end_at = params.time ? params.time[1] || "" : "";
delete params.time; delete params.time;
axios axios
.get(`/apaas/system/v5/log/userBehavior/list`, { .get(`/v1/api/log/userBehavior/list`, {
params, params,
}) })
.then((res) => { .then((res) => {
...@@ -364,19 +327,18 @@ const filterAction = () => { ...@@ -364,19 +327,18 @@ const filterAction = () => {
changePage(1); changePage(1);
}; };
const changeSize = (size) => { const changeSize = (size) => {
state.filter.limit = size; state.filter.page_size = size;
changePage(1); changePage(1);
}; };
const filterClear = () => { const filterClear = () => {
state.filter = { state.filter = {
search: "", search: "",
is_admin: "",
time: [], time: [],
operate_type: "", operate_type: "",
req_method: "", req_method: "",
operate_status: "", operate_status: "",
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}; };
changePage(1); changePage(1);
...@@ -384,7 +346,7 @@ const filterClear = () => { ...@@ -384,7 +346,7 @@ const filterClear = () => {
const goDetail = (row) => { const goDetail = (row) => {
router.push({ router.push({
path: "/log/userBehavior/detail", path: "/system-admin/log/userBehavior/detail",
query: { query: {
id: row.id, id: row.id,
}, },
......
...@@ -155,7 +155,7 @@ watch( ...@@ -155,7 +155,7 @@ watch(
); // 树形搜索值 ); // 树形搜索值
const getMenuTree = (type, id) => { const getMenuTree = (type, id) => {
axios.get(`/apaas/system/v5/menu/tree`).then((res) => { axios.get(`/v1/api/menu/tree`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.data = res.data.data || []; state.data = res.data.data || [];
nextTick().then(() => { nextTick().then(() => {
...@@ -409,7 +409,7 @@ const fileAction = (val, data, parent, disabled = false) => { ...@@ -409,7 +409,7 @@ const fileAction = (val, data, parent, disabled = false) => {
const deleteData = () => { const deleteData = () => {
if (state.selectData.id) { if (state.selectData.id) {
axios.delete(`/apaas/system/v5/menu/${state.selectData.id}`).then((res) => { axios.delete(`/v1/api/menu/${state.selectData.id}`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
state.selectData = null; state.selectData = null;
...@@ -446,7 +446,7 @@ const changeSort = (data, nextObj) => { ...@@ -446,7 +446,7 @@ const changeSort = (data, nextObj) => {
sort: data.sort, sort: data.sort,
}, },
]; ];
axios.put(`/apaas/system/v5/menu/sort`, params).then((res) => { axios.put(`/v1/api/menu/sort`, params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
getMenuTree(); getMenuTree();
...@@ -477,7 +477,7 @@ const saveMenu = (el, type) => { ...@@ -477,7 +477,7 @@ const saveMenu = (el, type) => {
}; };
if (state.selectData.id) { if (state.selectData.id) {
// 编辑 // 编辑
axios.put(`/apaas/system/v5/menu/${state.selectData.id}`, params).then((res) => { axios.put(`/v1/api/menu/${state.selectData.id}`, params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
getMenuTree(); getMenuTree();
...@@ -500,7 +500,7 @@ const saveMenu = (el, type) => { ...@@ -500,7 +500,7 @@ const saveMenu = (el, type) => {
// 新增下级 // 新增下级
params.p_menu_id = state.selectParentData.menu_id; params.p_menu_id = state.selectParentData.menu_id;
} }
axios.post(`/apaas/system/v5/menu/add`, params).then((res) => { axios.post(`/v1/api/menu/add`, params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
state.selectData = null; state.selectData = null;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
</el-form-item> </el-form-item>
<el-form-item label="分组" prop="dict_group_id" v-if="!topLevel"> <el-form-item label="分组" prop="dict_group_id" v-if="!topLevel">
<el-select v-model="menuForm.dict_group_id" :disabled="groupFlag" placeholder="请选择分组"> <el-select v-model="menuForm.dict_group_id" :disabled="groupFlag" placeholder="请选择分组">
<el-option v-for="item in groupList" :key="item.dict_id" :label="item.dict_name" :value="item.dict_id" /> <el-option v-for="item in groupList" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="跳转方式" prop="new_window" v-if="menuForm.menu_type != 0"> <el-form-item label="跳转方式" prop="new_window" v-if="menuForm.menu_type != 0">
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
</el-form-item> </el-form-item>
<el-form-item label="系统类型" prop="system_type" v-if="topLevel"> <el-form-item label="系统类型" prop="system_type" v-if="topLevel">
<el-select v-model="menuForm.system_type" placeholder="请选择系统类型"> <el-select v-model="menuForm.system_type" placeholder="请选择系统类型">
<el-option v-for="item in systemGroupList" :key="item.dict_id" :label="item.dict_name" :value="item.dict_id" /> <el-option v-for="item in systemGroupList" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="是否启用" prop="state"> <el-form-item label="是否启用" prop="state">
...@@ -140,7 +140,13 @@ const state = reactive({ ...@@ -140,7 +140,13 @@ const state = reactive({
const getGroupList = () => { const getGroupList = () => {
axios axios
.get(`/apaas/system/v5/menu/group/dict`) .get(`/v1/api/dict`, {
params: {
class: 5,
page: 1,
page_size: 100,
},
})
.then((res) => { .then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.groupList = res.data.data || []; state.groupList = res.data.data || [];
...@@ -155,7 +161,13 @@ const getGroupList = () => { ...@@ -155,7 +161,13 @@ const getGroupList = () => {
const getSystemGroup = () => { const getSystemGroup = () => {
axios axios
.get(`/apaas/system/v5/menu/system/dict`) .get(`/v1/api/dict`, {
params: {
class: 4,
page: 1,
page_size: 100,
},
})
.then((res) => { .then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.systemGroupList = res.data.data || []; state.systemGroupList = res.data.data || [];
......
...@@ -41,13 +41,15 @@ import { reactive, toRefs, ref } from "vue"; ...@@ -41,13 +41,15 @@ import { reactive, toRefs, ref } from "vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
const props = defineProps({ const state = reactive({
authorizeFormData: { authorizeFormData: {
type: Object, id: "",
default: () => ({}), system_version: "",
system_user: "",
license: "",
license_dead_date: "",
license_inform_day: "",
}, },
});
const state = reactive({
authorizeRules: { authorizeRules: {
license_inform_day: [{ type: "number", min: 0, max: 90, message: "请输入0~90的整数", trigger: "blur" }], license_inform_day: [{ type: "number", min: 0, max: 90, message: "请输入0~90的整数", trigger: "blur" }],
}, },
...@@ -57,7 +59,7 @@ const authorizeFormRef = ref(null); ...@@ -57,7 +59,7 @@ const authorizeFormRef = ref(null);
const getLicenseInfo = () => { const getLicenseInfo = () => {
if (!state.authorizeFormData.license) return; if (!state.authorizeFormData.license) return;
axios axios
.post("/apaas/system/v5/sysOptions/getLicenseInfo", { .post("/v1/api/sysOptions/getLicenseInfo", {
license: state.authorizeFormData.license, license: state.authorizeFormData.license,
}) })
.then((res) => { .then((res) => {
...@@ -70,14 +72,20 @@ const getLicenseInfo = () => { ...@@ -70,14 +72,20 @@ const getLicenseInfo = () => {
} }
}); });
}; };
//设置表单数据
const setFormData = (data) => {
Object.keys(state.authorizeFormData).forEach((item) => {
state.authorizeFormData[item] = data[item];
});
};
//保存 //保存
const save = () => { const save = () => {
authorizeFormRef.value.validate((valid) => { authorizeFormRef.value.validate((valid) => {
if (valid) { if (valid) {
params = { let params = {
...props.authorizeFormData, ...state.authorizeFormData,
}; };
axios.post("/apaas/system/v5/sysOptions/licenseOpts", params).then((res) => { axios.post("/v1/api/sysOptions/licenseOpts", params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
} else { } else {
...@@ -87,8 +95,9 @@ const save = () => { ...@@ -87,8 +95,9 @@ const save = () => {
} }
}); });
}; };
const { authorizeRules } = toRefs(state); const { authorizeFormData, authorizeRules } = toRefs(state);
defineExpose({ defineExpose({
setFormData,
save, save,
}); });
</script> </script>
...@@ -20,19 +20,13 @@ ...@@ -20,19 +20,13 @@
</div> </div>
<div class="right_container bgc_white"> <div class="right_container bgc_white">
<!-- license授权表单 --> <!-- license授权表单 -->
<authorityForm <authorityForm ref="authorityFormRef" v-if="activeIndex == 1"></authorityForm>
ref="authorityFormRef"
v-if="activeIndex == 1"
:authorizeFormData="authorizeFormData"></authorityForm>
<loginPageForm <loginPageForm ref="loginPageFormRef" v-if="activeIndex == 2"></loginPageForm>
ref="loginPageFormRef"
v-if="activeIndex == 2"
:loginPageFormData="loginPageFormData"></loginPageForm>
<!-- 安全相关表单 --> <!-- 安全相关表单 -->
<secureForm ref="secureFormRef" v-if="activeIndex == 3" :secureFormData="secureFormData"></secureForm> <secureForm ref="secureFormRef" v-if="activeIndex == 3"></secureForm>
<!-- 登录注册配置表单 --> <!-- 登录注册配置表单 -->
<registerForm ref="registerFormRef" v-if="activeIndex == 4" :registerFormData="registerFormData"></registerForm> <registerForm ref="registerFormRef" v-if="activeIndex == 4"></registerForm>
<div class="operate_btns"> <div class="operate_btns">
<el-button type="primary" @click="save"> 保存 </el-button> <el-button type="primary" @click="save"> 保存 </el-button>
</div> </div>
...@@ -51,7 +45,7 @@ ...@@ -51,7 +45,7 @@
</template> </template>
<script setup> <script setup>
import { reactive, toRefs, onBeforeMount, ref } from "vue"; import { reactive, toRefs, onBeforeMount, ref, nextTick } from "vue";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import authorityForm from "./authorityForm.vue"; import authorityForm from "./authorityForm.vue";
...@@ -65,73 +59,45 @@ const loginPageFormRef = ref(null); ...@@ -65,73 +59,45 @@ const loginPageFormRef = ref(null);
const secureFormRef = ref(null); const secureFormRef = ref(null);
const registerFormRef = ref(null); const registerFormRef = ref(null);
const state = reactive({ 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, activeIndex: 1,
restoreDialog: false, restoreDialog: false,
//首选项配置数据
sysOptions: {},
}); });
const { authorizeFormData, loginPageFormData, secureFormData, registerFormData, activeIndex, restoreDialog } = const { activeIndex, restoreDialog } = toRefs(state);
toRefs(state);
onBeforeMount(() => { onBeforeMount(() => {
getPreferenceConfig(); getPreferenceConfig();
}); });
//切换菜单选项 //切换菜单选项
const switchMenu = (index) => { const switchMenu = (index) => {
state.activeIndex = index; state.activeIndex = index;
nextTick(() => {
switch (index) {
case "1":
authorityFormRef.value.setFormData(state.sysOptions);
break;
case "2":
loginPageFormRef.value.setFormData(state.sysOptions);
break;
case "3":
secureFormRef.value.setFormData(state.sysOptions);
break;
case "4":
registerFormRef.value.setFormData(state.sysOptions);
break;
default:
break;
}
});
}; };
//获取首选项配置 //获取首选项配置
const getPreferenceConfig = () => { const getPreferenceConfig = () => {
axios.get("/apaas/system/v5/sysOptions").then((res) => { axios.get("/v1/api/sysOptions").then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
let data = res.data.data; let data = res.data.data;
Object.keys(state.authorizeFormData).forEach((item) => { state.sysOptions = data;
state.authorizeFormData[item] = data[item]; authorityFormRef.value.setFormData(data);
});
Object.keys(state.secureFormData).forEach((item) => {
state.secureFormData[item] = data[item];
});
Object.keys(state.registerFormData).forEach((item) => {
state.registerFormData[item] = data[item];
});
} else { } else {
ElMessage.error(res.data.data); ElMessage.error(res.data.data);
} }
...@@ -141,16 +107,16 @@ const getPreferenceConfig = () => { ...@@ -141,16 +107,16 @@ const getPreferenceConfig = () => {
//保存表单项 //保存表单项
const save = () => { const save = () => {
switch (state.activeIndex) { switch (state.activeIndex) {
case 1: case "1":
authorityFormRef.value.save(); authorityFormRef.value.save();
break; break;
case 2: case "2":
loginPageFormRef.value.save(); loginPageFormRef.value.save();
break; break;
case 3: case "3":
secureFormRef.value.save(); secureFormRef.value.save();
break; break;
case 4: case "4":
registerFormRef.value.save(); registerFormRef.value.save();
break; break;
default: default:
......
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
:rules="loginPageRules" :rules="loginPageRules"
label-width="96px" label-width="96px"
class="registerForm"> class="registerForm">
<el-form-item label="LOGO" prop="logoUrl"> <el-form-item label="LOGO" prop="logo">
<bg-upload-image <bg-upload-image
v-model="loginPageFormData.logoUrl" v-model="loginPageFormData.logo"
:showTips="true" :showTips="true"
customTips="请选择图片上传:支持jpg、png等格式,图片需小于500KB" customTips="请选择图片上传:支持jpg、png等格式,图片需小于500KB"
:fileSize="500" :fileSize="500"
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
@change="changeLogo" @change="changeLogo"
:accept="['.jpg', '.jpeg', '.png']"></bg-upload-image> :accept="['.jpg', '.jpeg', '.png']"></bg-upload-image>
</el-form-item> </el-form-item>
<el-form-item label="登录背景图" prop="backgroundUrl"> <el-form-item label="登录背景图" prop="bg_image">
<bg-upload-image <bg-upload-image
v-model="loginPageFormData.backgroundUrl" v-model="loginPageFormData.bg_image"
:fileSize="2" :fileSize="2"
:showTips="true" :showTips="true"
customTips="请选择图片上传:大小1920 * 1026像素支持jpg、png等格式,图片需小于2MB" customTips="请选择图片上传:大小1920 * 1026像素支持jpg、png等格式,图片需小于2MB"
...@@ -30,41 +30,37 @@ ...@@ -30,41 +30,37 @@
:accept="['.jpg', '.jpeg', '.png']"></bg-upload-image> :accept="['.jpg', '.jpeg', '.png']"></bg-upload-image>
</el-form-item> </el-form-item>
<bg-form-gap title="底部所有权内容"></bg-form-gap> <bg-form-gap title="底部所有权内容"></bg-form-gap>
<el-form-item label="内容" prop="patent"> <el-form-item label="内容" prop="bottom_title">
<el-input <el-input
v-model.trim="loginPageFormData.patent" v-model.trim="loginPageFormData.bottom_title"
placeholder="例如:Copyright © 某某大数据, All Rights Reserved."></el-input> placeholder="例如:Copyright © 某某大数据, All Rights Reserved."></el-input>
</el-form-item> </el-form-item>
<bg-form-gap title="底部ICP备案"></bg-form-gap> <bg-form-gap title="底部ICP备案"></bg-form-gap>
<el-form-item label="内容" prop="icpFiling"> <el-form-item label="内容" prop="icp">
<el-input placeholder="请输入" v-model.trim="loginPageFormData.icpFiling"></el-input> <el-input placeholder="请输入" v-model.trim="loginPageFormData.icp"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="跳转连接" prop="icpUrl"> <el-form-item label="跳转连接" prop="icp_url">
<el-input placeholder="例如:https://...或http://..." v-model.trim="loginPageFormData.icpUrl"></el-input> <el-input placeholder="例如:https://...或http://..." v-model.trim="loginPageFormData.icp_url"></el-input>
</el-form-item> </el-form-item>
<bg-form-gap title="底部公安网备案"></bg-form-gap> <bg-form-gap title="底部公安网备案"></bg-form-gap>
<el-form-item label="内容" prop="publicSecurityFiling"> <el-form-item label="内容" prop="police">
<el-input placeholder="请输入" v-model.trim="loginPageFormData.publicSecurityFiling"></el-input> <el-input placeholder="请输入" v-model.trim="loginPageFormData.police"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="跳转连接" prop="publicSecurityUrl"> <el-form-item label="跳转连接" prop="police_url">
<el-input <el-input placeholder="例如:https://...或http://..." v-model.trim="loginPageFormData.police_url"></el-input>
placeholder="例如:https://...或http://..."
v-model.trim="loginPageFormData.publicSecurityUrl"></el-input>
</el-form-item> </el-form-item>
<bg-form-gap title="法律声明"></bg-form-gap> <bg-form-gap title="法律声明"></bg-form-gap>
<el-form-item label="跳转连接" prop="legalStatementUrl"> <el-form-item label="跳转连接" prop="legal_notice">
<el-input <el-input placeholder="例如:https://...或http://..." v-model.trim="loginPageFormData.legal_notice"></el-input>
placeholder="例如:https://...或http://..."
v-model.trim="loginPageFormData.legalStatementUrl"></el-input>
</el-form-item> </el-form-item>
<bg-form-gap title="隐私政策"></bg-form-gap> <bg-form-gap title="隐私政策"></bg-form-gap>
<el-form-item label="跳转连接" prop="privacyPolicyUrl"> <el-form-item label="跳转连接" prop="privacy_policy">
<el-input <el-input
placeholder="例如:https://...或http://..." placeholder="例如:https://...或http://..."
v-model.trim="loginPageFormData.privacyPolicyUrl"></el-input> v-model.trim="loginPageFormData.privacy_policy"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
...@@ -76,41 +72,59 @@ import { ElMessage } from "element-plus"; ...@@ -76,41 +72,59 @@ import { ElMessage } from "element-plus";
import { validateLink } from "@/services/rules.js"; import { validateLink } from "@/services/rules.js";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
const props = defineProps({
loginPageFormData: {
type: Object,
default: () => ({}),
},
});
const loginPageRef = ref(null); const loginPageRef = ref(null);
const state = reactive({ const state = reactive({
loginPageFormData: {
id: "",
logo: [],
bg_image: [],
bottom_title: "",
icp: "",
icp_url: "",
police: "",
police_url: "",
legal_notice: "",
privacy_policy: "",
},
loginPageRules: { loginPageRules: {
logoUrl: [{ required: true, message: "请上传Logo", trigger: "change" }], logo: [{ required: true, message: "请上传Logo", trigger: "change" }],
backgroundUrl: [{ required: true, message: "请上传背景图", trigger: "change" }], bg_image: [{ required: true, message: "请上传背景图", trigger: "change" }],
icpUrl: [{ validator: validateLink, trigger: "blur" }], icp_url: [{ validator: validateLink, trigger: "blur" }],
publicSecurityUrl: [{ validator: validateLink, trigger: "blur" }], police_url: [{ validator: validateLink, trigger: "blur" }],
legalStatementUrl: [{ validator: validateLink, trigger: "blur" }], legal_notice: [{ validator: validateLink, trigger: "blur" }],
privacyPolicyUrl: [{ validator: validateLink, trigger: "blur" }], privacy_policy: [{ validator: validateLink, trigger: "blur" }],
}, },
}); });
const changeLogo = (value) => { const changeLogo = (value) => {
if (value && value.length > 0) { if (value && value.length > 0) {
loginPageRef.value.clearValidate("logoUrl"); loginPageRef.value.clearValidate("logo");
} }
}; };
const changeBanner = (value) => { const changeBanner = (value) => {
if (value && value.length > 0) { if (value && value.length > 0) {
refForm.value.clearValidate("backgroundUrl"); loginPageRef.value.clearValidate("bg_image");
} }
}; };
//设置表单数据
const setFormData = (data) => {
Object.keys(state.loginPageFormData).forEach((item) => {
if (["bg_image", "logo"].includes(item)) {
state.loginPageFormData[item] = data[item] ? JSON.parse(data[item]) : [];
return;
}
state.loginPageFormData[item] = data[item];
});
};
//保存 //保存
const save = () => { const save = () => {
loginPageRef.value.validate((valid) => { loginPageRef.value.validate((valid) => {
if (valid) { if (valid) {
params = { let params = {
...props.loginPageFormData, ...state.loginPageFormData,
}; };
axios.post("/apaas/system/v5/sysOptions/licenseOpts", params).then((res) => { params.logo = JSON.stringify(params.logo);
params.bg_image = JSON.stringify(params.bg_image);
axios.post("/v1/api/sysOptions/loginPageOpts", params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
} else { } else {
...@@ -120,8 +134,9 @@ const save = () => { ...@@ -120,8 +134,9 @@ const save = () => {
} }
}); });
}; };
const { loginPageRules } = toRefs(state); const { loginPageFormData, loginPageRules } = toRefs(state);
defineExpose({ defineExpose({
setFormData,
save, save,
}); });
</script> </script>
......
<template> <template>
<el-form <div>
ref="registerFormRef" <el-form
:model="registerFormData" ref="registerFormRef"
:rules="registerRules" :model="registerFormData"
label-width="125px" :rules="registerRules"
class="registerForm"> label-width="125px"
<bg-form-gap title="登录受限配置"></bg-form-gap> class="registerForm">
<el-form-item label="登录受限是否启用" prop="login_config_state"> <bg-form-gap title="登录受限配置"></bg-form-gap>
<bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="registerFormData.login_config_state"></bg-switch> <el-form-item label="登录受限是否启用" prop="login_config_state">
</el-form-item> <bg-switch :labels="['否', '是']" :values="[0, 1]" v-model="registerFormData.login_config_state"></bg-switch>
<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> </el-form-item>
<span>小时内</span> <div class="input_password_config" v-if="registerFormData.login_config_state == 1">
<el-form-item prop="login_pwd_error" label-width="0"> <span></span>
<el-input <el-form-item prop="login_limit_time" label-width="0">
placeholder="请输入密码输错次数" <el-input
v-model.trim.number="registerFormData.login_pwd_error" placeholder="请输入小时数"
maxlength="3"></el-input> v-model.trim.number="registerFormData.login_limit_time"
</el-form-item> maxlength="3"></el-input>
<span>次输错密码,自动锁定</span> </el-form-item>
<el-form-item prop="login_lock_time" label-width="0"> <span>小时内</span>
<el-input <el-form-item prop="login_pwd_error" label-width="0">
placeholder="请输入分钟数" <el-input
v-model.trim.number="registerFormData.login_lock_time" placeholder="请输入密码输错次数"
maxlength="3"></el-input> v-model.trim.number="registerFormData.login_pwd_error"
</el-form-item> maxlength="3"></el-input>
<span>分钟</span> </el-form-item>
<el-button type="primary" @click="restoreDialog = true">一键还原受限</el-button> <span>次输错密码,自动锁定</span>
<el-tooltip placement="top-start" effect="light"> <el-form-item prop="login_lock_time" label-width="0">
<template #content> <el-input
<span>必须为大于0的正整数且不能为空</span> placeholder="请输入分钟数"
<br /> v-model.trim.number="registerFormData.login_lock_time"
<span>一键还原按钮将所有锁定的账号解锁并将输错次数还原</span> maxlength="3"></el-input>
</template> </el-form-item>
<div class="tip-image"></div> <span>分钟</span>
</el-tooltip> <el-button type="primary" @click="restoreDialog = true">一键还原受限</el-button>
</div> <el-tooltip placement="top-start" effect="light">
<bg-form-gap title="注册配置"></bg-form-gap> <template #content>
<el-form-item label="允许注册" prop="register_config_state"> <span>必须为大于0的正整数且不能为空</span>
<el-radio-group v-model="registerFormData.register_config_state"> <br />
<el-radio :label="1"></el-radio> <span>一键还原按钮将所有锁定的账号解锁并将输错次数还原</span>
<el-radio :label="0"></el-radio> </template>
</el-radio-group> <div class="tip-image"></div>
</el-form-item> </el-tooltip>
</el-form> </div>
</el-form>
<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 setup>
...@@ -58,14 +62,15 @@ import { ElMessage } from "element-plus"; ...@@ -58,14 +62,15 @@ import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
const registerFormRef = ref(null); const registerFormRef = ref(null);
const props = defineProps({
registerFormData: {
type: Object,
default: () => ({}),
},
});
const state = reactive({ const state = reactive({
registerFormData: {
id: "",
login_config_state: 0,
login_limit_time: "",
login_pwd_error: "",
login_lock_time: "",
},
registerRules: { registerRules: {
login_limit_time: [ login_limit_time: [
{ {
...@@ -92,20 +97,39 @@ const state = reactive({ ...@@ -92,20 +97,39 @@ const state = reactive({
}, },
], ],
}, },
//一键还原受限弹框
restoreDialog: false,
}); });
//设置表单数据
const setFormData = (data) => {
Object.keys(state.registerFormData).forEach((item) => {
state.registerFormData[item] = data[item];
});
};
//一键还原受限确定
const confirm = () => {
axios.post(`/v1/api/sysOptions/reStartConfig`).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
state.restoreDialog = false;
} else {
ElMessage.error(res.data.data);
}
});
};
//保存 //保存
const save = () => { const save = () => {
registerFormRef.value.validate((valid) => { registerFormRef.value.validate((valid) => {
if (valid) { if (valid) {
params = { let params = {
...props.registerFormData, ...state.registerFormData,
}; };
if (params.login_config_state == 0) { if (params.login_config_state == 0) {
params.login_limit_time = 0; params.login_limit_time = 0;
params.login_pwd_error = 0; params.login_pwd_error = 0;
params.login_lock_time = 0; params.login_lock_time = 0;
} }
axios.post("/apaas/system/v5/sysOptions/loginOpts", params).then((res) => { axios.post("/v1/api/sysOptions/loginOpts", params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
} else { } else {
...@@ -115,8 +139,9 @@ const save = () => { ...@@ -115,8 +139,9 @@ const save = () => {
} }
}); });
}; };
const { registerRules } = toRefs(state); const { registerFormData, registerRules, restoreDialog } = toRefs(state);
defineExpose({ defineExpose({
setFormData,
save, save,
}); });
</script> </script>
...@@ -79,15 +79,17 @@ import { ElMessage } from "element-plus"; ...@@ -79,15 +79,17 @@ import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
const secureFormRef = ref(null); const secureFormRef = ref(null);
const props = defineProps({
secureFormData: {
type: Object,
default: () => ({}),
},
});
const session_validity_max = window.defaultConfig.session_validity_max; const session_validity_max = window.defaultConfig.session_validity_max;
const state = reactive({ const state = reactive({
secureFormData: {
id: "",
min_pwd_level: "",
force_update_state: 0,
pwd_validity: "",
session_validity: "",
access_rule_state: "",
},
//安全相关表单校验规则 //安全相关表单校验规则
secureRules: { secureRules: {
pwd_validity: [ pwd_validity: [
...@@ -108,14 +110,20 @@ const state = reactive({ ...@@ -108,14 +110,20 @@ const state = reactive({
], ],
}, },
}); });
//设置表单数据
const setFormData = (data) => {
Object.keys(state.secureFormData).forEach((item) => {
state.secureFormData[item] = data[item];
});
};
//保存 //保存
const save = () => { const save = () => {
secureFormRef.value.validate((valid) => { secureFormRef.value.validate((valid) => {
if (valid) { if (valid) {
params = { let params = {
...props.secureFormData, ...state.secureFormData,
}; };
axios.post("/apaas/system/v5/sysOptions/safeOpts", params).then((res) => { axios.post("/v1/api/sysOptions/safeOpts", params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
} else { } else {
...@@ -125,9 +133,10 @@ const save = () => { ...@@ -125,9 +133,10 @@ const save = () => {
} }
}); });
}; };
const { secureRules } = toRefs(state); const { secureFormData, secureRules } = toRefs(state);
defineExpose({ defineExpose({
setFormData,
save, save,
}); });
</script> </script>
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="pageConfig.page" :page="pageConfig.page"
:size="pageConfig.limit" :size="pageConfig.page_size"
:total="pageConfig.total" :total="pageConfig.total"
@change-page="changePage" @change-page="changePage"
@change-size="changeSize"> @change-size="changeSize">
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
ref="dialogBgTable" ref="dialogBgTable"
height="430" height="430"
select select
rowKey="systemId" rowKey="user_id"
:headers="detailHeaders" :headers="detailHeaders"
:rows="dialogTableRows" :rows="dialogTableRows"
:stripe="true" :stripe="true"
...@@ -107,7 +107,7 @@ ...@@ -107,7 +107,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="dialogPageConfig.page" :page="dialogPageConfig.page"
:size="dialogPageConfig.limit" :size="dialogPageConfig.page_size"
:total="dialogPageConfig.total" :total="dialogPageConfig.total"
@change-page="dialogChangePage" @change-page="dialogChangePage"
@change-size="dialogChangeSize"> @change-size="dialogChangeSize">
...@@ -196,13 +196,13 @@ const state = reactive({ ...@@ -196,13 +196,13 @@ const state = reactive({
}, },
pageConfig: { pageConfig: {
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}, },
//弹框中表格分页配置项 //弹框中表格分页配置项
dialogPageConfig: { dialogPageConfig: {
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}, },
//表格数据 //表格数据
...@@ -269,7 +269,7 @@ const userMaintain = () => { ...@@ -269,7 +269,7 @@ const userMaintain = () => {
}; };
//获取所属组织级联数据 //获取所属组织级联数据
const getOrgTree = () => { const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => { axios.get(`/v1/api/org/tree`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
const orgDataTemp = res.data.data || []; const orgDataTemp = res.data.data || [];
state.orgData = orgDataTemp; state.orgData = orgDataTemp;
...@@ -280,11 +280,14 @@ const getOrgTree = () => { ...@@ -280,11 +280,14 @@ const getOrgTree = () => {
}; };
const changePage = (page) => { const changePage = (page) => {
state.pageConfig.page = page; state.pageConfig.page = page;
state.tableRows = state.selectedRows.slice((page - 1) * state.pageConfig.limit, page * state.pageConfig.limit); state.tableRows = state.selectedRows.slice(
(page - 1) * state.pageConfig.page_size,
page * state.pageConfig.page_size
);
}; };
const changeSize = (size) => { const changeSize = (size) => {
state.pageConfig.limit = size; state.pageConfig.page_size = size;
changePage(1); changePage(1);
}; };
const dialogChangePage = (page) => { const dialogChangePage = (page) => {
...@@ -293,19 +296,19 @@ const dialogChangePage = (page) => { ...@@ -293,19 +296,19 @@ const dialogChangePage = (page) => {
}; };
const dialogChangeSize = (size) => { const dialogChangeSize = (size) => {
state.dialogPageConfig.limit = size; state.dialogPageConfig.page_size = size;
dialogChangePage(1); dialogChangePage(1);
}; };
//获取用户维护数据 //获取用户维护数据
const getTableList = () => { const getTableList = () => {
const params = { const params = {
limit: state.dialogPageConfig.limit, page_size: state.dialogPageConfig.page_size,
page: state.dialogPageConfig.page, page: state.dialogPageConfig.page,
disp: 1, disp: 1,
...state.dialogFilterData, ...state.dialogFilterData,
}; };
axios.get("/apaas/system/v5/accessRule/listRuleUser", { params }).then((res) => { axios.get("/v1/api/accessRule/listRuleUser", { params }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.dialogTableRows = res.data.data || []; state.dialogTableRows = res.data.data || [];
state.dialogPageConfig.total = res.data.total || 0; state.dialogPageConfig.total = res.data.total || 0;
...@@ -335,17 +338,17 @@ const save = () => { ...@@ -335,17 +338,17 @@ const save = () => {
const res = dialogBgTable.value.dealSelectData(); const res = dialogBgTable.value.dealSelectData();
state.selectedRows = Object.values(res); state.selectedRows = Object.values(res);
state.formData.userScope = state.selectedRows.map((item) => ({ state.formData.userScope = state.selectedRows.map((item) => ({
systemId: item.systemId, user_id: item.user_id,
})); }));
state.pageConfig.total = state.formData.userScope.length; state.pageConfig.total = state.formData.userScope.length;
changePage(1); changePage(1);
}; };
//提交 //提交
const submit = () => { const submit = () => {
axios.post("/apaas/system/v5/accessRule/addAccessRule", state.formData).then((res) => { axios.post("/v1/api/accessRule/addAccessRule", state.formData).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success("添加成功"); ElMessage.success("添加成功");
router.push("/config/accessRule"); router.push("/system-admin/visit-control");
} else { } else {
ElMessage.error(res.data.data); ElMessage.error(res.data.data);
} }
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="pageConfig.page" :page="pageConfig.page"
:size="pageConfig.limit" :size="pageConfig.page_size"
:total="pageConfig.total" :total="pageConfig.total"
@change-page="changePage" @change-page="changePage"
@change-size="changeSize"> @change-size="changeSize">
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
ref="dialogBgTable" ref="dialogBgTable"
height="430" height="430"
select select
rowKey="systemId" rowKey="user_id"
:headers="detailHeaders" :headers="detailHeaders"
:rows="dialogTableRows" :rows="dialogTableRows"
:originSelectedData="selectedRows" :originSelectedData="selectedRows"
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="dialogPageConfig.page" :page="dialogPageConfig.page"
:size="dialogPageConfig.limit" :size="dialogPageConfig.page_size"
:total="dialogPageConfig.total" :total="dialogPageConfig.total"
@change-page="dialogChangePage" @change-page="dialogChangePage"
@change-size="dialogChangeSize"> @change-size="dialogChangeSize">
...@@ -198,13 +198,13 @@ const state = reactive({ ...@@ -198,13 +198,13 @@ const state = reactive({
}, },
pageConfig: { pageConfig: {
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}, },
//弹框中表格分页配置项 //弹框中表格分页配置项
dialogPageConfig: { dialogPageConfig: {
page: 1, page: 1,
limit: 10, page_size: 10,
total: 0, total: 0,
}, },
//表格数据 //表格数据
...@@ -282,7 +282,7 @@ const userMaintain = () => { ...@@ -282,7 +282,7 @@ const userMaintain = () => {
}; };
//获取所属组织级联数据 //获取所属组织级联数据
const getOrgTree = () => { const getOrgTree = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => { axios.get(`/v1/api/org/tree`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
const orgDataTemp = res.data.data || []; const orgDataTemp = res.data.data || [];
state.orgData = orgDataTemp; state.orgData = orgDataTemp;
...@@ -293,11 +293,14 @@ const getOrgTree = () => { ...@@ -293,11 +293,14 @@ const getOrgTree = () => {
}; };
const changePage = (page) => { const changePage = (page) => {
state.pageConfig.page = page; state.pageConfig.page = page;
state.tableRows = state.selectedRows.slice((page - 1) * state.pageConfig.limit, page * state.pageConfig.limit); state.tableRows = state.selectedRows.slice(
(page - 1) * state.pageConfig.page_size,
page * state.pageConfig.page_size
);
}; };
const changeSize = (size) => { const changeSize = (size) => {
state.pageConfig.limit = size; state.pageConfig.page_size = size;
changePage(1); changePage(1);
}; };
const dialogChangePage = (page) => { const dialogChangePage = (page) => {
...@@ -306,18 +309,18 @@ const dialogChangePage = (page) => { ...@@ -306,18 +309,18 @@ const dialogChangePage = (page) => {
}; };
const dialogChangeSize = (size) => { const dialogChangeSize = (size) => {
state.dialogPageConfig.limit = size; state.dialogPageConfig.page_size = size;
dialogChangePage(1); dialogChangePage(1);
}; };
//编辑时回显用户范围数据 //编辑时回显用户范围数据
const getUserScopeList = () => { const getUserScopeList = () => {
const params = { const params = {
limit: 10000, page_size: 10000,
page: 1, page: 1,
id: route.query.id, id: route.query.id,
disp: 0, disp: 0,
}; };
axios.get("/apaas/system/v5/accessRule/listRuleUser", { params }).then((res) => { axios.get("/v1/api/accessRule/listRuleUser", { params }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.selectedRows = res.data.data || []; state.selectedRows = res.data.data || [];
state.pageConfig.total = state.selectedRows.length; state.pageConfig.total = state.selectedRows.length;
...@@ -331,12 +334,12 @@ const getUserScopeList = () => { ...@@ -331,12 +334,12 @@ const getUserScopeList = () => {
//获取用户维护数据 //获取用户维护数据
const getTableList = () => { const getTableList = () => {
const params = { const params = {
limit: state.dialogPageConfig.limit, page_size: state.dialogPageConfig.page_size,
page: state.dialogPageConfig.page, page: state.dialogPageConfig.page,
disp: 1, disp: 1,
...state.dialogFilterData, ...state.dialogFilterData,
}; };
axios.get("/apaas/system/v5/accessRule/listRuleUser", { params }).then((res) => { axios.get("/v1/api/accessRule/listRuleUser", { params }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.dialogTableRows = res.data.data || []; state.dialogTableRows = res.data.data || [];
state.dialogPageConfig.total = res.data.total || 0; state.dialogPageConfig.total = res.data.total || 0;
...@@ -366,7 +369,7 @@ const save = () => { ...@@ -366,7 +369,7 @@ const save = () => {
const res = dialogBgTable.value.dealSelectData(); const res = dialogBgTable.value.dealSelectData();
state.selectedRows = Object.values(res); state.selectedRows = Object.values(res);
state.formData.userScope = state.selectedRows.map((item) => ({ state.formData.userScope = state.selectedRows.map((item) => ({
systemId: item.systemId, user_id: item.user_id,
})); }));
state.pageConfig.total = state.formData.userScope.length; state.pageConfig.total = state.formData.userScope.length;
changePage(1); changePage(1);
...@@ -377,10 +380,10 @@ const submit = () => { ...@@ -377,10 +380,10 @@ const submit = () => {
ruleId: route.query.ruleId, ruleId: route.query.ruleId,
...state.formData, ...state.formData,
}; };
axios.put("/apaas/system/v5/accessRule/updateAccessRule", params).then((res) => { axios.put("/v1/api/accessRule/updateAccessRule", params).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success("更新成功"); ElMessage.success("更新成功");
router.push("/config/accessRule"); router.push("/system-admin/visit-control");
} else { } else {
ElMessage.error(res.data.data); ElMessage.error(res.data.data);
} }
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="filter.page" :page="filter.page"
:size="filter.limit" :size="filter.page_size"
:total="tableTotal" :total="tableTotal"
@change-page="changePage" @change-page="changePage"
@change-size="changeSize"> @change-size="changeSize">
...@@ -133,7 +133,7 @@ ...@@ -133,7 +133,7 @@
</bg-table> </bg-table>
<bg-pagination <bg-pagination
:page="userFilter.page" :page="userFilter.page"
:size="userFilter.limit" :size="userFilter.page_size"
:total="userTableTotal" :total="userTableTotal"
@change-page="changeUserPage" @change-page="changeUserPage"
@change-size="changeUserSize"> @change-size="changeUserSize">
...@@ -171,7 +171,7 @@ const state = reactive({ ...@@ -171,7 +171,7 @@ const state = reactive({
filter: { filter: {
search: "", search: "",
page: 1, page: 1,
limit: 10, page_size: 10,
time: [], time: [],
}, },
headers: [ headers: [
...@@ -214,7 +214,7 @@ const state = reactive({ ...@@ -214,7 +214,7 @@ const state = reactive({
dialogDetail: false, dialogDetail: false,
userFilter: { userFilter: {
page: 1, page: 1,
limit: 10, page_size: 10,
search: "", search: "",
isAdmin: "", isAdmin: "",
organizationId: "", organizationId: "",
...@@ -269,7 +269,7 @@ const state = reactive({ ...@@ -269,7 +269,7 @@ const state = reactive({
}); });
const getOrgList = () => { const getOrgList = () => {
axios.get(`/apaas/system/v5/org/tree`).then((res) => { axios.get(`/v1/api/org/tree`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.orgList = res.data.data || []; state.orgList = res.data.data || [];
} else { } else {
...@@ -287,7 +287,7 @@ const changePage = (page) => { ...@@ -287,7 +287,7 @@ const changePage = (page) => {
getTableRows(); getTableRows();
}; // 改变页码 }; // 改变页码
const changeSize = (size) => { const changeSize = (size) => {
state.filter.limit = size; state.filter.page_size = size;
changePage(1); changePage(1);
}; // 改变每页条数 }; // 改变每页条数
const filterAction = () => { const filterAction = () => {
...@@ -297,7 +297,7 @@ const filterClear = () => { ...@@ -297,7 +297,7 @@ const filterClear = () => {
state.filter = { state.filter = {
search: "", search: "",
page: 1, page: 1,
limit: 10, page_size: 10,
time: [], time: [],
}; };
changePage(1); changePage(1);
...@@ -308,7 +308,7 @@ const getTableRows = () => { ...@@ -308,7 +308,7 @@ const getTableRows = () => {
params.updatedTimeTo = params.time ? params.time[1] || "" : ""; params.updatedTimeTo = params.time ? params.time[1] || "" : "";
delete params.time; delete params.time;
axios axios
.get(`/apaas/system/v5/accessRule/listAccessRule`, { .get(`/v1/api/accessRule/listAccessRule`, {
params, params,
}) })
.then((res) => { .then((res) => {
...@@ -323,6 +323,7 @@ const getTableRows = () => { ...@@ -323,6 +323,7 @@ const getTableRows = () => {
const selectRows = (data) => { const selectRows = (data) => {
state.selectedNum = data.allLength; state.selectedNum = data.allLength;
stateChange;
state.selection = data.selection; state.selection = data.selection;
}; };
...@@ -337,7 +338,7 @@ const cleanSelected = () => { ...@@ -337,7 +338,7 @@ const cleanSelected = () => {
// 改变规则状态 // 改变规则状态
const stateChange = (row) => { const stateChange = (row) => {
axios.put(`/apaas/system/v5/accessRule/updateState?id=${row.id}&state=${row.state}`).then((res) => { axios.put(`/v1/api/accessRule/updateState?id=${row.id}&state=${row.state}`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
ElMessage.success(res.data.msg); ElMessage.success(res.data.msg);
changePage(1); changePage(1);
...@@ -347,7 +348,6 @@ const stateChange = (row) => { ...@@ -347,7 +348,6 @@ const stateChange = (row) => {
} }
}); });
}; };
// 打开用户弹窗 // 打开用户弹窗
const openUserDialog = (row) => { const openUserDialog = (row) => {
state.dialogDetail = true; state.dialogDetail = true;
...@@ -363,7 +363,7 @@ const searchUsers = () => { ...@@ -363,7 +363,7 @@ const searchUsers = () => {
const clearAction = () => { const clearAction = () => {
state.userFilter = { state.userFilter = {
page: 1, page: 1,
limit: 10, page_size: 10,
search: "", search: "",
isAdmin: "", isAdmin: "",
organizationId: "", organizationId: "",
...@@ -379,7 +379,7 @@ const changeUserPage = (page) => { ...@@ -379,7 +379,7 @@ const changeUserPage = (page) => {
}; };
const changeUserSize = (size) => { const changeUserSize = (size) => {
state.userFilter.limit = size; state.userFilter.page_size = size;
changeUserPage(1); changeUserPage(1);
}; };
...@@ -389,7 +389,7 @@ const getUserTableRows = () => { ...@@ -389,7 +389,7 @@ const getUserTableRows = () => {
...state.userFilter, ...state.userFilter,
id: state.actionRow.id, id: state.actionRow.id,
}; };
axios.get(`/apaas/system/v5/accessRule/listRuleUser`, { params }).then((res) => { axios.get(`/v1/api/accessRule/listRuleUser`, { params }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.userTableRows = res.data.data || []; state.userTableRows = res.data.data || [];
state.userTableTotal = res.data.total; state.userTableTotal = res.data.total;
...@@ -434,7 +434,7 @@ const openDeleteDialog = (type, row) => { ...@@ -434,7 +434,7 @@ const openDeleteDialog = (type, row) => {
//确定删除 //确定删除
const confimDelete = () => { const confimDelete = () => {
axios axios
.delete("/apaas/system/v5/accessRule/delAccessRule", { .delete("/v1/api/accessRule/delAccessRule", {
data: { data: {
ruleId: state.deleteDialogConfig.ruleId, ruleId: state.deleteDialogConfig.ruleId,
}, },
...@@ -465,7 +465,6 @@ const { ...@@ -465,7 +465,6 @@ const {
userFilter, userFilter,
userTypeList, userTypeList,
orgList, orgList,
selection,
dialogDelete, dialogDelete,
deleteDialogConfig, deleteDialogConfig,
} = toRefs(state); } = toRefs(state);
......
...@@ -48,6 +48,7 @@ import { ORDER_METHODS } from "@/components/manual-distribution/env.js"; ...@@ -48,6 +48,7 @@ import { ORDER_METHODS } from "@/components/manual-distribution/env.js";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { dateStringToDate } from "@/components/env";
const route = useRoute(); const route = useRoute();
const { id } = route.query; const { id } = route.query;
const ticketLevelOptions = ["", "紧急任务", "重要任务", "一般任务"]; const ticketLevelOptions = ["", "紧急任务", "重要任务", "一般任务"];
...@@ -131,8 +132,8 @@ const getInfo = () => { ...@@ -131,8 +132,8 @@ const getInfo = () => {
ticket_level: ticketLevelOptions[data.order_level], ticket_level: ticketLevelOptions[data.order_level],
create_by: data.create_user, create_by: data.create_user,
description: data.order_desc, description: data.order_desc,
create_time: data.create_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", create_time: dateStringToDate(data.create_time),
finish_time: data.complete_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", finish_time: dateStringToDate(data.complete_time),
notification_method: data.push_obj.push_method == "3" ? ["1", "2"] : [data.push_obj.push_method], notification_method: data.push_obj.push_method == "3" ? ["1", "2"] : [data.push_obj.push_method],
}; };
rows.value = data.push_obj.user_obj?.map((e) => { rows.value = data.push_obj.user_obj?.map((e) => {
...@@ -147,7 +148,7 @@ const getInfo = () => { ...@@ -147,7 +148,7 @@ const getInfo = () => {
status: e.order_state, status: e.order_state,
target: e.system_account, target: e.system_account,
feedback: e.result_feedback, feedback: e.result_feedback,
time: e.complete_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", time: dateStringToDate(e.complete_time),
}; };
}); });
} }
......
...@@ -75,10 +75,10 @@ ...@@ -75,10 +75,10 @@
</span> </span>
</template> </template>
<template #create_time="{ row }"> <template #create_time="{ row }">
{{ row.create_time ? row.create_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.create_time) }}
</template> </template>
<template #complete_time="{ row }"> <template #complete_time="{ row }">
{{ row.complete_time ? row.complete_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.complete_time) }}
</template> </template>
<template #operation="{ row }"> <template #operation="{ row }">
<el-button type="primary" :disabled="row.order_state != 1" link size="small" @click="operation(row)"> <el-button type="primary" :disabled="row.order_state != 1" link size="small" @click="operation(row)">
...@@ -110,6 +110,7 @@ import CloseTicket from "./close-ticket.vue"; ...@@ -110,6 +110,7 @@ import CloseTicket from "./close-ticket.vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { dateStringToDate } from "@/components/env";
const router = useRouter(); const router = useRouter();
const filter = reactive({ const filter = reactive({
order_level: 0, order_level: 0,
...@@ -176,6 +177,7 @@ let headers = reactive([ ...@@ -176,6 +177,7 @@ let headers = reactive([
prop: "operation", prop: "operation",
align: "left", align: "left",
width: "80px", width: "80px",
fixed: "right",
}, },
]); ]);
let rows = ref([]); let rows = ref([]);
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
<Info :labelData="labelData" :valueData="info"> <Info :labelData="labelData" :valueData="info">
<template #status="{ item, valueData }"> <template #status="{ item, valueData }">
<span class="status-body"> <span class="status-body">
<span class="status" :class="`status-${valueData.status}`"></span> <span class="status" :class="`status_${valueData.status}`"></span>
<span>{{ statusOptions[valueData[item.prop]] }}</span> <span>{{ timeStateOptions[valueData[item.prop]] }}</span>
</span> </span>
</template> </template>
</Info> </Info>
...@@ -64,10 +64,10 @@ ...@@ -64,10 +64,10 @@
</span> </span>
</template> </template>
<template #create_time="{ row }"> <template #create_time="{ row }">
{{ row.create_time ? row.create_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.create_time) }}
</template> </template>
<template #complete_time="{ row }"> <template #complete_time="{ row }">
{{ row.complete_time ? row.complete_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.complete_time) }}
</template> </template>
<template #operation="{ row }"> <template #operation="{ row }">
<div class="table-operation"> <div class="table-operation">
...@@ -99,11 +99,13 @@ import { TIMEING_RULES } from "@/components/env.js"; ...@@ -99,11 +99,13 @@ import { TIMEING_RULES } from "@/components/env.js";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { dateStringToDate } from "@/components/env";
const route = useRoute(); const route = useRoute();
const { id } = route.query; const { id } = route.query;
const router = useRouter(); const router = useRouter();
const ticketLevelOptions = ["", "紧急任务", "重要任务", "一般任务"]; const ticketLevelOptions = ["", "紧急任务", "重要任务", "一般任务"];
const statusOptions = ["", "待处置", "已完成", "已关闭"]; const statusOptions = ["", "待处置", "已完成", "已关闭"];
const timeStateOptions = ["禁用", "启用"];
const weekDayOptions = { const weekDayOptions = {
1: "周一", 1: "周一",
2: "周二", 2: "周二",
...@@ -120,7 +122,7 @@ const labelData = [ ...@@ -120,7 +122,7 @@ const labelData = [
prop: "ticket_name", prop: "ticket_name",
}, },
{ {
label: "状态", label: "定时是否启用",
prop: "status", prop: "status",
}, },
], ],
...@@ -139,16 +141,10 @@ const labelData = [ ...@@ -139,16 +141,10 @@ const labelData = [
label: "工单描述", label: "工单描述",
prop: "description", prop: "description",
}, },
],
[
{ {
label: "创建时间", label: "创建时间",
prop: "create_time", prop: "create_time",
}, },
{
label: "完成时间",
prop: "finish_time",
},
], ],
]; ];
const info = ref({}); const info = ref({});
...@@ -251,8 +247,8 @@ const getInfoData = () => { ...@@ -251,8 +247,8 @@ const getInfoData = () => {
ticket_level: ticketLevelOptions[data.order_level], ticket_level: ticketLevelOptions[data.order_level],
create_by: data.create_user, create_by: data.create_user,
description: data.order_desc, description: data.order_desc,
create_time: data.create_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", create_time: dateStringToDate(data.create_time),
finish_time: data.create_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", finish_time: dateStringToDate(data.create_time),
notification_method: data.push_obj.push_method == 3 ? ["1", "2"] : [`${data.push_obj.push_method}`], notification_method: data.push_obj.push_method == 3 ? ["1", "2"] : [`${data.push_obj.push_method}`],
timing_rules: +data.timing_type, timing_rules: +data.timing_type,
}; };
...@@ -361,13 +357,9 @@ onBeforeMount(() => { ...@@ -361,13 +357,9 @@ onBeforeMount(() => {
height: 6px; height: 6px;
border-radius: 50%; border-radius: 50%;
margin-right: 8px; margin-right: 8px;
$statusObj: ( $statusObj: (-2: #48ad97, -3: #9e9e9e, -1: #3759be, _0: #d75138, _1: #48ad97);
2: #48ad97,
3: #9e9e9e,
1: #3759be,
);
@each $status, $color in $statusObj { @each $status, $color in $statusObj {
&-#{$status} { &#{$status} {
background-color: $color; background-color: $color;
} }
} }
......
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
<span>{{ ruleOptions[row.timing_type] }}</span> <span>{{ ruleOptions[row.timing_type] }}</span>
</template> </template>
<template #create_time="{ row }"> <template #create_time="{ row }">
{{ row.create_time ? row.create_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.create_time) }}
</template> </template>
<template #timing_state="{ row }"> <template #timing_state="{ row }">
<el-switch <el-switch
...@@ -156,6 +156,7 @@ import ManualDistribution from "@/components/manual-distribution/index.vue"; ...@@ -156,6 +156,7 @@ import ManualDistribution from "@/components/manual-distribution/index.vue";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { dateStringToDate } from "@/components/env";
const router = useRouter(); const router = useRouter();
const filter = reactive({ const filter = reactive({
order_level: "", order_level: "",
......
...@@ -48,6 +48,7 @@ import { ORDER_METHODS } from "@/components/manual-distribution/env.js"; ...@@ -48,6 +48,7 @@ import { ORDER_METHODS } from "@/components/manual-distribution/env.js";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { dateStringToDate } from "@/components/env";
const route = useRoute(); const route = useRoute();
const { id } = route.query; const { id } = route.query;
const ticketLevelOptions = ["", "紧急任务", "重要任务", "一般任务"]; const ticketLevelOptions = ["", "紧急任务", "重要任务", "一般任务"];
...@@ -132,8 +133,8 @@ const getInfo = () => { ...@@ -132,8 +133,8 @@ const getInfo = () => {
ticket_level: ticketLevelOptions[data.order_level], ticket_level: ticketLevelOptions[data.order_level],
create_by: data.create_user, create_by: data.create_user,
description: data.order_desc, description: data.order_desc,
create_time: data.create_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", create_time: dateStringToDate(data.create_time),
finish_time: data.complete_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", finish_time: dateStringToDate(data.complete_time),
notification_method: data.push_obj.push_method == "3" ? ["1", "2"] : [data.push_obj.push_method], notification_method: data.push_obj.push_method == "3" ? ["1", "2"] : [data.push_obj.push_method],
}; };
rows.value = data.push_obj.user_obj.map((e) => { rows.value = data.push_obj.user_obj.map((e) => {
...@@ -148,7 +149,7 @@ const getInfo = () => { ...@@ -148,7 +149,7 @@ const getInfo = () => {
status: e.order_state, status: e.order_state,
target: e.system_account, target: e.system_account,
feedback: e.result_feedback, feedback: e.result_feedback,
time: e.complete_time?.split("+")[0].replace("T", " ").replace("Z", " ") || "-", time: dateStringToDate(e.complete_time),
}; };
}); });
} }
......
...@@ -74,10 +74,10 @@ ...@@ -74,10 +74,10 @@
</span> </span>
</template> </template>
<template #create_time="{ row }"> <template #create_time="{ row }">
{{ row.create_time ? row.create_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.create_time) }}
</template> </template>
<template #complete_time="{ row }"> <template #complete_time="{ row }">
{{ row.complete_time ? row.complete_time.split("+")[0].replace("T", " ").replace("Z", " ") : "-" }} {{ dateStringToDate(row.complete_time) }}
</template> </template>
<template #operation="{ row }"> <template #operation="{ row }">
<el-button type="primary" :disabled="row.order_state != 1" link size="small" @click="operation(row)"> <el-button type="primary" :disabled="row.order_state != 1" link size="small" @click="operation(row)">
...@@ -108,6 +108,7 @@ import FeedBack from "../modules/feedback.vue"; ...@@ -108,6 +108,7 @@ import FeedBack from "../modules/feedback.vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { dateStringToDate } from "@/components/env";
const router = useRouter(); const router = useRouter();
const filter = reactive({ const filter = reactive({
order_level: 0, order_level: 0,
...@@ -174,6 +175,7 @@ let headers = reactive([ ...@@ -174,6 +175,7 @@ let headers = reactive([
prop: "operation", prop: "operation",
align: "left", align: "left",
width: "80px", width: "80px",
fixed: "right",
}, },
]); ]);
let rows = ref([]); let rows = ref([]);
......
...@@ -3,8 +3,15 @@ ...@@ -3,8 +3,15 @@
<div class="breadcrumb"> <div class="breadcrumb">
<bg-breadcrumb /> <bg-breadcrumb />
</div> </div>
<div class="content"> <div class="content bg-scroll">
<warn-detail :label-data="labelData" :value-data="info" :tabs="tabs"></warn-detail> <warn-detail :label-data="labelData" :value-data="info" :tabLabels="tabLabels" :tabDatas="tabDatas">
<template #status="{ item, valueData }">
<span class="status-body">
<span class="status" :class="`status-${valueData.status}`"></span>
<span>{{ statusOptions[valueData[item.prop]] }}</span>
</span>
</template>
</warn-detail>
</div> </div>
</div> </div>
</template> </template>
...@@ -12,12 +19,35 @@ ...@@ -12,12 +19,35 @@
<script setup> <script setup>
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import warnDetail from "@/components/warn-detail/index.vue"; import warnDetail from "@/components/warn-detail/index.vue";
import { useRoute } from "vue-router";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
import { ref, onBeforeMount } from "vue";
import { dateStringToDate } from "@/components/env";
const route = useRoute();
const { id } = route.query;
const ruleTypeOptions = ref({});
const statusOptions = {
1: "已恢复",
2: "未恢复",
3: "已关闭",
};
const riskLevels = {
1: "低风险",
2: "一般风险",
3: "较大风险",
4: "重大风险",
};
const labelData = [ const labelData = [
[ [
{ {
label: "预警点", label: "预警点",
prop: "warning_point", prop: "warning_point",
}, },
{
label: "预警分类",
prop: "warning_type",
},
], ],
[ [
{ {
...@@ -35,7 +65,7 @@ const labelData = [ ...@@ -35,7 +65,7 @@ const labelData = [
prop: "status", prop: "status",
}, },
{ {
label: "预警", label: "预警",
prop: "warning_threshold", prop: "warning_threshold",
}, },
], ],
...@@ -50,55 +80,87 @@ const labelData = [ ...@@ -50,55 +80,87 @@ const labelData = [
}, },
], ],
]; ];
const info = { const info = ref({});
warning_point: "SaaS层/数据治理系统", const tabLabels = [
warning_index: "响应时间超时",
risk_level: "一般风险",
status: "success",
warning_threshold: "10ms",
current_alarm_value: "16ms",
warning_time: "2020-01-01 00:00:00",
};
const tabs = [
{ {
label: "推送记录", label: "推送记录",
prop: "push", prop: "push",
lists: [
{
method: "短信",
person: [11, 22, 33, 44],
push_time: "2022-07-29 10:23:59",
push_type: "自动推送",
status: "success",
},
{
method: "钉钉",
person: [11, 33, 44],
push_time: "2022-07-29 10:23:59",
push_type: "自动推送",
status: "error",
},
],
}, },
{ {
label: "处置记录", label: "处置记录",
prop: "dispose", prop: "dispose",
lists: [
{
status: "error",
feedback: "暂时无法处理,需要时间",
feedback_time: "2022-07-29 10:23:59",
feedback_person: "张三",
},
{
status: "success",
feedback: "暂时无法处理,需要时间",
feedback_time: "2022-07-29 10:23:59",
feedback_person: "张三",
},
],
}, },
]; ];
const tabDatas = ref({});
const pushType = {
1: "自动推送",
2: "手动推送",
};
const getInfo = () => {
const params = {
id,
};
axios.get("/v1/api/alert_list", { params }).then((res) => {
if (res.data.code == 200) {
const { data } = res.data;
info.value = {
warning_point: data.alert_point,
warning_type: data.class_parent_name,
warning_index: data.class_name,
risk_level: riskLevels[data.risk_level],
status: data.status,
warning_threshold: `${data.alert_condition.thresholds_min}${
ruleTypeOptions.value[data.alert_rule_type]?.unit || ""
}-${data.alert_condition.thresholds_max}${ruleTypeOptions.value[data.alert_rule_type]?.unit || ""}`,
current_alarm_value: data.current_value + (ruleTypeOptions.value[data.alert_rule_type]?.unit || ""),
warning_time: dateStringToDate(data.alert_time),
};
tabDatas.value = {
push:
data.push_records?.map((e) => {
return {
method: e.notify_method,
person: e.system_account,
push_time: dateStringToDate(e.push_time),
push_type: pushType[e.push_type],
status: e.status,
};
}) || [],
dispose:
data.disposed_list?.map((e) => {
return {
status: e.is_disposed,
feedback: e.disposal_content,
feedback_time: dateStringToDate(e.disposal_time),
feedback_person: e.disposal_user,
};
}) || [],
};
}
});
};
const GetRuleTypeOptions = () => {
const params = {
page: 1,
page_size: 10000000000000,
class: 3,
};
axios.get(`/v1/api/dict`, { params }).then((res) => {
if (res.data.code == 200) {
res.data.data?.forEach((e) => {
let isEmptyOption = e.name == "空";
ruleTypeOptions.value[e.id] = {
label: e.name,
unit: isEmptyOption ? "" : e.unit,
};
});
getInfo();
}
});
};
onBeforeMount(() => {
GetRuleTypeOptions();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -117,6 +179,27 @@ const tabs = [ ...@@ -117,6 +179,27 @@ const tabs = [
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15); box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px; border-radius: 6px;
padding: 32px; padding: 32px;
.status {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
margin-right: 8px;
$statusObj: (
1: #48ad97,
3: #9e9e9e,
2: #3759be,
);
@each $status, $color in $statusObj {
&-#{$status} {
background-color: $color;
}
}
}
.status-body {
display: flex;
align-items: center;
}
} }
} }
</style> </style>
...@@ -4,39 +4,17 @@ ...@@ -4,39 +4,17 @@
<bg-breadcrumb /> <bg-breadcrumb />
</div> </div>
<div class="content"> <div class="content">
<bg-filter-group @search="changeSearch" v-model="filter.key_word" placeholder="请输入角色名称"> <bg-filter-group @search="changeSearch" v-model="filter.keyword" placeholder="请输入预警点/分类/指标">
<template v-slot:filter_group> <template v-slot:filter_group>
<div class="left-filter filter_list"> <div class="left-filter filter_list">
<div class="filter_item">
<span class="filter_title">预警分类</span>
<el-select v-model="filter.warning_type" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in wainingTypeOptions"
:key="'pushOptions' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item">
<span class="filter_title">预警指标</span>
<el-select v-model="filter.warning_index" placeholder="请选择" style="width: 300px">
<el-option
v-for="(item, index) in wainingIndexOptions"
:key="'warning_index_options' + index"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">风险等级</span> <span class="filter_title">风险等级</span>
<el-select v-model="filter.risk_level" placeholder="请选择" style="width: 300px"> <el-select v-model="filter.risk_level" placeholder="请选择" style="width: 300px">
<el-option <el-option
v-for="(item, index) in riskLevelOptions" v-for="(value, key, index) in riskLevels"
:key="'risk_level_options' + index" :key="'riskLevels' + index"
:label="item.name" :label="value"
:value="item.id"> :value="key">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
...@@ -44,17 +22,18 @@ ...@@ -44,17 +22,18 @@
<span class="filter_title">状态</span> <span class="filter_title">状态</span>
<el-select v-model="filter.status" placeholder="请选择" style="width: 300px"> <el-select v-model="filter.status" placeholder="请选择" style="width: 300px">
<el-option <el-option
v-for="(item, index) in statusOptions" v-for="(value, key, index) in statusOptions"
:key="'statusOptions' + index" :key="'stateOptions' + index"
:label="item" :label="value"
:value="index"> :value="key">
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
<div class="filter_item"> <div class="filter_item">
<span class="filter_title">预警时段</span> <span class="filter_title">预警时段</span>
<el-date-picker <el-date-picker
v-model="filter.date" v-model="filter.time"
style="width: 400px"
type="datetimerange" type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
range-separator="-" range-separator="-"
...@@ -72,11 +51,34 @@ ...@@ -72,11 +51,34 @@
<div class="table_container"> <div class="table_container">
<div class="table"> <div class="table">
<bg-table ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true" :stripe="true"> <bg-table ref="listtable" :headers="headers" :rows="rows" height="100%" :isIndex="true" :stripe="true">
<template #alert_point="{ row }"> <template v-slot:alert_point="{ row }">
<div class="href" @click="goTo(row)">{{ row.alert_point || "-" }}</div> <span class="can_click_text" @click="goDetail(row)">
{{ row.alert_point }}
</span>
</template>
<template v-slot:risk_level="{ row }">
{{ riskLevels[row.risk_level] }}
</template>
<template v-slot:current_value="{ row }">
{{ row.current_value }}{{ ruleTypeOptions[row.alert_rule_type]?.unit || "" }}
</template>
<template v-slot:warn_threshold="{ row }">
{{ row.alert_condition.thresholds_min }}{{ ruleTypeOptions[row.alert_rule_type]?.unit || "" }}
-
{{ row.alert_condition.thresholds_max }}{{ ruleTypeOptions[row.alert_rule_type]?.unit || "" }}
</template>
<template v-slot:alert_time="{ row }">
{{ dateStringToDate(row.alert_time) }}
</template>
<template v-slot:last_push_time="{ row }">
{{ dateStringToDate(row.last_push_time) }}
</template>
<template #status="{ row }">
<span :class="`circle status-${row.status}`"></span>
{{ statusOptions[row.status] }}
</template> </template>
<template #operation="{ row }"> <template #operation="{ row }">
<el-button type="primary" :disabled="row.order_state != 1" link size="small" @click="operation(row)"> <el-button type="primary" :disabled="row.is_disposed == 1" link size="small" @click="operation(row)">
处置反馈 处置反馈
</el-button> </el-button>
</template> </template>
...@@ -98,87 +100,63 @@ ...@@ -98,87 +100,63 @@
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted, nextTick } from "vue"; import { reactive, ref, onBeforeMount, toRefs, computed, watch, nextTick, watchEffect } from "vue";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import FeedBack from "../modules/feedback.vue"; import FeedBack from "../modules/feedback.vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { GetRuleTypeOptions, dateStringToDate } from "@/components/env.js";
const router = useRouter(); const router = useRouter();
const filter = reactive({ const filter = reactive({
warning_type: "", risk_level: "", // 风险等级
key_word: "", status: "", // 状态
warning_index: "", time: [],
risk_level: "", keyword: "",
status: "",
date: [],
page: 1, page: 1,
page_size: 10, page_size: 10,
}); });
const tableTotal = ref(0); const tableTotal = ref(0);
const ruleTypeOptions = ref({});
const filterClear = () => { const filterClear = () => {
filter.warning_type = "";
filter.key_word = "";
filter.warning_index = ""; filter.warning_index = "";
filter.risk_level = ""; filter.risk_level = "";
filter.status = ""; filter.status = "";
filter.date = []; filter.time = [];
filter.page_size = 10; filter.page_size = 10;
filter.page = 1; filter.page = 1;
changePage(1); changePage(1);
}; // 重置筛选项 }; // 重置筛选项
const statusOptions = ["全部", "待处置", "已完成", "已关闭"]; const statusOptions = ["全部", "待处置", "已完成", "已关闭"];
const wainingTypeOptions = ref([ // const disposedOptions = ["", "已处置", "已处置"];
{ const riskLevels = {
value: "", "": "全部",
name: "全部", 1: "低风险",
}, 2: "一般风险",
]); 3: "较大风险",
const wainingIndexOptions = ref([ 4: "重大风险",
{ };
value: "",
name: "全部",
},
]);
const riskLevelOptions = ref([
{
id: "",
name: "全部",
},
{
id: 4,
name: "重大风险",
},
{
id: 3,
name: "较大风险",
},
{
id: 2,
name: "一般风险",
},
{
id: 1,
name: "低风险",
},
]);
let headers = reactive([ let headers = reactive([
{ {
label: "预警点", label: "预警点",
prop: "alert_point", prop: "alert_point",
align: "left", align: "left",
width: 180,
}, },
{ {
label: "预警时间", label: "预警时间",
prop: "alert_point", prop: "alert_time",
align: "left", align: "left",
width: 160,
}, },
{ {
label: "预警分类", label: "预警分类",
prop: "warning_type", prop: "class_parent_name",
align: "left", align: "left",
}, },
{ {
label: "预警指标", label: "预警指标",
prop: "warning_index", prop: "class_name",
align: "left", align: "left",
}, },
{ {
...@@ -188,42 +166,40 @@ let headers = reactive([ ...@@ -188,42 +166,40 @@ let headers = reactive([
}, },
{ {
label: "当前报警值", label: "当前报警值",
prop: "current_alarm_value", prop: "current_value",
align: "left", align: "left",
}, },
{ {
label: "预警阀值", label: "预警阀值",
prop: "warning_threshold", prop: "warn_threshold",
align: "left", align: "left",
}, },
{ {
label: "推送次数", label: "推送次数",
prop: "push_num", prop: "push_count",
align: "left", align: "left",
}, },
{ {
label: "最近推送时间", label: "最近推送时间",
prop: "push_time", prop: "last_push_time",
align: "left", align: "left",
width: 160,
}, },
{ {
label: "状态", label: "状态",
prop: "status", prop: "status",
align: "left", align: "left",
width: 90,
}, },
{ {
label: "操作", label: "操作",
prop: "operation", prop: "operation",
align: "left", align: "left",
width: "80px", width: 80,
}, fixed: "right",
]);
let rows = ref([
{
alert_point: 1,
id: 1,
}, },
]); ]);
let rows = ref([]);
const changeSize = (size) => { const changeSize = (size) => {
filter.page_size = size; filter.page_size = size;
changePage(1); changePage(1);
...@@ -234,26 +210,23 @@ const changePage = (page) => { ...@@ -234,26 +210,23 @@ const changePage = (page) => {
getTableRows(); getTableRows();
}; };
const changeSearch = (val) => { const changeSearch = (val) => {
filter.key_word = val; filter.keyword = val;
changePage(1); changePage(1);
}; // 表格关键字筛选 }; // 表格关键字筛选
const filterAction = () => { const filterAction = () => {
changePage(1); changePage(1);
}; // 查询按钮 }; // 查询按钮
onMounted(() => {
getTableRows();
});
const getTableRows = async () => { const getTableRows = async () => {
let [startTime = "", endTime = ""] = filter.date || []; let [start_time = "", end_time = ""] = filter.time || [];
let urlParams = { let params = {
...filter, ...filter,
startTime, start_time,
endTime, end_time,
}; };
Reflect.deleteProperty(urlParams, "date"); Reflect.deleteProperty(params, "time");
axios.get("/v1/api/alert_list/list", { params: urlParams }).then((res) => { axios.get("/v1/api/alert_list/list", { params }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
let { list, total_count } = res.data.data; let { list, total_count } = res.data.data;
rows.value = list || []; rows.value = list || [];
...@@ -270,7 +243,7 @@ const operation = (row) => { ...@@ -270,7 +243,7 @@ const operation = (row) => {
active_row.value = row; active_row.value = row;
visible.value = true; visible.value = true;
}; };
const goTo = ({ id }) => { const goDetail = ({ id }) => {
router.push({ router.push({
path: "/ticket/my-warn-ticket/detail", path: "/ticket/my-warn-ticket/detail",
query: { query: {
...@@ -278,6 +251,13 @@ const goTo = ({ id }) => { ...@@ -278,6 +251,13 @@ const goTo = ({ id }) => {
}, },
}); });
}; };
const getRuleTypeOptions = async () => {
ruleTypeOptions.value = await GetRuleTypeOptions();
getTableRows();
};
onBeforeMount(() => {
getRuleTypeOptions();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
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