Commit 837fff7d authored by 白舜's avatar 白舜 🎱

Merge branch 'dev0508' of ssh://cloud.wodcloud.com:10022/apaas/apaas-system-ui into dev

parents 8885d605 8913d2e8
# platform:
# runner: 10.11.92.37
kind: pipeline kind: pipeline
name: dev name: dev0508
trigger: trigger:
branch: branch:
- dev - dev0508
clone: clone:
disable: true disable: true
...@@ -63,7 +65,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -63,7 +65,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5 # 基础镜像,根据项目需求进行使用,如果第三方登录改成ui-base base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5 # 基础镜像,根据项目需求进行使用,如果第三方登录改成ui-base
dockerfile: .beagle/dockerfile dockerfile: .beagle/dockerfile
repo: wod/apaas-system-ui # 生成镜像的 分组/名称 repo: wod/apaas-system-ui # 生成镜像的 分组/名称
version: "5.0.14" # 版本号 version: "5.0.15" # 版本号
channel: amd64 channel: amd64
args: "TARGETOS=linux,TARGETARCH=amd64" # 不同架构的构建参数 args: "TARGETOS=linux,TARGETARCH=amd64" # 不同架构的构建参数
registry: registry.cn-qingdao.aliyuncs.com # 私有仓库地址 registry: registry.cn-qingdao.aliyuncs.com # 私有仓库地址
...@@ -75,10 +77,10 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -75,10 +77,10 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: deploy-amd64 - name: deploy-amd64
image: registry.cn-qingdao.aliyuncs.com/wod/devops-kubernetes:1.0 image: registry.cn-qingdao.aliyuncs.com/wod/devops-kubernetes:1.0
settings: settings:
namespace: apaas-v5-demo namespace: apaas-v5
deployment: apaas-manage-ui deployment: apaas-manage-ui
container: apaas-manage-ui container: apaas-manage-ui
image: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14-amd64 image: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15-amd64
environment: environment:
KUBERNETES_SERVER: KUBERNETES_SERVER:
from_secret: KUBERNETES_SERVER from_secret: KUBERNETES_SERVER
...@@ -94,7 +96,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -94,7 +96,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-arm64 base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-arm64
dockerfile: .beagle/dockerfile dockerfile: .beagle/dockerfile
repo: wod/apaas-system-ui repo: wod/apaas-system-ui
version: "5.0.14" version: "5.0.15"
channel: arm64 channel: arm64
args: "TARGETOS=linux,TARGETARCH=arm64" args: "TARGETOS=linux,TARGETARCH=arm64"
registry: registry.cn-qingdao.aliyuncs.com registry: registry.cn-qingdao.aliyuncs.com
...@@ -112,7 +114,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -112,7 +114,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-ppc64le base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-ppc64le
dockerfile: .beagle/dockerfile dockerfile: .beagle/dockerfile
repo: wod/apaas-system-ui repo: wod/apaas-system-ui
version: "5.0.14" version: "5.0.15"
channel: ppc64le channel: ppc64le
args: "TARGETOS=linux,TARGETARCH=ppc64le" args: "TARGETOS=linux,TARGETARCH=ppc64le"
registry: registry.cn-qingdao.aliyuncs.com registry: registry.cn-qingdao.aliyuncs.com
...@@ -130,7 +132,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -130,7 +132,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-mips64le base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-mips64le
dockerfile: .beagle/dockerfile dockerfile: .beagle/dockerfile
repo: wod/apaas-system-ui repo: wod/apaas-system-ui
version: "5.0.14" version: "5.0.15"
channel: mips64le channel: mips64le
args: "TARGETOS=linux,TARGETARCH=mips64le" args: "TARGETOS=linux,TARGETARCH=mips64le"
registry: registry.cn-qingdao.aliyuncs.com registry: registry.cn-qingdao.aliyuncs.com
...@@ -143,8 +145,8 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -143,8 +145,8 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
image: registry.cn-qingdao.aliyuncs.com/wod/devops-docker-manifest:1.0 image: registry.cn-qingdao.aliyuncs.com/wod/devops-docker-manifest:1.0
settings: settings:
platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/mips64le platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/mips64le
template: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14-ARCH template: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15-ARCH
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14 target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15
username: username:
from_secret: REGISTRY_USER_ALIYUN from_secret: REGISTRY_USER_ALIYUN
password: password:
...@@ -179,7 +181,7 @@ steps: ...@@ -179,7 +181,7 @@ steps:
REGISTRY_PASSWORD: REGISTRY_PASSWORD:
from_secret: REGISTRY_PASSWORD_ALIYUN from_secret: REGISTRY_PASSWORD_ALIYUN
settings: settings:
source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14-amd64 source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15-amd64
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-amd64 target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-amd64
registry: registry.cn-qingdao.aliyuncs.com registry: registry.cn-qingdao.aliyuncs.com
...@@ -197,7 +199,7 @@ steps: ...@@ -197,7 +199,7 @@ steps:
REGISTRY_PASSWORD: REGISTRY_PASSWORD:
from_secret: REGISTRY_PASSWORD_ALIYUN from_secret: REGISTRY_PASSWORD_ALIYUN
settings: settings:
source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14-arm64 source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15-arm64
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-arm64 target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-arm64
registry: registry.cn-qingdao.aliyuncs.com registry: registry.cn-qingdao.aliyuncs.com
...@@ -215,7 +217,7 @@ steps: ...@@ -215,7 +217,7 @@ steps:
REGISTRY_PASSWORD: REGISTRY_PASSWORD:
from_secret: REGISTRY_PASSWORD_ALIYUN from_secret: REGISTRY_PASSWORD_ALIYUN
settings: settings:
source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14-ppc64le source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15-ppc64le
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-ppc64le target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-ppc64le
registry: registry.cn-qingdao.aliyuncs.com registry: registry.cn-qingdao.aliyuncs.com
...@@ -233,7 +235,7 @@ steps: ...@@ -233,7 +235,7 @@ steps:
REGISTRY_PASSWORD: REGISTRY_PASSWORD:
from_secret: REGISTRY_PASSWORD_ALIYUN from_secret: REGISTRY_PASSWORD_ALIYUN
settings: settings:
source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.14-mips64le source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.15-mips64le
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-mips64le target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0-mips64le
##--------------对于需要保密的信息隐藏,减少账户信息的泄密⬇-----------------## ##--------------对于需要保密的信息隐藏,减少账户信息的泄密⬇-----------------##
--- ---
......
...@@ -46,6 +46,9 @@ import login from "@/page/login/index.vue"; ...@@ -46,6 +46,9 @@ import login from "@/page/login/index.vue";
import page404 from "@/page/404.vue"; import page404 from "@/page/404.vue";
import register from "@/page/register/index.vue"; import register from "@/page/register/index.vue";
import password from "@/page/password/index.vue"; import password from "@/page/password/index.vue";
import { clearCookie } from "@/services/cookie.js";
import { resetRouter } from "@/router/index";
export default { export default {
components: { components: {
bgMenu, bgMenu,
...@@ -111,8 +114,64 @@ export default { ...@@ -111,8 +114,64 @@ export default {
created() { created() {
// this.initMsg() // this.initMsg()
}, },
mounted() {}, mounted() {
this.getSysOptions();
},
methods: { methods: {
/**
* 设置用户多久不操作就跳转到登录界面
* limit:用户无操作时常限制(分钟)
*/
exitSystemAfterLimit(limit) {
window.lastOperateTime = new Date();
window.onload = this.addOperateListener;
this.setTimer(limit);
},
//绑定用户操作事件
addOperateListener() {
document.addEventListener("mousemove", this.resetStartTime);
document.addEventListener("keydown", this.resetStartTime);
document.addEventListener("scroll", this.resetStartTime);
document.addEventListener("touchstart", this.resetStartTime);
},
//重置起始时间
resetStartTime() {
window.lastOperateTime = new Date();
},
//设置定时器
setTimer(limit) {
window.logTimer = setInterval(() => {
var currentTime = new Date();
var timeDiff = currentTime.getTime() - lastOperateTime.getTime();
if (timeDiff > limit * 60 * 1000) {
clearInterval(window.logTimer);
this.$axios.post(`/apaas/system/v5/user/logout`).then((res) => {
if (res.data.code == "200") {
window.location.href = `/apaas/manage/ui/#/login`;
this.$store.commit("setUserInfo", null);
clearCookie("bgToken");
this.$message.success("退出成功");
resetRouter();
} else {
this.$message.error("退出失败");
}
});
}
}, 1000);
},
getSysOptions() {
this.$axios.get(`/apaas/system/v5/sysOptions`).then((res) => {
if (res.data.code == 200) {
const result = res.data.data || {};
if (result.session_validity) this.exitSystemAfterLimit(result.session_validity);
} else {
this.$message.error(res.data.data);
}
});
},
openMsg(data) { openMsg(data) {
this.readFlag = !this.readFlag; this.readFlag = !this.readFlag;
}, },
......
...@@ -24,11 +24,11 @@ ...@@ -24,11 +24,11 @@
<!-- 序号 --> <!-- 序号 -->
</el-table-column> </el-table-column>
<el-table-column <el-table-column
v-for="(header, index) in headers" v-for="(header) in headers"
:width="header.width" :width="header.width"
:min-width="header.minWidth" :min-width="header.minWidth"
:align="header.align" :align="header.align"
:key="'col_' + index" :key="'col_' + header.prop"
:fixed="header.fixed" :fixed="header.fixed"
show-overflow-tooltip> show-overflow-tooltip>
<template v-slot:header> <template v-slot:header>
......
<template> <template>
<div class="register-personal-user"> <div class="register-personal-user">
<el-form ref="form" :model="formData" :rules="formDataRules"> <el-form ref="form" :model="formData" :rules="formDataRules">
<el-form-item label="用户组织机构" prop="oid"> <el-form-item label="用户组织" prop="oid">
<el-select <el-select
v-model="formData.oid" v-model="formData.oid"
placeholder="搜索并选择" placeholder="搜索并选择"
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
import md5 from "js-md5"; import md5 from "js-md5";
export default { export default {
name: "RegisterOrgUser", // 注册政府机构用户 name: "RegisterOrgUser", // 注册政府组织用户
data() { data() {
const validateUserId = (rule, value, callback) => { const validateUserId = (rule, value, callback) => {
let reg = new RegExp(/^[a-zA-Z0-9|\-|_|\.]+$/); let reg = new RegExp(/^[a-zA-Z0-9|\-|_|\.]+$/);
...@@ -151,7 +151,7 @@ ...@@ -151,7 +151,7 @@
formData: { formData: {
is_inside: 1, // 固定1 is_inside: 1, // 固定1
user_category: 0, // 用户类型0 user_category: 0, // 用户类型0
oid: "", // 用户组织机构 必填 oid: "", // 用户组织 必填
user_id: "", // 用户名 必填 user_id: "", // 用户名 必填
password: "", // 密码 必填 password: "", // 密码 必填
confirm_password: "", confirm_password: "",
...@@ -164,7 +164,7 @@ ...@@ -164,7 +164,7 @@
}, },
formDataRules: { formDataRules: {
oid: [ oid: [
{ required: true, message: "请选择用户组织机构", trigger: "change" }, { required: true, message: "请选择用户组织", trigger: "change" },
], ],
user_id: [ user_id: [
{ required: true, message: "请输入用户名", trigger: "blur" }, { required: true, message: "请输入用户名", trigger: "blur" },
...@@ -302,4 +302,3 @@ ...@@ -302,4 +302,3 @@
} }
} }
</style> </style>
\ No newline at end of file
<template>
<div class="h-full" @click="readFlag = false">
<el-config-provider>
<bg-menu v-if="menuShow" :path="nowParent.path" @open-msg="openMsg" />
<div v-if="pageShow" class="container" :class="menuShow ? '' : 'full_screen'">
<bg-nav
v-if="nowParent.children"
v-show="navShow"
:highlight-parent-rule="highlightParentRule"
width="208px"
:list="nowParent.children"
class="con-nav" />
<div class="bg-main view log_content_nor">
<router-view />
</div>
</div>
<div v-else-if="$route.path == '/login'" class="container">
<div class="bg-main view">
<login />
</div>
</div>
<div v-else-if="$route.path == '/404'" class="container">
<div class="bg-main view">
<page404 />
</div>
</div>
<msg v-model="readFlag" />
</el-config-provider>
</div>
</template>
<script setup>
import { computed, onBeforeMount, reactive, watch, ref, getCurrentInstance } from "vue";
import { useRoute } from "vue-router";
import store from "@/store";
import bgMenu from "@/components/bg-menu.vue";
import login from "@/page/login/index.vue";
import page404 from "@/page/404.vue";
import axios from "@/request/http.js";
import { clearCookie } from "@/services/cookie.js";
import { resetRouter } from "@/router/index";
const route = useRoute();
const { proxy } = getCurrentInstance();
const { $trace } = proxy;
const msgBoxFlag = computed(() => {
return store.state.msgBoxFlag;
});
const userInfo = computed(() => {
return store.state.userInfo;
});
const navMenu = computed(() => {
return store.state.menu;
});
const menuObj = computed(() => {
return store.state.menuObj;
});
const navShow = computed(() => {
return (
false ||
!(
excludeMenuArr.includes(route.path) ||
excludeMenuArr.includes(store.state.menuObj[route.path].source)
)
);
});
const pageShow = computed(() => {
return false || !["/404", "/login"].includes(route.path);
});
const rowPath = computed(() => {
if (pageShow.value && store.state.userInfo) {
return menuObj.value[route.path] && menuObj.value[route.path].rowPath;
} else {
return "";
}
});
const nowParent = computed(() => {
if (pageShow.value && store.state.userInfo) {
return rowPath.value ? navMenu.value[rowPath.value.slice(1, 2)] : "";
} else {
return "";
}
});
const menuShow = computed(() => {
return false || !["/ui-example"].includes(route.path);
});
watch(
() => msgBoxFlag.value,
(n, o) => {
readFlag.value = !readFlag.value;
}
);
watch(
() => userInfo.value,
(n, o) => {
this.initMsg();
}
);
const readFlag = ref(false);
const excludeMenuArr = reactive([
"/",
"/404",
"/login",
"/ability-manage/real-list/detail",
"/ability-manage/mock-list/detail",
"/ability-register/add/desc",
"/ability-register/edit/desc",
"/ability-register/add/preview",
"/ability-register/edit/preview",
"/ui-example",
"/ability-register/add/valid",
"/ability-manage/ability-maintain/detail",
"/ability-manage/sold-approval/detail",
"/ability-manage/sold-list/detail",
"/ability-manage/search-list/detail",
"/ability-manage/my-apply/detail",
"/ability-manage/my-apply/update",
"/ability-manage/ability-approval/detail",
"/shop",
"/shop/detail",
"/my-subscription",
"/my-subscription/ability-shop-apply",
"/my-subscription/ability-apply-success",
"/password",
"/app-manage/app-detail",
"/cloud-manage/cloud-detail",
"/cloud-manage/my-apply/resource",
"/app-manage/deployment-detail",
"/customer-support",
]);
onBeforeMount(() => {
initMsg();
getSysOptions();
});
/**
* 设置用户多久不操作就跳转到登录界面
* limit:用户无操作时常限制(分钟)
*/
const exitSystemAfterLimit = (limit) => {
window.lastOperateTime = new Date();
window.onload = addOperateListener;
setTimer(limit);
};
//绑定用户操作事件
const addOperateListener = () => {
document.addEventListener("mousemove", resetStartTime);
document.addEventListener("keydown", resetStartTime);
document.addEventListener("scroll", resetStartTime);
document.addEventListener("touchstart", resetStartTime);
};
//重置起始时间
const resetStartTime = () => {
window.lastOperateTime = new Date();
};
//设置定时器
const setTimer = (limit) => {
window.logTimer = setInterval(() => {
var currentTime = new Date();
var timeDiff = currentTime.getTime() - lastOperateTime.getTime();
if (timeDiff > limit * 60 * 1000) {
clearInterval(window.logTimer);
$axios.post("/apaas/system/v5/user/logout").then((res) => {
if (res.data.code == "200") {
window.location.href = "/apaas/manage/ui/#/login";
$store.commit("setUserInfo", null);
clearCookie("bgToken");
$message.success("退出成功");
resetRouter();
} else {
$message.error("退出失败");
}
});
}
}, 1000);
};
const getSysOptions = () => {
axios.get("/apaas/system/v5/sysOptions").then((res) => {
if (res.data.code == 200) {
const result = res.data.data || {};
if (result.session_validity) exitSystemAfterLimit(result.session_validity);
} else {
$message.error(res.data.data);
}
});
};
const openMsg = (data) => {
readFlag.value = !readFlag.value;
};
const initMsg = () => {
if (userInfo.value && userInfo.value && userInfo.value.system_id) {
$trace.setOptionValue("userId", userInfo.value.system_id);
$trace.setOptionValue("organization", userInfo.value.organization_id);
}
};
const pathToData = (data, path) => {
let arr = path.split(".");
let temp = null;
let tempName = "";
let tempPath = "";
arr.forEach((e, idx) => {
if (idx == 1) {
temp = data[e];
tempName = data[e].menuName;
tempPath = data[e].path;
data = data[e];
}
if (idx == 2) {
if (data.children && data.children.length) {
temp = data.children[e];
data = data.children[e];
}
}
});
return {
menuName: tempName,
path: tempPath,
children: [temp],
};
};
const highlightParentRule = (pathArr) => {
return pathArr.includes(route.path);
};
</script>
<style>
.h-full {
height: 100%;
}
.container {
width: 100%;
height: calc(100% - 56px);
overflow: hidden;
}
.full_screen {
height: 100%;
}
.full_screen .bg-main {
overflow-x: hidden;
}
.con-nav {
float: left;
}
.view {
height: 100%;
overflow-y: auto;
}
</style>
<template> <template>
<div style="height:100%;"> <div style="height: 100%">
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
props: { props: {},
components: {},
},
components: {
},
data() { data() {
return { return {};
};
},
watch: {
},
computed: {
},
created() {
},
mounted() {
},
methods: {
}, },
watch: {},
computed: {},
created() {},
mounted() {},
methods: {},
}; };
</script> </script>
<style scoped> <style scoped></style>
</style>
...@@ -107,6 +107,7 @@ const getSysOptions = () => { ...@@ -107,6 +107,7 @@ const getSysOptions = () => {
axios.get(`/apaas/system/v5/sysOptions`).then((res) => { axios.get(`/apaas/system/v5/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.session_validity) exitSystemAfterLimit(result.session_validity);
if (result.license_dead_date && result.license_inform_day) { if (result.license_dead_date && result.license_inform_day) {
calculateValidityDays( calculateValidityDays(
new Date().getTime(), new Date().getTime(),
......
...@@ -25,15 +25,22 @@ ...@@ -25,15 +25,22 @@
</div> </div>
<div class="flex_right"> <div class="flex_right">
<div class="main_container"> <div class="main_container">
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字"> <bg-filter-group
<template v-slot:left_action v-if="nodeClassifyId != '263758a4-0349-4d49-a816-e8ff8d33a8bb'"> @search="changeSearch"
v-model="filter.search"
placeholder="请输入关键字">
<template
v-slot:left_action
v-if="nodeClassifyId != '263758a4-0349-4d49-a816-e8ff8d33a8bb'">
<div class="apaas_button"> <div class="apaas_button">
<el-button type="primary" @click="backDict" v-if="dictLevel != 1"> <el-button type="primary" @click="backDict" v-if="dictLevel != 1">
<!-- <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> --> <!-- <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> -->
返回上级 返回上级
</el-button> </el-button>
<el-button type="primary" @click="register"> <el-button type="primary" @click="register">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> <bg-icon
style="font-size: 12px; color: #fff; margin-right: 8px"
icon="#bg-ic-add"></bg-icon>
新增 新增
</el-button> </el-button>
</div> </div>
...@@ -60,9 +67,14 @@ ...@@ -60,9 +67,14 @@
</bg-filter-group> </bg-filter-group>
<div class="table_container"> <div class="table_container">
<div class="table bg-scroll"> <div class="table bg-scroll">
<bg-table ref="bgTable" :headers="isLang && dictLevel == 1 ? langHeaders : headers" :rows="tableRows" :isIndex="true" :stripe="true"> <bg-table
ref="bgTable"
:headers="headers"
:rows="tableRows"
:isIndex="true"
:stripe="true">
<template v-slot:name="{ row }"> <template v-slot:name="{ row }">
<span class="can_click_text" @click="getChildren(row)" v-if="isLang && dictLevel == 1"> <span class="can_click_text" @click="getChildren(row)" v-if="row.children">
{{ row.name }} {{ row.name }}
</span> </span>
<span v-else> <span v-else>
...@@ -81,17 +93,33 @@ ...@@ -81,17 +93,33 @@
</template> </template>
<template v-slot:action="{ row }"> <template v-slot:action="{ row }">
<!-- 除技术类型之外的字典可以删除 --> <!-- 除技术类型之外的字典可以删除 -->
<bg-table-btns2 :limit="3" v-if="nodeClassifyId !== '263758a4-0349-4d49-a816-e8ff8d33a8bb'"> <bg-table-btns2
<bg-table-btn @click="edit_row(row)" :disabled="row.state == 1">编辑</bg-table-btn> :limit="3"
<bg-table-btn @click="delete_row(row)" :disabled="row.state == 1">删除</bg-table-btn> v-if="nodeClassifyId !== '263758a4-0349-4d49-a816-e8ff8d33a8bb'">
<bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp">上移</bg-table-btn> <bg-table-btn @click="edit_row(row)" :disabled="row.state == 1"
<bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown">下移</bg-table-btn> >编辑</bg-table-btn
>
<bg-table-btn @click="delete_row(row)" :disabled="row.state == 1"
>删除</bg-table-btn
>
<bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp"
>上移</bg-table-btn
>
<bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown"
>下移</bg-table-btn
>
</bg-table-btns2> </bg-table-btns2>
<!-- 技术类型字典不可删除 --> <!-- 技术类型字典不可删除 -->
<bg-table-btns2 :limit="3" v-else> <bg-table-btns2 :limit="3" v-else>
<bg-table-btn @click="edit_row(row)" :disabled="row.state == 1">编辑</bg-table-btn> <bg-table-btn @click="edit_row(row)" :disabled="row.state == 1"
<bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp">上移</bg-table-btn> >编辑</bg-table-btn
<bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown">下移</bg-table-btn> >
<bg-table-btn @click="moveRow(row, 1)" :disabled="!row.canMoveUp"
>上移</bg-table-btn
>
<bg-table-btn @click="moveRow(row, 2)" :disabled="!row.canMoveDown"
>下移</bg-table-btn
>
</bg-table-btns2> </bg-table-btns2>
</template> </template>
</bg-table> </bg-table>
...@@ -108,7 +136,11 @@ ...@@ -108,7 +136,11 @@
</div> </div>
</div> </div>
<!-- 新增/编辑弹窗 --> <!-- 新增/编辑弹窗 -->
<el-dialog class="dialog_box" :title="addType == 1 ? '新增' : '编辑'" v-model="addDialog" width="758px"> <el-dialog
class="dialog_box"
:title="addType == 1 ? '新增' : '编辑'"
v-model="addDialog"
width="758px">
<el-form ref="bgForm" :model="formData" :rules="rules" label-width="80px" class="bg_form"> <el-form ref="bgForm" :model="formData" :rules="rules" label-width="80px" class="bg_form">
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input <el-input
...@@ -176,21 +208,15 @@ ...@@ -176,21 +208,15 @@
</template> </template>
<script setup> <script setup>
import { reactive, ref, onBeforeMount, toRefs, computed, watch, nextTick } from "vue"; import { reactive, ref, onBeforeMount, toRefs, computed, watch, nextTick, watchEffect } from "vue";
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 { 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";
const bgForm = ref(null); const bgForm = ref(null);
const state = reactive({
bgForm, const headers = computed(() => {
typeList: [], // 分类数据 let _headers = [
typeKeyword: "", // 分类删选关键词
nodeClassifyId: null, // 当前选中分类的uuid 用于新增字典
nodeId: null, // 当前选中分类的id 用于请求列表
timer: null, // 定时器
headers: [
{ {
label: "名称", label: "名称",
prop: "name", prop: "name",
...@@ -215,37 +241,29 @@ const state = reactive({ ...@@ -215,37 +241,29 @@ const state = reactive({
width: 176, width: 176,
fixed: "right", fixed: "right",
}, },
], // 表格数据表头 ];
langHeaders: [
{ if (state.nodeClassifyId === "59315100-5c2a-4381-83fe-32934605f0a9") {
label: "名称", _headers.splice(1, 0, {
prop: "name",
},
{
label: "版本数", label: "版本数",
prop: "total_children", prop: "total_children",
}, });
{ }
label: "描述", if (state.nodeClassifyId === "b3a083ee-a8c1-8ca4-f9a1-ea01692a0f1a") {
prop: "describe", _headers.splice(1, 0, {
minWidth: 360, label: "服务名称",
}, prop: "service_name",
{ });
label: "更新时间", }
prop: "updated_time", return _headers;
width: 220, });
}, const state = reactive({
{ bgForm,
label: "是否启用", typeList: [], // 分类数据
prop: "state", typeKeyword: "", // 分类删选关键词
}, nodeClassifyId: null, // 当前选中分类的uuid 用于新增字典
{ nodeId: null, // 当前选中分类的id 用于请求列表
label: "操作", timer: null, // 定时器
prop: "action",
width: 176,
fixed: "right",
},
],
tableRows: [], // 表格数据 tableRows: [], // 表格数据
tableTotal: 0, // 表格数据条数 tableTotal: 0, // 表格数据条数
filter: { filter: {
...@@ -289,27 +307,23 @@ const state = reactive({ ...@@ -289,27 +307,23 @@ const state = reactive({
fatherRow: null, fatherRow: null,
}); });
const isLang = computed(() => { const dictLevel = ref(1);
return state.nodeClassifyId == "59315100-5c2a-4381-83fe-32934605f0a9"
})
const dictLevel = ref(1)
const getChildren = (row) => { const getChildren = (row) => {
dictLevel.value = 2 dictLevel.value = 2;
state.tableRows = row.children || [] state.tableRows = row.children || [];
state.tableTotal = row.total_children state.tableTotal = row.total_children;
state.fatherRow = row state.fatherRow = row;
} };
const backDict = () => { const backDict = () => {
dictLevel.value = 1 dictLevel.value = 1;
state.fatherRow = null state.fatherRow = null;
changePage(1); changePage(1);
} };
const nodeClick = (item) => { const nodeClick = (item) => {
state.nodeId = item.id; state.nodeId = item.id;
dictLevel.value = 1 dictLevel.value = 1;
state.fatherRow = null state.fatherRow = null;
state.nodeClassifyId = item.classify_id; state.nodeClassifyId = item.classify_id;
state.filter = { state.filter = {
state: "", state: "",
...@@ -380,14 +394,16 @@ const getTableRows = () => { ...@@ -380,14 +394,16 @@ const getTableRows = () => {
}) })
.then((res) => { .then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
let data = res.data.data || [] let data = res.data.data || [];
if (dictLevel.value == 1) { if (dictLevel.value == 1) {
state.tableRows = data; state.tableRows = data;
state.tableTotal = res.data.total; state.tableTotal = res.data.total;
}else { } else {
let row = data.filter(e => {return e.dict_id == state.fatherRow.dict_id}) let row = data.filter((e) => {
state.tableRows = row[0].children return e.dict_id == state.fatherRow.dict_id;
state.tableTotal = row[0].total_children });
state.tableRows = row[0].children;
state.tableTotal = row[0].total_children;
} }
if (state.tableRows.length > 0) { if (state.tableRows.length > 0) {
state.tableRows.forEach((e) => { state.tableRows.forEach((e) => {
...@@ -455,7 +471,7 @@ const edit_row = (row) => { ...@@ -455,7 +471,7 @@ const edit_row = (row) => {
name: state.actionRow.name, name: state.actionRow.name,
describe: state.actionRow.describe, describe: state.actionRow.describe,
state: state.actionRow.state, state: state.actionRow.state,
p_dict_id: state.actionRow.p_dict_id p_dict_id: state.actionRow.p_dict_id,
}; };
} else { } else {
ElMessage.error(res.data.data); ElMessage.error(res.data.data);
...@@ -580,7 +596,6 @@ const { ...@@ -580,7 +596,6 @@ const {
typeList, typeList,
typeKeyword, typeKeyword,
nodeClassifyId, nodeClassifyId,
headers,
tableRows, tableRows,
tableTotal, tableTotal,
filter, filter,
...@@ -590,7 +605,6 @@ const { ...@@ -590,7 +605,6 @@ const {
addDialog, addDialog,
formData, formData,
rules, rules,
langHeaders,
} = toRefs(state); } = toRefs(state);
</script> </script>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
:rules="formRules" :rules="formRules"
ref="systemRef" ref="systemRef"
style="max-width: 66%"> style="max-width: 66%">
<el-form-item label="所属机构" prop="organization_id"> <el-form-item label="所属组织" prop="organization_id">
<el-tree-select <el-tree-select
v-model="systemForm.organization_id" v-model="systemForm.organization_id"
:data="orgData" :data="orgData"
...@@ -225,7 +225,7 @@ const checkPhoneRepet = (rule, value, callback) => { ...@@ -225,7 +225,7 @@ const checkPhoneRepet = (rule, value, callback) => {
}; };
const formRules = reactive({ const formRules = reactive({
organization_id: [{ required: true, message: "请选择组织机构", trigger: "change" }], organization_id: [{ required: true, message: "请选择组织", trigger: "change" }],
business_name: [ business_name: [
{ required: true, message: "请输入业务系统名称", trigger: "blur" }, { required: true, message: "请输入业务系统名称", trigger: "blur" },
{ max: 50, message: "业务系统名称最大长度为50个字符", trigger: "blur" }, { max: 50, message: "业务系统名称最大长度为50个字符", trigger: "blur" },
......
...@@ -46,7 +46,7 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; ...@@ -46,7 +46,7 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
const route = useRoute(); const route = useRoute();
const baseInfo = reactive([ const baseInfo = reactive([
{ {
name: "所属机构", name: "所属组织",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<bg-breadcrumb></bg-breadcrumb> <bg-breadcrumb></bg-breadcrumb>
<div class="flex_row"> <div class="flex_row">
<div class="flex_left bgc_white"> <div class="flex_left bgc_white">
<div class="tree_header">政务机构</div> <div class="tree_header">政务组织</div>
<div class="tree_content"> <div class="tree_content">
<div class="search"> <div class="search">
<el-input v-model="filterTree" placeholder="请输入组织名称搜索" :prefix-icon="Search" /> <el-input v-model="filterTree" placeholder="请输入组织名称搜索" :prefix-icon="Search" />
...@@ -207,7 +207,7 @@ const headers = ref([ ...@@ -207,7 +207,7 @@ const headers = ref([
prop: "system_account", prop: "system_account",
}, },
{ {
label: "所属机构", label: "所属组织",
prop: "organization_name", prop: "organization_name",
minWidth: 180, minWidth: 180,
}, },
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<el-form-item label="审批结果" prop="status"> <el-form-item label="审批结果" prop="status">
<el-radio-group v-model="instanceData.formData.status"> <el-radio-group v-model="instanceData.formData.status">
<el-radio :label="1"> 通过 </el-radio> <el-radio :label="1"> 通过 </el-radio>
<el-radio :label="0"> 驳回 </el-radio> <el-radio :label="2"> 驳回 </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="审批意见" prop="comments"> <el-form-item label="审批意见" prop="comments">
...@@ -76,7 +76,7 @@ const instanceData = reactive({ ...@@ -76,7 +76,7 @@ const instanceData = reactive({
approveBasicInfo: [ approveBasicInfo: [
{ {
key: "organization_name", key: "organization_name",
label: "所属机构", label: "所属组织",
value: "", value: "",
// slot: "approvalStatus", // slot: "approvalStatus",
}, },
......
...@@ -17,6 +17,7 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue"; ...@@ -17,6 +17,7 @@ import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import { useRoute } from "vue-router"; import { 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 { dateStringTransform } from "@/services/helper.js";
const route = useRoute(); const route = useRoute();
...@@ -24,7 +25,7 @@ const instanceData = reactive({ ...@@ -24,7 +25,7 @@ const instanceData = reactive({
approveBasicInfo: [ approveBasicInfo: [
{ {
key: "organization_name", key: "organization_name",
label: "所属机构", label: "所属组织",
value: "", value: "",
// slot: "approvalStatus", // slot: "approvalStatus",
}, },
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<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 @search="changeSearch" v-model="filter.search" placeholder="请输入业务系统名称、账号或所属机构"> <bg-filter-group @search="changeSearch" v-model="filter.search" 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"> <div class="filter_item">
...@@ -133,7 +133,7 @@ const state = reactive({ ...@@ -133,7 +133,7 @@ const state = reactive({
minWidth: 120, minWidth: 120,
}, },
{ {
label: "所属机构", label: "所属组织",
prop: "organization_name", prop: "organization_name",
width: 200, width: 200,
}, },
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<bg-filter-group <bg-filter-group
@search="changeSearch" @search="changeSearch"
v-model="filter.search" v-model="filter.search"
placeholder="请输入账号、手机号和所属机构"> 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">
...@@ -206,7 +206,7 @@ const state = reactive({ ...@@ -206,7 +206,7 @@ const state = reactive({
// width: 200, // width: 200,
}, },
{ {
label: "所属机构", label: "所属组织",
prop: "name", prop: "name",
// width: 120, // width: 120,
}, },
......
...@@ -3,7 +3,22 @@ ...@@ -3,7 +3,22 @@
<bg-breadcrumb></bg-breadcrumb> <bg-breadcrumb></bg-breadcrumb>
<div class="page_content"> <div class="page_content">
<bg-form-gap title="详情"></bg-form-gap> <bg-form-gap title="详情"></bg-form-gap>
<bg-detail-table2 class="detail_info" :list="instanceData.detailInfo"> </bg-detail-table2> <bg-detail-table2 class="detail_info" :list="instanceData.detailInfo">
<template #req_url_value="{ data }">
<el-popover placement="top-start" :width="600" trigger="hover" :content="data.value">
<template #reference>
<p class="show_in_line">{{ data.value }}</p>
</template>
</el-popover>
</template>
<template #res_fields_value="{ data }">
<el-popover placement="bottom-start" :width="800" trigger="hover" :content="data.value">
<template #reference>
<p class="show_in_line">{{ data.value }}</p>
</template>
</el-popover>
</template>
</bg-detail-table2>
</div> </div>
</div> </div>
</template> </template>
...@@ -37,7 +52,7 @@ const instanceData = reactive({ ...@@ -37,7 +52,7 @@ const instanceData = reactive({
}, },
{ {
key: "org_name", key: "org_name",
label: "所属机构", label: "所属组织",
value: "", value: "",
}, },
{ {
...@@ -81,6 +96,7 @@ const instanceData = reactive({ ...@@ -81,6 +96,7 @@ const instanceData = reactive({
label: "请求地址", label: "请求地址",
value: "", value: "",
width: "100%", width: "100%",
childSlot: "req_url_value",
}, },
{ {
key: "req_param", key: "req_param",
...@@ -96,6 +112,7 @@ const instanceData = reactive({ ...@@ -96,6 +112,7 @@ const instanceData = reactive({
key: "res_fields", key: "res_fields",
label: "返回参数", label: "返回参数",
value: "", value: "",
childSlot: "res_fields_value",
}, },
], ],
}); });
...@@ -130,5 +147,11 @@ const getDetailInfo = () => { ...@@ -130,5 +147,11 @@ const getDetailInfo = () => {
margin-bottom: 24px; margin-bottom: 24px;
width: 960px; width: 960px;
} }
.show_in_line {
overflow: hidden;
width: 824px;
text-overflow: ellipsis;
white-space: nowrap;
}
} }
</style> </style>
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<bg-filter-group <bg-filter-group
@search="changeSearch" @search="changeSearch"
v-model="filter.search" v-model="filter.search"
placeholder="请输入账号、手机号和所属机构"> 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">
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<bg-breadcrumb></bg-breadcrumb> <bg-breadcrumb></bg-breadcrumb>
<div class="flex_row"> <div class="flex_row">
<div class="flex_left bgc_white"> <div class="flex_left bgc_white">
<div class="tree_header">政务机构</div> <div class="tree_header">政务组织</div>
<div class="tree_content"> <div class="tree_content">
<div class="search"> <div class="search">
<el-input v-model="search" placeholder="请输入组织名称搜索" :prefix-icon="Search" @input="searchChange" /> <el-input v-model="search" placeholder="请输入组织名称搜索" :prefix-icon="Search" @input="searchChange" />
...@@ -282,17 +282,17 @@ const toOrgDetail = () => { ...@@ -282,17 +282,17 @@ const toOrgDetail = () => {
}; };
const baseInfo = reactive([ const baseInfo = reactive([
{ {
name: "机构类型", name: "组织类型",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
{ {
name: "组织机构代码", name: "组织代码",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
{ {
name: "机构名称", name: "组织名称",
value: "", value: "",
callback: toOrgDetail, callback: toOrgDetail,
nameWidth: 130, nameWidth: 130,
...@@ -315,12 +315,12 @@ const baseInfo = reactive([ ...@@ -315,12 +315,12 @@ const baseInfo = reactive([
]); ]);
const baseInfo2 = reactive([ const baseInfo2 = reactive([
{ {
name: "机构名称", name: "组织名称",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
{ {
name: "组织机构代码", name: "组织代码",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
......
...@@ -60,12 +60,12 @@ const route = useRoute(); ...@@ -60,12 +60,12 @@ const route = useRoute();
const baseInfo = reactive([ const baseInfo = reactive([
{ {
name: "机构名称", name: "组织名称",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
{ {
name: "组织机构代码", name: "组织代码",
value: "", value: "",
nameWidth: 130, nameWidth: 130,
}, },
......
...@@ -13,10 +13,10 @@ ...@@ -13,10 +13,10 @@
<el-checkbox v-model="orgForm.level" @change="isTop" label="顶级" /> <el-checkbox v-model="orgForm.level" @change="isTop" label="顶级" />
</el-form-item> </el-form-item>
</el-form-item> </el-form-item>
<el-form-item label="政务机构名称" prop="name"> <el-form-item label="政务组织名称" prop="name">
<el-input v-model="orgForm.name" /> <el-input v-model="orgForm.name" />
</el-form-item> </el-form-item>
<el-form-item label="组织机构代码" prop="organization_code"> <el-form-item label="组织代码" prop="organization_code">
<el-input v-model="orgForm.organization_code" /> <el-input v-model="orgForm.organization_code" />
</el-form-item> </el-form-item>
<el-form-item label="组织介绍" prop="description"> <el-form-item label="组织介绍" prop="description">
...@@ -75,13 +75,13 @@ const checkName = (rule, value, callback) => { ...@@ -75,13 +75,13 @@ const checkName = (rule, value, callback) => {
const formRules = reactive({ const formRules = reactive({
p_organization_id: [{ required: true, message: "输入上级目录", trigger: "blur" }], p_organization_id: [{ required: true, message: "输入上级目录", trigger: "blur" }],
name: [ name: [
{ required: true, message: "请输入机构名称", trigger: "blur" }, { required: true, message: "请输入组织名称", trigger: "blur" },
{ max: 50, message: "机构名称最大长度为50位", trigger: "blur" }, { max: 50, message: "组织名称最大长度为50位", trigger: "blur" },
{ validator: checkName, trigger: "blur" }, { validator: checkName, trigger: "blur" },
], ],
organization_code: [ organization_code: [
{ required: true, message: "请输入组织机构代码", trigger: "blur" }, { required: true, message: "请输入组织代码", trigger: "blur" },
{ max: 18, message: "组织机构代码最大长度为18位", trigger: "blur" }, { max: 18, message: "组织代码最大长度为18位", trigger: "blur" },
{ validator: checkCode, trigger: "blur" }, { validator: checkCode, trigger: "blur" },
], ],
}); });
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
:rules="orgAccountFormRules" :rules="orgAccountFormRules"
ref="orgformAccountRef" ref="orgformAccountRef"
style="max-width: 66%"> style="max-width: 66%">
<el-form-item label="所属组织机构" prop="organization_id"> <el-form-item label="所属组织" prop="organization_id">
<el-tree-select <el-tree-select
v-model="orgAccountForm.organization_id" v-model="orgAccountForm.organization_id"
:data="orgData" :data="orgData"
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
<div class="dashed_line"></div> <div class="dashed_line"></div>
</div> </div>
<div class="info-form"> <div class="info-form">
<el-form-item prop="organization_id" label="所属机构"> <el-form-item prop="organization_id" label="所属组织">
<el-tree-select <el-tree-select
v-model="infoForm.organization_id" v-model="infoForm.organization_id"
:data="orgData" :data="orgData"
......
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