Browse Source

Merge branch 'qin_26' into power_master

# Conflicts:
#	src/utils/workflow/index.ts   resolved by qin_26 version
power_master
herenshan112 3 weeks ago
parent
commit
401762d554
  1. 67
      src/api/system/roleapi/postrole.ts
  2. 49
      src/api/system/roleapi/power.ts
  3. 43
      src/api/system/roleapi/types.ts
  4. 2
      src/api/user/types.ts
  5. 2
      src/components/workflow/dialog/errorDialog.vue
  6. 1
      src/components/workflow/drwer/approverDrawer.vue
  7. 2
      src/directive/index.ts
  8. 23
      src/directive/permission/button.ts
  9. 5
      src/store/modules/user.ts
  10. 34
      src/utils/workflow/index.ts
  11. 5
      src/views/hr/archives/archivescont.vue
  12. 1293
      src/views/hr/archives/index.vue
  13. 200
      src/views/hr/archives/index_20251202.vue
  14. 1465
      src/views/hr/archives/index_251128.vue
  15. 274
      src/views/hr/archives/unitpage/addUserPage.vue
  16. 235
      src/views/hr/archives/unitpage/batchImport.vue
  17. 96
      src/views/hr/archives/unitpage/lockInfo.vue
  18. 222
      src/views/hr/archives/unitpage/uploadTemplate.vue
  19. 12
      src/views/nested/.editorconfig
  20. 3
      src/views/powermanage/rolepower/setuprole/setuprolepower.vue
  21. 865
      src/views/system/monitor/online/index copy 4.vue
  22. 871
      src/views/system/monitor/online/index.vue
  23. 903
      src/views/system/monitor/online/index123.vue
  24. 819
      src/views/system/monitor/online/index2.vue
  25. 0
      src/views/system/monitor/online/index_20251112.vue
  26. 283
      src/views/system/monitor/online/page.vue
  27. 308
      src/views/system/monitor/online/roleConfig/setRolePeople.vue
  28. 1
      src/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue
  29. 248
      src/views/taskplatform/taskmanagement/edittaskcustomerform.vue
  30. 3
      src/views/taskplatform/taskmanagement/flowStep.vue
  31. 215
      vite.config.ts.timestamp-1762732876054-97f8b5f7ef739.mjs
  32. 215
      vite.config.ts.timestamp-1763685117626-b9e83b063ec3.mjs

67
src/api/system/roleapi/postrole.ts

@ -103,6 +103,13 @@ export function gainAppTableList(data?: any){
data:data data:data
}); });
} }
export function gainAppTableListNew(data?: any){
return request({
url: '/systemapi/grant/gainAppTableListNew',
method: 'post',
data:data
});
}
/** /**
* *
*/ */
@ -113,3 +120,63 @@ export function setpAppTableForms(data?: any){
data:data data:data
}); });
} }
/**
*
*/
export function getMyPeoplceAndSunOrg(data?: any){
return request({
url: '/systemapi/authorize/getMyPeoplceAndSunOrg',
method: 'post',
data:data
});
}
/**
*
*/
export function getMyPeopleAndSunOrgPost(data?: any){
return request({
url: '/systemapi/authorize/getMyPeopleAndSunOrgPost',
method: 'post',
data:data
});
}
/**
*
*/
export function getPowerPageUser(data?: any){
return request({
url: '/systemapi/authorize/getPowerPageUser',
method: 'post',
data:data
});
}
/**
*
*/
export function systemAppAuthorization(data?: any){
return request({
url: '/systemapi/authorize/systemAppAuthorization',
method: 'post',
data:data
});
}
/**
* 使
*/
export function getRolePeople(data?: any){
return request({
url: '/systemapi/authorize/getRolePeople',
method: 'post',
data:data
});
}
/**
* 使
*/
export function savePickRoleMan(data?: any){
return request({
url: '/systemapi/authorize/savePickRoleMan',
method: 'post',
data:data
});
}

49
src/api/system/roleapi/power.ts

@ -0,0 +1,49 @@
import request from "@/utils/request";
import { getSystemPower } from "./types";
/**
*
*/
export function appPowerUnit(data: getSystemPower){
return request({
url: '/systemapi/authorize/appPowerUnit',
method: 'post',
data:data
});
}
/**
@ 作者: 秦东
@ 时间: 2025-11-28 10:24:09
@ 功能: 授权行政组织书
*/
export function authorizeOrgTree(data?: getSystemPower){
return request({
url: '/systemapi/hr/authorizeOrgTree',
method: 'post',
data:data
});
}
/**
@ 作者: 秦东
@ 时间: 2025-11-28 10:24:09
@ 功能: 根据权限获取数据
*/
export function authorizePeopleList(data?: getSystemPower){
return request({
url: '/systemapi/hr/authorizePeopleList',
method: 'post',
data:data
});
}
/**
@ 作者: 秦东
@ 时间: 2025-11-28 10:24:09
@ 功能: 新增人员
*/
export function addNewPeople(data?: getSystemPower){
return request({
url: '/systemapi/hr/addNewPeople',
method: 'post',
data:data
});
}

43
src/api/system/roleapi/types.ts

@ -285,3 +285,46 @@ export interface custerAppTablePower extends custerAppInfo{
attribute:number[] attribute:number[]
}; };
} }
//获取平台授权项目
export interface getSystemPower{
powerType:string;
appType:string;
appSystem:string;
roleId:string;
isPick?:boolean;
}
// 平台授权结构体
export interface AppPowerInfo {
id :number;
name :string; //菜单名称
types :number;
perm :number;
sort :number;
parentId :number;
isTrue :boolean;
}
// 分流
export interface AppMenuBut extends AppPowerInfo {
buttenPower:AppPowerInfo[]
}
// 平台授权结构树
export interface AppPowerTree extends AppMenuBut {
children:AppPowerTree[]
visible :number;
visibleRange:VisibleRangeInfo[]; //当可见范围为自定义范围时。此辅助选项生效
}
export interface VisibleRangeInfo {
types:number;
val:string;
}
//搜索
export interface searchUser extends setupPage{
name?:string;
}

2
src/api/user/types.ts

@ -6,6 +6,8 @@ export interface UserInfo {
avatar: string; avatar: string;
roles: string[]; roles: string[];
perms: string[]; perms: string[];
allPowerConfig: any;
userInfoCont: any;
} }
/** /**

2
src/components/workflow/dialog/errorDialog.vue

@ -32,7 +32,7 @@ let visibleDialog = computed({
<div class="ant-confirm-content"> <div class="ant-confirm-content">
<div> <div>
<p class="error-modal-desc">以下内容不完善需进行修改</p> <p class="error-modal-desc">以下内容不完善需进行修改</p>
<div class="error-modal-list"> <div class="error-modal-list">{{list}}
<div v-for="(item,index) in list" :key="index" class="error-modal-item"> <div v-for="(item,index) in list" :key="index" class="error-modal-item">
<div class="error-modal-item-label">流程设计</div> <div class="error-modal-item-label">流程设计</div>
<div class="error-modal-item-content">{{item.name}} 未选择{{item.type}}</div> <div class="error-modal-item-content">{{item.name}} 未选择{{item.type}}</div>

1
src/components/workflow/drwer/approverDrawer.vue

@ -309,6 +309,7 @@ const saveApprover = () => {
formData: JSON.stringify(formData.value), formData: JSON.stringify(formData.value),
formPower: JSON.stringify(formData.value.purview), formPower: JSON.stringify(formData.value.purview),
}; };
console.log("sendInfo----------------->", sendInfo);
// console.log("sendInfo", sendInfo); // console.log("sendInfo", sendInfo);
setFlowFormKeyPower(sendInfo); setFlowFormKeyPower(sendInfo);
closeDrawer(); closeDrawer();

2
src/directive/index.ts

@ -1,9 +1,11 @@
import type { App } from 'vue'; import type { App } from 'vue';
import { hasPerm } from './permission'; import { hasPerm } from './permission';
import { hasButton } from './permission/button';
// 全局注册 directive // 全局注册 directive
export function setupDirective(app: App<Element>) { export function setupDirective(app: App<Element>) {
// 使 v-hasPerm 在所有组件中都可用 // 使 v-hasPerm 在所有组件中都可用
app.directive('hasPerm', hasPerm); app.directive('hasPerm', hasPerm);
app.directive('hasButton', hasButton);
} }

23
src/directive/permission/button.ts

@ -0,0 +1,23 @@
import { Directive, DirectiveBinding } from 'vue';
import { useUserStore } from "@/store/modules/user";
/**
*
*/
export const hasButton: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
const userStore = useUserStore();
const { value } = binding;
// console.log("按钮权限",el,"-->",binding,"-->",value,"-->",userStore.myPower.menuButIdAry,"-->",userStore.myPower);
if (value) {
const requiredPerms = value; // DOM绑定需要的按钮权限标识
const hasPerm = userStore.myPower.menuButIdAry.some((perm: any) => {
return requiredPerms.includes(perm);
});
if (!hasPerm) {
el.parentNode?.removeChild(el);
}
}
}
}

5
src/store/modules/user.ts

@ -22,6 +22,7 @@ export const useUserStore = defineStore("user", () => {
const perms = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限 const perms = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
const userKey = useStorage("userKey", ""); const userKey = useStorage("userKey", "");
const userToken = useStorage("userToken", ""); const userToken = useStorage("userToken", "");
const myPower = ref<any>("");
const userInfoCont = ref<any>(""); const userInfoCont = ref<any>("");
/** /**
@ -108,6 +109,8 @@ export const useUserStore = defineStore("user", () => {
roles.value = data.roles; roles.value = data.roles;
perms.value = data.perms; perms.value = data.perms;
userInfoCont.value = data userInfoCont.value = data
myPower.value = data.allPowerConfig
console.log("myPower.value",myPower.value);
resolve(data); resolve(data);
}) })
.catch((error:any) => { .catch((error:any) => {
@ -139,6 +142,7 @@ export const useUserStore = defineStore("user", () => {
userKey.value = ""; userKey.value = "";
userToken.value = ""; userToken.value = "";
userInfoCont.value = "" userInfoCont.value = ""
myPower.value = ""
avatar.value = ""; avatar.value = "";
roles.value = []; roles.value = [];
perms.value = []; perms.value = [];
@ -152,6 +156,7 @@ export const useUserStore = defineStore("user", () => {
avatar, avatar,
roles, roles,
perms, perms,
myPower,
login, login,
getInfo, getInfo,
logout, logout,

34
src/utils/workflow/index.ts

@ -62,10 +62,10 @@ All.prototype = {
console.log("setApproverStr---签字解析--->",nodeConfig); console.log("setApproverStr---签字解析--->",nodeConfig);
if (nodeConfig.settype == 1) { if (nodeConfig.settype == 1) {
if (nodeConfig.nodeUserList.length == 1) { if (nodeConfig.nodeUserList.length == 1) {
nodeConfig.error=false nodeConfig.error = false;
return nodeConfig.nodeUserList[0].name return nodeConfig.nodeUserList[0].name
} else if (nodeConfig.nodeUserList.length > 1) { } else if (nodeConfig.nodeUserList.length > 1) {
nodeConfig.error=false nodeConfig.error = false;
if (nodeConfig.examineMode == 1) { if (nodeConfig.examineMode == 1) {
return this.arrToStr(nodeConfig.nodeUserList) return this.arrToStr(nodeConfig.nodeUserList)
} else if (nodeConfig.examineMode == 2) { } else if (nodeConfig.examineMode == 2) {
@ -77,18 +77,21 @@ All.prototype = {
// return "指定成员" // return "指定成员"
} }
} else if (nodeConfig.settype == 2) { } else if (nodeConfig.settype == 2) {
nodeConfig.error=false
let level = nodeConfig.directorLevel == 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管' let level = nodeConfig.directorLevel == 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管'
if (nodeConfig.examineMode == 1) { if (nodeConfig.examineMode == 1) {
nodeConfig.error = false;
return level return level
} else if (nodeConfig.examineMode == 2) { } else if (nodeConfig.examineMode == 2) {
nodeConfig.error = false;
return level + "会签" return level + "会签"
}else if (nodeConfig.examineMode == 3) { }else if (nodeConfig.examineMode == 3) {
nodeConfig.error = false;
return level + + "或签" return level + + "或签"
} }
} else if (nodeConfig.settype == 3) { } else if (nodeConfig.settype == 3) {
nodeConfig.error=false
// console.log("nodeConfig==会签==>",nodeConfig) // console.log("nodeConfig==会签==>",nodeConfig)
nodeConfig.error = false;
if (nodeConfig.nodeUserList.length == 1) { if (nodeConfig.nodeUserList.length == 1) {
return nodeConfig.nodeUserList[0].name return nodeConfig.nodeUserList[0].name
}else{ }else{
@ -97,11 +100,11 @@ All.prototype = {
} else if (nodeConfig.settype == 4) { } else if (nodeConfig.settype == 4) {
// console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList); // console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList);
if (nodeConfig.selectRange == 1) { if (nodeConfig.selectRange == 1) {
nodeConfig.error=false nodeConfig.error = false;
return "发起人自选" return "发起人自选"
} else { } else {
if (nodeConfig.nodeUserList.length > 0) { if (nodeConfig.nodeUserList.length > 0) {
nodeConfig.error=false nodeConfig.error = false;
if (nodeConfig.selectRange == 2) { if (nodeConfig.selectRange == 2) {
return "发起人从指定成员中自选" return "发起人从指定成员中自选"
} else { } else {
@ -112,20 +115,19 @@ All.prototype = {
} }
} }
} else if (nodeConfig.settype == 5) { } else if (nodeConfig.settype == 5) {
nodeConfig.error=false nodeConfig.error = false;
return "发起人自己" return "发起人自己"
} else if (nodeConfig.settype == 6) { } else if (nodeConfig.settype == 6) {
nodeConfig.error=false nodeConfig.error = false;
// console.log("nodeConfig==直接主管==>",nodeConfig) // console.log("nodeConfig==直接主管==>",nodeConfig)
return '从直接主管到通讯录中级别最高的第' + nodeConfig.examineEndDirectorLevel + '个层级主管' return '从直接主管到通讯录中级别最高的第' + nodeConfig.examineEndDirectorLevel + '个层级主管'
}else if (nodeConfig.settype == 7){ }else if (nodeConfig.settype == 7){
nodeConfig.error=false nodeConfig.error = false;
return "指定前置审批为本节点设置审批人" return "指定前置审批为本节点设置审批人"
}else if (nodeConfig.settype == 8){ }else if (nodeConfig.settype == 8){
// console.log("checkedFormList--1111->",nodeConfig) // console.log("checkedFormList--1111->",nodeConfig)
if(nodeConfig.nodeUserList.length > 0){ if(nodeConfig.nodeUserList.length > 0){
nodeConfig.error=false nodeConfig.error = false;
if (nodeConfig.examineMode == 1) { if (nodeConfig.examineMode == 1) {
return nodeConfig.nodeUserList[0].name + "依次审批" return nodeConfig.nodeUserList[0].name + "依次审批"
} else if (nodeConfig.examineMode == 2) { } else if (nodeConfig.examineMode == 2) {
@ -139,7 +141,7 @@ All.prototype = {
console.log("setApproverStr---签字解析--9->",nodeConfig.matrix.list); console.log("setApproverStr---签字解析--9->",nodeConfig.matrix.list);
if(nodeConfig.matrix && nodeConfig.matrix.list){ if(nodeConfig.matrix && nodeConfig.matrix.list){
let strVal = "" let strVal = ""
nodeConfig.error=false
if(nodeConfig.matrix.list.length > 0){ if(nodeConfig.matrix.list.length > 0){
nodeConfig.matrix.list.forEach((item:any,inx:number)=>{ nodeConfig.matrix.list.forEach((item:any,inx:number)=>{
if (inx > 0) { if (inx > 0) {
@ -148,7 +150,7 @@ All.prototype = {
strVal += item.outcomeName; strVal += item.outcomeName;
}) })
} }
nodeConfig.error = false;
if (nodeConfig.examineMode == 1) { if (nodeConfig.examineMode == 1) {
return strVal + "依次审批" return strVal + "依次审批"
} else if (nodeConfig.examineMode == 2) { } else if (nodeConfig.examineMode == 2) {
@ -156,9 +158,10 @@ All.prototype = {
}else if (nodeConfig.examineMode == 3) { }else if (nodeConfig.examineMode == 3) {
return strVal + "或签" return strVal + "或签"
} }
}else{ }else{
if(nodeConfig.matrix && nodeConfig.matrix.outcomeName){ if(nodeConfig.matrix && nodeConfig.matrix.outcomeName){
nodeConfig.error=false nodeConfig.error = false;
let strVal = nodeConfig.matrix.outcomeName let strVal = nodeConfig.matrix.outcomeName
if (nodeConfig.examineMode == 1) { if (nodeConfig.examineMode == 1) {
return strVal + "依次审批" return strVal + "依次审批"
@ -167,12 +170,13 @@ All.prototype = {
}else if (nodeConfig.examineMode == 3) { }else if (nodeConfig.examineMode == 3) {
return strVal + "或签" return strVal + "或签"
} }
} }
} }
}else if (nodeConfig.settype == 10){ }else if (nodeConfig.settype == 10){
nodeConfig.error=false nodeConfig.error = false;
return "指定部门负责人" return "指定部门负责人"
} }
}, },

5
src/views/hr/archives/archivescont.vue

@ -57,7 +57,7 @@ const userIcon = ref<string>(); //人员头像
const boxTitle = ref<string>(); // const boxTitle = ref<string>(); //
const userConting = ref<any>(""); // const userConting = ref<any>(""); //
const rowLoading = ref(false); const rowLoading = ref(false);
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API + "/api/upordown"; // const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API+"/setupFile/uploads/oneFileUpload";//
const editMyOrgCont = ref(false); // const editMyOrgCont = ref(false); //
const editMyCont = ref(false); // const editMyCont = ref(false); //
/** /**
@ -134,11 +134,14 @@ const handleAvatarSuccess: UploadProps["onSuccess"] = (
uploadFiles uploadFiles
) => { ) => {
userIcon.value = URL.createObjectURL(uploadFile.raw!); userIcon.value = URL.createObjectURL(uploadFile.raw!);
// console.log("-------------------->", uploadFile);
// console.log("-------------------->", props.archivesdata.id);
// //
editMyInfoIcon({ editMyInfoIcon({
id: props.archivesdata.id, id: props.archivesdata.id,
iconpath: response.data.url, iconpath: response.data.url,
}).then((data) => { }).then((data) => {
fileUploadIng.value = false;
ElMessage.success("编辑成功"); ElMessage.success("编辑成功");
emits("getarchivespageclick"); emits("getarchivespageclick");
}); });

1293
src/views/hr/archives/index.vue

File diff suppressed because it is too large

200
src/views/hr/archives/index_20251202.vue

@ -0,0 +1,200 @@
<!--
@ 作者: 秦东
@ 时间: 2025-11-28 10:11:16
@ 备注: 人员列表
-->
<script lang='ts' setup>
import { emptypeOptions } from "@/api/hr/people/datacont";
import { orgInfo } from "@/api/hr/org/type";
import { authorizeOrgTree } from '@/api/system/roleapi/power'
import {
teamcontlist
} from "@/api/hr/org/index";
const orgTreeRef = ref(ElTree); //
const orgTreeLoading = ref(false); //
const orgTreeList = ref<orgInfo[]>(); //
const tiemList = ref([]); //
const orgTreeProps = {
children: "child",
label: "name",
}; //
const searchInfo = reactive({
orgId:"",
name:"",
employ:"",
team:"",
joinTime:""
})
const getOrgPowerTrue = () => {
orgTreeLoading.value = true
let sendInfo = {
menuId:"50"
}
authorizeOrgTree(sendInfo).then((res) => {
console.log(res)
orgTreeList.value = res.data
orgTreeLoading.value = false
}).finally(() => {
orgTreeLoading.value = false
})
}
/**
@ 作者: 秦东
@ 时间: 2025-01-14 10:27:12
@ 功能: 获取班组列表
*/
const gainTimeList = () => {
let searchMap = {
page: 1,
pagesize: 2000,
name: "",
};
teamcontlist(searchMap).then((data) => {
tiemList.value = data.data.list;
});
};
const resetChecked = () => {
orgTreeRef.value.setCheckedKeys([])
}
/**
* 选中行政组织树节点
*/
const handleOrgTreeNodeClick = (data: orgInfo) => {
// console.log(data)
searchInfo.orgId = data.id;
// getArchivesPage();
};
onMounted(() => {
getOrgPowerTrue();
gainTimeList();
})
</script>
<template>
<div class="app-content">
<el-container>
<el-aside width="300px" style="padding: 10px 10px">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 5px' }">
<el-button
type="primary"
style="width: 100%; margin: 10px 0"
@click="resetChecked"
>
查看全部
</el-button>
<el-tree-v2
style="max-width: 100%"
:data="orgTreeList"
:props="orgTreeProps"
v-loading="orgTreeLoading"
node-key="id"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
:height="1200"
@node-click="handleOrgTreeNodeClick"
/>
</el-card>
</el-aside>
<el-main style="padding: 10px 10px 0 0">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 15px' }">
<el-form ref="searchForm" :model="searchInfo" :inline="true" style="width: 100%; margin-top: 10px;">
<el-form-item label="工号 / 姓名 / 手机号" prop="keywords">
<el-input
v-model="searchInfo.name"
placeholder="请输入工号/姓名/手机号"
clearable
/>
</el-form-item>
<el-form-item label="用工关系" prop="number">
<el-select
v-model="searchInfo.employ"
multiple
clearable
collapse-tags
placeholder="用工关系"
style="width: 200px"
>
<el-option
v-for="item in emptypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="班组" prop="number">
<el-select
v-model="searchInfo.team"
clearable
collapse-tags
placeholder="员工班组"
style="width: 240px"
>
<el-option
v-for="item in tiemList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="入职日期" prop="number">
<el-date-picker
v-model="searchInfo.joinTime"
type="date"
placeholder="入职日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="" prop="number">
<el-button type="primary" @click="getArchivesPage">
<template #icon><i-ep-search /></template>
搜索
</el-button>
<el-button @click="resetArcFormQuery">
<template #icon><i-ep-refresh /></template>
重置
</el-button>
</el-form-item>
</el-form>
<div class="func-but">
<el-button v-hasButton="[215437071358111744]" type="primary" @click="handleAddArchives">
<template #icon><i-ep-plus /></template>
新增
</el-button>
<el-button
v-hasPerm="['215437153071542272']"
plain
type="primary"
@click="openPiliangBox"
>
<el-icon><MessageBox /></el-icon>
批量导入数据
</el-button>
</div>
</el-card>
</el-main>
</el-container>
</div>
</template>
<style lang='scss' scoped>
.app-content {
height: calc(100vh - 170px);
background-color: aqua;
:deep .el-drawer__body {
padding: 0 10px;
}
}
.common-layout {
}
</style>

1465
src/views/hr/archives/index_251128.vue

File diff suppressed because it is too large

274
src/views/hr/archives/unitpage/addUserPage.vue

@ -0,0 +1,274 @@
<!--
@ 作者: 秦东
@ 时间: 2025-12-03 14:22:19
@ 备注: 添加人员
-->
<script lang='ts' setup>
import { addNewPeople } from "@/api/system/roleapi/power";
import defaultImg from "@/assets/images/1.png";
const props = defineProps({
show: {
type: Boolean,
default: false
},
orgTree: {
type: Array as PropType<orgInfo[]>,
default: () => []
}
})
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API+"/setupFile/uploads/oneFileUpload";//
const emit = defineEmits(['update:show','updateInfo'])
const ubLockPage = computed(() => props.show)
const orgTreeList = computed(() => props.orgTree) //
const butLoading = ref(false)
const fileUploadIng = ref(false);
const systemMenuTreeProps = {
children: "child",
label: "name",
value:"id"
} //
const formRef = ref<any>();
const rules = ref<any>({
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
code: [{ required: true, message: '请输入工号', trigger: 'blur' }],
orgId: [{ required: true, message: '请选择行政组织', trigger: 'change' }],
employment: [{ required: true, message: '请输入用工关系', trigger: 'blur' }],
mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
});
const userInfo = ref({
name: "",
code: "",
mobile: "",
nation: "",
sex: "1",
age: "",
oldName: "",
icon: defaultImg,
orgId:"",
employment:"",
address:""
})
/**
@ 作者: 秦东
@ 时间: 2025-12-03 14:26:25
@ 功能: 关闭
*/
const closeLock = () => {
emit('update:show', false)
emit('updateInfo')
userInfo.value.icon = defaultImg
butLoading.value = false
formRef.value.resetFields();
}
/**
@ 作者: 秦东
@ 时间: 2025-12-03 15:40:14
@ 功能: 提交数据
*/
const onSubmit = () => {
butLoading.value = true
formRef.value.validate((valid) => {
if (valid) {
//
addNewPeople(userInfo.value).then((res) => {
if (res.code == 0) {
ElMessage.success("新增成功");
closeLock();
} else {
ElMessage.error(res.msg);
}
butLoading.value = false
})
} else {
butLoading.value = false
}
});
}
/**
@ 作者: 秦东
@ 时间: 2024-08-31 14:35:18
@ 功能: 上传前判断类型
*/
const beforeAvatarUpload: UploadProps["beforeUpload"] = (rawFile) => {
fileUploadIng.value = true;
if (!/\.(png|jpg|gif|jpeg|svg|bmp)$/.test(rawFile.name)) {
ElMessage.warning("您上传的图片不符合要求!");
fileUploadIng.value = false;
return false;
}
};
/**
@ 作者: 秦东
@ 时间: 2024-08-31 14:40:31
@ 功能: 上传成功
*/
const handleAvatarSuccess: UploadProps["onSuccess"] = (
response,
uploadFile,
uploadFiles
) => {
userInfo.value.icon = URL.createObjectURL(uploadFile.raw!);
// console.log("-------------------->", uploadFile);
// console.log("-------------------->", props.archivesdata.id);
fileUploadIng.value = false;
ElMessage.success("上传成功");
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="新增人员信息"
width="650"
draggable
:destroy-on-close="true"
:before-close="closeLock"
>
<el-form :model="userInfo" :rules="rules" ref="formRef" label-width="80px">
<table>
<tr>
<td>
<el-form-item label="姓名" prop="name">
<el-input v-model="userInfo.name" placeholder="请输入姓名" />
</el-form-item>
</td>
<td>
<el-form-item label="曾用名" prop="oldName">
<el-input v-model="userInfo.oldName" placeholder="请输入曾用名" />
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="工号" prop="code">
<el-input v-model="userInfo.code" placeholder="请输入工号" />
</el-form-item>
</td>
<td rowspan="3" align="center">
<el-upload
class="avatar-uploader"
:action="imgUploadApiUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
v-loading="fileUploadIng"
>
<el-avatar shape="square" :size="180" :src="userInfo.icon" class="bianKuang" />
</el-upload>
</td>
</tr>
<tr>
<td>
<el-form-item label="民族" prop="nation">
<el-input v-model="userInfo.nation" placeholder="请输入民族" />
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="userInfo.sex">
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
</td>
</tr>
<tr>
<td colspan="2">
<el-form-item label="归属部门" prop="orgId">
<el-tree-select
v-model="userInfo.orgId"
:data="orgTreeList"
check-strictly
:render-after-expand="false"
:props="systemMenuTreeProps"
style="width: 100%"
clearable
/>
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="联系电话" prop="mobile">
<el-input v-model="userInfo.mobile" placeholder="请输入联系电话" />
</el-form-item>
</td>
<td>
<el-form-item label="用工关系" prop="employment">
<el-select v-model="userInfo.employment" placeholder="请选择用工关系" style="width: 100%">
<el-option label="临时工" value="1" />
<el-option label="编外人员" value="2" />
<el-option label="实习&实习生" value="3" />
<el-option label="试用员工" value="4" />
<el-option label="待分配" value="5" />
<el-option label="待岗" value="6" />
<el-option label="临时调入" value="7" />
<el-option label="正式员工" value="8" />
<el-option label="长期病假" value="9" />
<el-option label="停薪留职" value="10" />
<el-option label="退休" value="11" />
<el-option label="辞职" value="12" />
<el-option label="辞退" value="13" />
<el-option label="离职" value="14" />
</el-select>
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="出生日期" prop="age">
<el-date-picker
v-model="userInfo.age"
type="date"
placeholder="请选择出生日期"
format="YYYY/MM/DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</td>
<td>
<el-form-item label="联系地址" prop="address">
<el-input v-model="userInfo.address" placeholder="请输入联系地址" />
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="身体状况" prop="bodyStatus">
<el-select v-model="userInfo.bodyStatus" placeholder="请选择身体状况" style="width: 100%">
<el-option label="良好" value="1" />
<el-option label="一般" value="2" />
<el-option label="较弱" value="3" />
<el-option label="有生理缺陷" value="4" />
<el-option label="有生理缺陷" value="4" />
</el-select>
</el-form-item>
</td>
<td>
<el-form-item label="婚姻状况" prop="marriageStatus">
<el-select v-model="userInfo.marriageStatus" placeholder="请选择婚姻状况" style="width: 100%">
<el-option label="未婚" value="1" />
<el-option label="已婚" value="2" />
<el-option label="离异" value="4" />
<el-option label="丧偶" value="3" />
</el-select>
</el-form-item>
</td>
</tr>
</table>
<div class="flex justify-center">
<el-button type="primary" :loading="butLoading" @click="onSubmit">提交</el-button>
<el-button @click="closeLock">取消</el-button>
</div>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
.bianKuang {
border: 1px solid #ccc;
}
</style>

235
src/views/hr/archives/unitpage/batchImport.vue

@ -0,0 +1,235 @@
<!--
@ 作者: 秦东
@ 时间: 2025-12-02 16:17:37
@ 备注: 批量导入
-->
<script lang='ts' setup>
import { orgInfo } from "@/api/hr/org/type";
import {
analysisRedisOrgExelect,
} from "@/api/hr/people/index";
import { ElScrollbar as ElScrollbarType } from "element-plus";
const uploadFFurl = import.meta.env.VITE_APP_BASE_API + "/hrapi/staff/uploadUserFilesRedis";
const props = defineProps({
show: {
type: Boolean,
default: false
},
orgTree: {
type: Array as PropType<orgInfo[]>,
default: () => []
}
})
const ubLockPage = computed(() => props.show)
const emit = defineEmits(['update:show','updateInfo'])
const closeUploadTemp = () => {
emit('update:show', false)
emit('updateInfo')
tempForm.orgId = ""
excelLoading.value = false;
excelJiexi.value = false;
}
const orgTreeList = computed(() => props.orgTree) //
const excelLoading = ref(false);
const excelJiexi = ref(false);
const tempForm = reactive({
orgId: "",
});
const systemMenuTreeProps = {
children: "child",
label: "name",
value:"id"
}
const excelUpload = ref<any>();
let peopleListAry = new Array(); //
const peopleMsg = ref<string[]>([]);
let jiBuQiVal = 0;
const progressSize = ref(0);
const meritsYearIng = ref<any>();
const rewPunYearsIng = ref<any>();
const redisListKey = ref<string>();
const totalNum = ref<number>();
const innerRef = ref<HTMLDivElement>();
const scrollbarRef = ref<InstanceType<typeof ElScrollbarType>>();
/**
@ 作者: 秦东
@ 时间: 2025-12-02 16:53:45
@ 功能: 上传前检查
*/
function handleExcelChangeTemp(file: UploadFile) {
excelLoading.value = true;
if (tempForm.orgId == 0 || tempForm.orgId == "") {
ElMessage.warning("对不起!你没有选定上传的是哪个行政组织得人员信息!");
excelLoading.value = false;
return false;
}
if (!/\.(xlsx|xls|XLSX|XLS)$/.test(file.name)) {
ElMessage.warning("上传Excel只能为xlsx、xls格式");
excelLoading.value = false;
return false;
}
}
/**
@ 作者: 秦东
@ 时间: 2025-12-02 16:55:17
@ 功能: 上传失败
*/
const uploadError = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
excelLoading.value = true;
// console.log("1response",response);
// console.log("1uploadFile",uploadFile);
// console.log("1uploadFiles",uploadFiles);
let msgAry = new Array();
msgAry.push(
"响应时间过长,系统自动转为后台静默处理,可先关闭窗口!完成时间大约90分钟。请于90分钟后刷新信息"
);
// errorMsg = ["9090"]
peopleListAry.value = msgAry;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-02 16:56:39
@ 功能: 上传成功
*/
const uploadTrue = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
excelLoading.value = false;
// console.log("response", response);
// console.log("uploadFile",uploadFile);
// console.log("uploadFiles",uploadFiles);
peopleListAry.push("文件上传成功!开始解析数据并写入数据库!");
peopleMsg.value.push("文件上传成功!开始解析数据并写入数据库!");
// peopleListAry.value.push("")
// console.log("",response.code)
if (response.code == 0) {
jiBuQiVal = 0;
progressSize.value = 0;
excelJiexi.value = true;
meritsYearIng.value = response.data.meritsYearIng;
rewPunYearsIng.value = response.data.rewPunYearsIng;
redisListKey.value = response.data.redisListKey;
totalNum.value = response.data.totalNum;
// console.log("===>", staffChengji);
insetPeopleCont();
}
}
/**
@ 作者: 秦东
@ 时间: 2025-12-02 17:01:05
@ 功能: 写入数据库
*/
const insetPeopleCont = () => {
// console.log("===============", jiBuQiVal, totalNum.value);
if (jiBuQiVal < totalNum.value) {
let sendData = {
meritsYearIng: meritsYearIng.value,
rewPunYearsIng: rewPunYearsIng.value,
redisListKey: redisListKey.value,
number: jiBuQiVal,
orgId: tempForm.orgId.toString(),
};
// console.log("", sendData);
analysisRedisOrgExelect(sendData).then((data: any) => {
// console.log("11111",data,data.data.msgStr)
peopleMsg.value.push(data.data.msgStr);
jiBuQiVal++;
// if (jibuq+ 1 >= totalNum.value){
// }
progressSize.value = Math.round((jiBuQiVal / totalNum.value) * 10000) / 100;
insetPeopleCont();
nextTick(() => {
handleClick();
});
});
} else {
excelJiexi.value = false;
progressSize.value = 100;
excelUpload.value.clearFiles();
}
};
const handleClick = () => {
nextTick(() => {
// console.log("",innerRef.value!.clientHeight)
if (innerRef.value!.clientHeight > 300) {
scrollbarRef.value!.setScrollTop(innerRef.value!.clientHeight);
}
});
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="批量导入人员信息"
width="800"
draggable
:destroy-on-close="true"
:before-close="closeUploadTemp"
>
<el-row v-loading="excelLoading" element-loading-text="文档上传中,请稍候..." style="width: 100%">
<el-col :span="24">
<el-form :model="tempForm" label-width="auto" style="width: 100%">
<el-form-item label="请选择上传那个公司的人员信息">
<el-tree-select
v-model="tempForm.orgId"
:data="orgTreeList"
check-strictly
:render-after-expand="false"
:props="systemMenuTreeProps"
style="width: 100%"
clearable
/>
</el-form-item>
</el-form>
</el-col>
<el-col
:span="24"
v-loading="excelJiexi"
element-loading-text="文档解析中,请稍候..."
>
<el-upload
ref="excelUpload"
class="upload-demo"
drag
:action="uploadFFurl"
:data="{ orgId: tempForm.orgId.toString() }"
:before-upload="handleExcelChangeTemp"
:on-success="uploadTrue"
:on-error="uploadError"
:show-file-list="false"
multiple
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将电子表格拖到此处或 <em>单击上载</em></div>
</el-upload>
</el-col>
</el-row>
<el-row style="width: 100%;">
<el-col :span="24">
<el-progress
:text-inside="true"
:stroke-width="20"
:percentage="progressSize"
>
<span>已完成{{ progressSize }}%</span>
</el-progress>
</el-col>
</el-row>
<el-scrollbar height="300px" ref="scrollbarRef" always style="padding:10px 20px;">
<div ref="innerRef">
<p
v-for="(item, index) in peopleMsg"
:key="index"
class="scrollbar-demo-item"
>
{{ item }}
</p>
</div>
</el-scrollbar>
</el-dialog>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

96
src/views/hr/archives/unitpage/lockInfo.vue

@ -0,0 +1,96 @@
<!--
@ 作者: 秦东
@ 时间: 2025-12-02 15:50:46
@ 备注: 解除人员信息锁
-->
<script lang='ts' setup>
import {
jiechuUserLock,
} from "@/api/hr/org/index";
const props = defineProps({
show: {
type: Boolean,
default: false
}
})
const ubLockPage = computed(() => props.show)
const emit = defineEmits(['update:show','updateInfo'])
const unLockForm = reactive({
numText: "",
});
/**
@ 作者: 秦东
@ 时间: 2025-12-02 15:53:20
@ 功能: 关闭解锁弹窗
*/
const closeLock = () => {
emit('update:show', false)
emit('updateInfo')
}
const ruleFormRefLock = ref(null);
var butLoad = ref(false);
//
const picksubus = () => {
butLoad.value = true;
ruleFormRefLock.value.validate((isValid: boolean) => {
if (isValid) {
jiechuUserLock({ userId: unLockForm.numText })
.then((res: any) => {
butLoad.value = false;
closeLock()
})
.finally(() => {
butLoad.value = false;
});
} else {
butLoad.value = false;
}
});
};
const resetForm = () => {
closeLock();
ruleFormRefLock.value.resetFields();
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="清除锁定人员信息锁"
width="500"
draggable
:destroy-on-close="true"
:before-close="closeLock"
>
<el-form
ref="ruleFormRefLock"
:model="unLockForm"
:rules="editTitleRules"
label-width="80"
style="width: 100%"
>
<el-form-item label="工号" prop="numText">
<el-text>请输入工号以英文逗号隔开(,)</el-text>
<el-input
v-model="unLockForm.numText"
type="textarea"
placeholder="请输入工号;以英文逗号隔开(,)"
clearable
:autosize="{ minRows: 4, maxRows: 10 }"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" v-loading="butLoad" @click="picksubus">
确定
</el-button>
<el-button @click="resetForm(ruleFormRef)">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

222
src/views/hr/archives/unitpage/uploadTemplate.vue

@ -0,0 +1,222 @@
<!-- eslint-disable vue/no-side-effects-in-computed-properties -->
<!--
@ 作者: 秦东
@ 时间: 2025-12-03 10:44:56
@ 备注: 上传模版
-->
<script lang='ts' setup>
import { orgInfo } from "@/api/hr/org/type";
import {
uploadUserTemplate
} from "@/api/hr/org/index";
import { uploadUrl } from "@/api/DesignForm";
const props = defineProps({
show: {
type: Boolean,
default: false
},
orgTree: {
type: Array as PropType<orgInfo[]>,
default: () => []
},
ruleForm: {
type: Object as PropType<typeof ruleForm>,
default: () => ({})
}
})
const addTemLoading = ref(false);
let peopleListAry = new Array();
const excelLoading = ref(false);
const excelUploadUs = ref();
const emits = defineEmits(['update:show'])
const ruleFormRef = ref<any>();
const ruleFormIng = ref({
id: "",
orgId: "",
fileName: "",
filePath: "",
fileUrl: "",
});
const orgTreePropsBut = {
children: "child",
value: "id",
label: "name",
}; //
const orgTreeList = computed(() => props.orgTree) //
const ubLockPage = computed({
get: () =>{
if(props.show){
ruleFormIng.value.id = props.ruleForm.id
ruleFormIng.value.orgId = props.ruleForm.orgId
ruleFormIng.value.fileName = props.ruleForm.fileName
ruleFormIng.value.filePath = props.ruleForm.filePath
ruleFormIng.value.fileUrl = props.ruleForm.fileUrl
}
return props.show
},
set: (val) => {
emits("update:show", val);
},
})
/**
@ 作者: 秦东
@ 时间: 2024-04-19 13:13:18
@ 功能: 表单验证规则
*/
const dataFormRules = reactive({
orgId: [{ required: true, message: "请选择行政组织", trigger: "blur" }],
fileName: [{ required: true, message: "请上传模版文件", trigger: "blur" }],
});
//
const tempOpenClose = () => {
emits('update:show', false)
ruleFormIng.value.id = ""
ruleFormIng.value.orgId = 0
ruleFormIng.value.fileName = ""
ruleFormIng.value.filePath = ""
ruleFormIng.value.fileUrl = ""
}
//
const handleExcelChange = (file: UploadFile) => {
excelLoading.value = true;
if (!/\.(xlsx|xls|XLSX|XLS)$/.test(file.name)) {
ElMessage.warning("上传Excel只能为xlsx、xls格式");
excelLoading.value = false;
return false;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-08-24 14:46:32
@ 功能: 文件上传成功
*/
const uploadTrueUs = (
response: any,
uploadFile: UploadFile,
uploadFiles: UploadFiles
) => {
// console.log("response",response);
// console.log("uploadFile",uploadFile);
// console.log("uploadFiles",uploadFiles);
excelLoading.value = false;
ruleFormIng.value.fileName = uploadFile.name;
ruleFormIng.value.filePath = response.data.physicspath;
ruleFormIng.value.fileUrl = response.data.url;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 11:02:30
@ 功能: 文件上传失败
*/
const uploadError = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
excelLoading.value = true;
// console.log("1response",response);
// console.log("1uploadFile",uploadFile);
// console.log("1uploadFiles",uploadFiles);
let msgAry = new Array();
msgAry.push(
"响应时间过长,系统自动转为后台静默处理,可先关闭窗口!完成时间大约90分钟。请于90分钟后刷新信息"
);
// errorMsg = ["9090"]
peopleListAry.value = msgAry;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 11:05:57
@ 功能: 提交上传数据
*/
const saveTemp = () => {
addTemLoading.value = true;
ruleFormRef.value.validate((valid: any) => {
if (valid) {
ruleFormIng.value.orgId = ruleFormIng.value.orgId.toString();
// console.log("--->", ruleForm);
if (ruleFormIng.value.id == 0 || ruleFormIng.value.id == "") {
uploadUserTemplate(ruleForm)
.then((data: any) => {
console.log("上传传输信息-1-->", data);
tempOpenClose();
})
.finally(() => {
addTemLoading.value = false;
});
} else {
editUserTemplateInfo(ruleForm)
.then((data: any) => {
console.log("上传传输信息-2-->", data);
tempOpenClose();
})
.finally(() => {
addTemLoading.value = false;
});
}
} else {
addTemLoading.value = false;
}
});
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="上传导入模版"
width="400"
:before-close="tempOpenClose"
>
<el-form
ref="ruleFormRef"
style="max-width: 600px"
:model="ruleForm"
:rules="dataFormRules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item label="归属行政组织" prop="orgId">
<el-tree-select
v-model="ruleFormIng.orgId"
:data="orgTreeList"
:props="orgTreePropsBut"
:render-after-expand="false"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
style="width: 240px"
/>
</el-form-item>
<el-form-item label="信息模版" prop="fileName">
<el-input v-model="ruleFormIng.fileName" />
<el-upload
ref="excelUploadUs"
class="upload-demo"
drag
v-loading="excelLoading"
:action="uploadUrl"
:limit="1"
:before-upload="handleExcelChange"
:on-success="uploadTrueUs"
:on-error="uploadError"
:show-file-list="false"
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将电子表格拖到此处或 <em>单击上载</em></div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" v-loading="addTemLoading" @click="saveTemp()">
确定上传
</el-button>
<el-button @click="tempOpenClose()">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

12
src/views/nested/.editorconfig

@ -0,0 +1,12 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = crlf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = false

3
src/views/powermanage/rolepower/setuprole/setuprolepower.vue

@ -385,6 +385,7 @@ const pickOrgIdClick = () => {
v-for="itemes in appList" v-for="itemes in appList"
:class="itemes.signCode == activeAppId ? 'active' : ''" :class="itemes.signCode == activeAppId ? 'active' : ''"
@click="pickAppList(itemes)" @click="pickAppList(itemes)"
:key="itemes.id"
> >
{{ itemes.name }} {{ itemes.name }}
</li> </li>
@ -406,6 +407,7 @@ const pickOrgIdClick = () => {
v-for="itemes in appList" v-for="itemes in appList"
:class="itemes.signCode == activeAppId ? 'active' : ''" :class="itemes.signCode == activeAppId ? 'active' : ''"
@click="pickAppList(itemes)" @click="pickAppList(itemes)"
:key="itemes.id"
> >
{{ itemes.name }} {{ itemes.name }}
</li> </li>
@ -590,4 +592,5 @@ const pickOrgIdClick = () => {
background-color: #a0cfff; background-color: #a0cfff;
} }
} }
</style> </style>

865
src/views/system/monitor/online/index copy 4.vue

@ -0,0 +1,865 @@
<!--
@ 作者: 秦东
@ 时间: 2025-10-21 10:06:51
@ 备注: 在线人数
-->
<script lang='ts' setup>
import { giveRoleTree,editRoleStatus,getOrgPostTree } from '@/api/role/index'
import type {RoleListTree,RoleFormInfo,orgAndPostisListTree} from '@/api/role/types'
import type { TreeNode,TreeInstance } from 'element-plus'
import { Search } from '@element-plus/icons-vue'
import { orgInfo } from "@/api/hr/org/type";
import { getOrgTreeList } from "@/api/hr/org/index";
import { appPowerUnit } from "@/api/system/roleapi/power";
import type { getSystemPower,AppPowerTree } from "@/api/system/roleapi/types";
import { appTableBut, appListBut } from "@/utils/workflow/const";
import {
gainAppList,
gainAppTableListNew
} from "@/api/system/roleapi/postrole";
import {
custerAppInfo
} from "@/api/system/roleapi/types";
import AddRoleGroup from '@/views/system/monitor/online/roleConfig/addRoleGroup.vue'
import EditRoleGroup from '@/views/system/monitor/online/roleConfig/editRoleGroup.vue'
const squareUrl = ref<string>(
"https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png"
);
const orgTree = ref<orgInfo[]>([])
const roleGroupOrInfo = ref(1)
const searchQuery = ref('')
const orgWorkRole = ref("org")
const appSysPick = ref("system")
const treeRef = ref<TreeInstance>()
const treeRefOrg = ref<TreeInstance>()
const roleListdata = ref<RoleListTree[]>([])
const orgPostisListdata = ref<orgAndPostisListTree[]>([])
const treeBoxHeight = ref(300)
const treeBoxHeightOrg = ref(300)
const roleLeft = ref()
const systemPowerTree = ref<AppPowerTree[]>([])
const ownerPeople = ref<any>([])
const props = {
value: 'id',
label: 'label',
disabled:'status',
children: 'children',
}
const propsOrg = {
value: 'id',
label: 'name',
disabled:'status',
children: 'child',
}
const propsOrgPost = {
value: 'id',
label: 'label',
disabled:'status',
children: 'children',
}
const systemPower = ref<getSystemPower>({
powerType:"org",
appType:"appsystem",
appSystem:"system",
roleId:"",
})
const roleLoading = ref(false)
const openRoleGroup = ref(false)
const orgLoading = ref(false)
const orgPostLoading = ref(false)
const appList = ref<custerAppInfo[]>([]);
//
const onQueryChanged = (query: string) => {
treeRef.value!.filter(query)
}
//
const onQueryChangedOrg = (query: string) => {
treeRefOrg.value!.filter(query)
}
const filterMethod = (query: string, node: any) => node.label!.includes(query)
const filterMethodOrg = (query: string, node: any) => node.name!.includes(query)
//
watch(()=>systemPower.value.powerType,(val:string)=>{
console.log("监测赋权组",val)
getSystemPowerSub();
switch(val){
case "org":
getOrgTreeAry();
break;
case "job":
getOrgPostisTree()
break;
case "role":
getRoleTree();
break;
default:
}
if(systemPower.value.appSystem=="app"){
getAppList();
}else{
getSystemPowerSub();
}
},{
deep:true
})
//
const pickRoleTree = (data:any) => {
if(data.status && data.types==1){
console.log("监测赋权组------->",data)
}
}
//
const pickOrgTree = (data:any) => {
console.log("监测赋权组------->",data)
}
//
const getRoleTree = () => {
roleLoading.value = true
giveRoleTree().then(({data})=>{
console.log("监测赋权组------->",data)
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id
}
roleListdata.value=data;
roleLoading.value = false;
}).finally(()=>{roleLoading.value = false})
}
const editRoleCont = ref<RoleFormInfo>()
const openEditRoleGroup = ref(false)
//
const editMyInfoIcon = (data:RoleListTree,types:number) => {
console.log("编辑角色信息------->",data)
console.log("编辑角色信息---types---->",types)
switch(types){
case 1:
editRoleStatusBut(data.id,2)
break;
case 2:
editRoleStatusBut(data.id,1)
break;
case 3:
editRoleCont.value = {
id:data.id,
name:data.label,
type:data.types,
superior:data.superior,
sort:data.sort
}
openEditRoleGroup.value = true
break;
case 4:
ElMessageBox.confirm(
"您确定要删除此信息吗?一经删除!数据将不可恢复!请慎重操作!",
"警告",
{
confirmButtonText: '确定删除',
cancelButtonText: '取消删除',
type: 'warning',
}
).then(()=>{
editRoleStatusBut(data.id,3)
})
break;
default:
break;
}
}
//
const editRoleStatusBut = (id:string|number,types:number) => {
// console.log("--->",id)
editRoleStatus({id:id.toString(),status:types}).then((data:any)=>{
if(data.code==0){
ElMessage({
message: data.msg,
type: 'success',
})
getRoleTree()
}else{
ElMessage({
message: data.msg,
type: 'success',
})
}
})
}
//
const addRoleGroup = (types:number) => {
roleGroupOrInfo.value = types
openRoleGroup.value = true
}
//
const getOrgTreeAry = () => {
roleLoading.value = true
if(!Array.isArray(orgTree.value) || orgTree.value.length<=0){
getOrgTreeList({ orgid: 0 })
.then(({ data }) => {
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id
}
orgTree.value = data
roleLoading.value = false
}).finally(()=>{roleLoading.value = false})
}else{
roleLoading.value = false
}
}
//
const getOrgPostisTree = () => {
orgPostLoading.value=true
if(!Array.isArray(orgPostisListdata.value) || orgPostisListdata.value.length<=0){
getOrgPostTree({id:"313"}).then(({data})=>{
console.log("获取行政组织及岗位--------->",data)
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id
}
orgPostisListdata.value = data
orgPostLoading.value=false
}).finally(()=>{orgPostLoading.value=false})
}else{
orgPostLoading.value=true
}
}
//
const getSystemPowerSub = () => {
appPowerUnit(systemPower.value).then(({data})=>{
console.log("获取平台授权项目------->",data)
systemPowerTree.value = data
})
}
const activeAppId = ref<string>("");
const appTableList = ref<custerAppTablePower[]>([]);
/**
@ 作者: 秦东
@ 时间: 2025-05-13 14:20:47
@ 功能: 获取自定义App
*/
const getAppList = () => {
gainAppList().then((data: any) => {
console.log("获取自定义App", data);
appList.value = data.data;
if (data.data && data.data.length > 0) {
if (data.data[0] && data.data[0].signCode) {
activeAppId.value = data.data[0].signCode;
getAppTableList();
}
}
console.log("获取自定义App", activeAppId.value);
});
};
/**
@ 作者: 秦东
@ 时间: 2025-05-13 16:00:19
@ 功能: 获取对应App下边的表单
*/
const getAppTableList = () => {
systemPower.value.roleId = activeAppId.value
gainAppTableListNew({id:activeAppId.value,appType:systemPower.value.appType,powerType:systemPower.value.powerType,roleId:systemPower.value.roleId}).then(
(data: any) => {
console.log("获取对应App下边的表单", data);
if (Array.isArray(data.data)) {
appTableList.value = data.data;
} else {
appTableList.value = [];
}
}
);
};
watch(()=>systemPower.value.appSystem,(val:string)=>{
if(val=="app"){
getAppList();
}
},{
immediate:true
})
onMounted(()=>{
getOrgTreeAry();
getSystemPowerSub();
console.log("高度-----1---->",roleLeft.value?.offsetHeight)
nextTick(()=>{
treeBoxHeight.value = roleLeft.value?.offsetHeight - 140
treeBoxHeightOrg.value = roleLeft.value?.offsetHeight - 100
})
})
watch(
() => activeAppId.value,
(val) => {
getAppTableList();
},
{
immediate:true
}
);
/**
@ 作者: 秦东
@ 时间: 2025-05-14 15:01:26
@ 功能: 选择App数据
*/
const pickAppList = (val: custerAppInfo) => {
activeAppId.value = val.signCode;
};
const systemMenuTreePropsing = {
children: "child",
label: "name",
value: "id",
};
</script>
<template>
<div class="roleBox">
<div ref="roleLeft" class="roleLeft">
<el-tabs v-model="systemPower.powerType" class="demo-tabs">
<el-tab-pane label="组织" name="org">
<template #label>
<el-text class="tabsTitle">组织</el-text>
</template>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的行政组织" :suffix-icon="Search" @input="onQueryChangedOrg"/>
</div>
<el-tree-v2
ref="treeRefOrg"
style="max-width: 350px;"
:data="orgTree"
:props="propsOrg"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
v-loading="roleLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
@node-click="pickOrgTree"
>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="岗位" name="job">
<template #label>
<el-text class="tabsTitle">岗位</el-text>
</template>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的行政组织" :suffix-icon="Search" @input="onQueryChangedOrg"/>
</div>
<el-tree-v2
ref="treeRefOrg"
style="max-width: 350px;"
:data="orgPostisListdata"
:props="propsOrgPost"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
v-loading="orgPostLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
@node-click="pickOrgTree"
>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="角色" name="role">
<template #label>
<el-text class="tabsTitle">角色</el-text>
</template>
<div class="butBox">
<el-button type="primary" @click="addRoleGroup(1)">新建角色组</el-button>
<el-button type="primary" @click="addRoleGroup(2)">新建角色</el-button>
</div>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的角色" :suffix-icon="Search" @input="onQueryChanged"/>
</div>
<el-tree-v2
ref="treeRef"
style="max-width: 350px;"
:data="roleListdata"
:props="props"
:filter-method="filterMethod"
:height="treeBoxHeight"
v-loading="roleLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
@node-click="pickRoleTree"
>
<template #default="{ node }" >
<div class="treeRoleBox">
<span>{{ node.label }}</span>
<div class="spanButBox">
<el-text v-if="node.disabled" type="warning" size="small" @click.stop="editMyInfoIcon(node.data,1)">禁用</el-text>
<el-text v-else type="success" size="small" @click.stop="editMyInfoIcon(node.data,2)">启用</el-text>
<el-text type="primary" size="small" @click.stop="editMyInfoIcon(node.data,3)">编辑</el-text>
<el-text type="danger" size="small" @click.stop="editMyInfoIcon(node.data,4)">删除</el-text>
</div>
</div>
</template>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="个人" name="person">
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的人" :suffix-icon="Search" @input="onQueryChangedOrg"/>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="roleright">
<el-tabs v-model="systemPower.appSystem" class="demo-tabs">
<el-tab-pane label="平台" name="system">
<template #label>
<el-text class="tabsTitleCont">平台</el-text>
</template>
<el-container v-if="systemPower.powerType == 'role'">
<el-main>
<el-table
:data="systemPowerTree"
style="width: 100%; height: calc(100vh - 277px)"
:cell-style="{ padding: '10px 0' }"
:header-cell-style="{ background: '#F5F7FA', color: '#909399' }"
border
row-key="id"
>
<el-table-column fixed prop="name" label="目录/菜单" width="380">
<template #default="scope">
<span class="tree_sapn">{{ scope.row.name }}</span>
<el-tag v-if="scope.row.types === 2" type="warning" size="small">目录</el-tag>
<el-tag v-if="scope.row.types === 1" type="success" size="small">菜单</el-tag>
<el-tag v-if="scope.row.types === 4" type="danger" size="small">按钮</el-tag>
<el-tag v-if="scope.row.types === 3" type="info" size="small">外链</el-tag>
</template>
</el-table-column>
<el-table-column prop="isTrue" label="授权" width="80" align="center" >
<template #default="scope">
<el-checkbox v-model="scope.row.isTrue" label="" />
</template>
</el-table-column>
<el-table-column prop="buttenPower" label="操作按钮" >
<template #header>
<div class="pickButBox">
<el-text >操作按钮</el-text>
<el-button type="primary" size="small">确定授权</el-button>
</div>
</template>
<template #default="scope">
<el-checkbox v-for="item in scope.row.buttenPower" :key="item" v-model="scope.row.isTrue" :label="item.name" />
</template>
</el-table-column>
</el-table>
</el-main>
<el-aside width="200px">
<div class="userTitleBox">
<el-text type="info" >使用人员</el-text>
<el-button type="primary" size="small">添加使用人</el-button>
</div>
<el-scrollbar class="scrollBox">
<div class="userBox" v-for="item in ownerPeople" :key="item.id">
<el-avatar shape="square" :size="size" :src="item.icon?item.icon:squareUrl" />
<div>
<el-text type="primary" >{{item.name}}{{ '('+item.code+')' }}</el-text>
<el-text type="primary" >{{item.orgName}}</el-text>
</div>
</div>
</el-scrollbar>
</el-aside>
</el-container>
<el-table
v-else
:data="systemPowerTree"
style="width: 100%; height: calc(100vh - 277px)"
:cell-style="{ padding: '10px 0' }"
:header-cell-style="{ background: '#F5F7FA', color: '#909399' }"
border
row-key="id"
>
<el-table-column fixed prop="name" label="目录/菜单" width="380" >
<template #default="scope">
<span class="tree_sapn">{{ scope.row.name }}</span>
<el-tag v-if="scope.row.types === 2" type="warning" size="small">目录</el-tag>
<el-tag v-if="scope.row.types === 1" type="success" size="small">菜单</el-tag>
<el-tag v-if="scope.row.types === 4" type="danger" size="small">按钮</el-tag>
<el-tag v-if="scope.row.types === 3" type="info" size="small">外链</el-tag>
</template>
</el-table-column>
<el-table-column prop="isTrue" label="授权" width="80" align="center" >
<template #default="scope">
<el-checkbox v-model="scope.row.isTrue" label="" />
</template>
</el-table-column>
<el-table-column prop="buttenPower" label="操作按钮" >
<template #header>
<div class="pickButBox">
<el-text >操作按钮</el-text>
<el-button type="primary" size="small">确定授权</el-button>
</div>
</template>
<template #default="scope">
<el-checkbox v-for="item in scope.row.buttenPower" :key="item" v-model="scope.row.isTrue" :label="item.name" />
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="应用" name="app">
<template #label>
<el-text class="tabsTitleCont">应用</el-text>
</template>
<table class="table_body">
<thead>
<tr v-if="systemPower.powerType == 'role'">
<td align="center" width="20%">应用</td>
<td align="center" width="50%">应用详情</td>
<td align="center" width="30%">
<div class="userTitleBoxes">
<el-text type="info" >使用人员</el-text>
<el-button type="primary" size="small">添加使用人</el-button>
</div>
</td>
</tr>
<tr v-else>
<td align="center" width="20%">应用</td>
<td width="80%">
<div class="appPickPower">
应用详情
<el-button type="primary" size="small">确定授权</el-button>
</div>
</td>
</tr>
</thead>
<tbody>
<tr >
<td valign="top">
<el-scrollbar class="tab_pane_box">
<ul class="appListBox">
<li v-for="item in appList" :key="item" @click="pickAppList(item)">{{ item.name }}</li>
</ul>
</el-scrollbar>
</td>
<td valign="top">
<el-row class="row_head">
<el-col class="roe_col_head left_line" :span="6">
页面
</el-col>
<el-col class="roe_col_head left_line" :span="6">
表单权力
</el-col>
<el-col class="roe_col_head left_line" :span="6">
列表权限
</el-col>
<el-col class="roe_col_head" :span="6">
数据权限
</el-col>
</el-row>
<el-scrollbar class="tab_pane_body">
<el-row class="left_right" v-for="item in appTableList" :key="item.id">
<el-col class="roe_col_head left_line" :span="6">
{{ item.name }}
</el-col>
<el-col class="roe_col_head left_line" :span="6">
<el-checkbox-group v-model="item.tablePower">
<el-checkbox
v-for="city in appTableBut"
:key="city.key"
:label="city.label"
:value="city.value"
>
{{ city.label }}
</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col class="roe_col_head left_line" :span="6">
<el-checkbox-group v-if="item.istIsTrue" v-model="item.listPower">
<el-checkbox
v-for="city in appListBut"
:key="city.key"
:label="city.label"
:value="city.value"
>
{{ city.label }}
</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col class="roe_col_head" :span="6">
<el-radio-group
v-model="item.datePower.types"
@change="pickAppDataPower(item.datePower)"
>
<el-row>
<el-col :span="24"><el-radio :value="1">本人</el-radio></el-col>
<el-col :span="24"><el-radio :value="2">本岗位</el-radio></el-col>
<el-col :span="24"><el-radio :value="3">本部门</el-radio></el-col>
<el-col :span="24"><el-radio :value="4">本分部</el-radio></el-col>
<el-col :span="24">
<el-radio :value="5">指定行政组织</el-radio>
<el-tree-select
v-if="item.datePower.types == 5"
v-model="item.datePower.attribute"
:data="orgTree"
style="width: 100%"
node-key="id"
:props="systemMenuTreePropsing"
clearable
multiple
:render-after-expand="false"
show-checkbox
collapse-tags
collapse-tags-tooltip
/>
</el-col>
<el-col :span="24"><el-radio :value="6">所有</el-radio></el-col>
</el-row>
</el-radio-group>
</el-col>
</el-row>
</el-scrollbar>
</td>
<td v-if="systemPower.powerType == 'role'" valign="top">
<el-scrollbar class="tab_pane_bodyes">
<div class="userBox" v-for="item in 30" :key="item.id">
<el-avatar shape="square" :size="size" :src="item.icon?item.icon:squareUrl" />
<div>
<el-text type="primary" >{{item.name}}{{ '('+item.code+')' }}</el-text>
<el-text type="primary" >{{item.orgName}}</el-text>
</div>
</div>
</el-scrollbar>
</td>
</tr>
</tbody>
</table>
</el-tab-pane>
</el-tabs>
</div>
<AddRoleGroup v-if="openRoleGroup" v-model:show="openRoleGroup" :group-info="roleGroupOrInfo" @resthandel="getRoleTree" />
<EditRoleGroup v-if="openEditRoleGroup" v-model:show="openEditRoleGroup" :group-info="roleGroupOrInfo" :data="editRoleCont" @resthandel="getRoleTree" />
</div>
</template>
<style lang='scss' scoped>
.roleBox{
display: flex;
width: 100%;
height: calc(100vh - 170px);
padding: 15px 20px 0 20px;
justify-content: space-between;
.roleLeft{
width: 350px;
height: calc(100vh - 185px);
background-color: #FFFFFF;
.butBox{
display: flex;
justify-content: space-between;
padding: 0 10px 10px 10px;
}
.searchBox{
padding: 0 10px 10px 10px;
}
.treeBox{
height: calc(100vh - 330px);
}
}
.roleright{
width: calc(100% - 370px);
height: calc(100vh - 185px);
background-color: #FFFFFF;
overflow: hidden;
:deep .el-tabs__content{
padding: 15px 15px 15px 0px;
}
:deep .el-main{
padding: 0 15px;
}
.userTitleBox{
display: flex;
justify-content: space-between;
padding: 0px 0px 15px 0px;
border-bottom: 1px solid rgba($color: #000000, $alpha: 0.2);
}
.userTitleBoxes{
display: flex;
justify-content: space-between;
}
.pickButBox{
display: flex;
align-items: center;
justify-content: space-between;
}
.scrollBox{
margin-top: 5px;
height: calc(100vh - 320px);
}
.userBox{
width: 100%;
height: 50px;
display: flex;
align-items: center;
justify-items: space-between;
border-bottom: 1px dashed rgba($color: #000000, $alpha: 0.2);
div{
span{
display: flex;
width: 100%;
padding: 0 5px;
color:rgba($color: #000000, $alpha: 0.6);
}
}
}
}
.tabsTitle{
padding: 0 15px;
}
.tabsTitleCont{
padding: 0 35px;
}
.treeRoleBox{
display: flex;
justify-content: space-between;
width: 100%;
align-items: center;
}
.spanButBox{
span{
padding: 0 5px;
}
}
}
.tree_sapn {
padding: 0 10px 0 0;
}
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
.appListBox {
width: 100%;
li {
padding: 10px 2px;
border-bottom: 1px solid #ececec;
cursor: pointer;
}
li.active {
background-color: #a0cfff;
}
}
.tab_pane_box {
height: calc(100vh - 310px);
overflow: hidden;
overflow-y: auto;
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
}
.row_head{
background-color: #f5f7fa;
color: #000000;
text-align: center;
border: 1px solid #E4E7ED;
}
.roe_col_head{
padding: 5px 5px;
}
.left_right{
border-left: 1px solid #E4E7ED;
border-right: 1px solid #E4E7ED;
border-bottom: 1px solid #E4E7ED;
}
.left_line{
border-right: 1px solid #E4E7ED;
}
.tab_pane_body {
height: calc(100vh - 340px);
overflow: hidden;
overflow-y: auto;
}
.tab_pane_bodyes {
height: calc(100vh - 320px);
overflow: hidden;
overflow-y: auto;
}
.appPickPower{
display: flex;
justify-content: space-between;
align-items: center;
}
</style>

871
src/views/system/monitor/online/index.vue

File diff suppressed because it is too large

903
src/views/system/monitor/online/index123.vue

@ -0,0 +1,903 @@
<!--
@ 作者: 秦东
@ 时间: 2025-10-21 10:06:51
@ 备注: 在线人数
-->
<script lang='ts' setup>
import { giveRoleTree,editRoleStatus,getOrgPostTree } from '@/api/role/index'
import type {RoleListTree,RoleFormInfo,orgAndPostisListTree} from '@/api/role/types'
import type { TreeNode,TreeInstance } from 'element-plus'
import { Search } from '@element-plus/icons-vue'
import { orgInfo } from "@/api/hr/org/type";
import { getOrgTreeList } from "@/api/hr/org/index";
import { appPowerUnit } from "@/api/system/roleapi/power";
import type { getSystemPower,AppPowerTree } from "@/api/system/roleapi/types";
import { appTableBut, appListBut } from "@/utils/workflow/const";
import {
gainAppList,
gainAppTableListNew,
getMyPeoplceAndSunOrg,
getMyPeopleAndSunOrgPost,
getPowerPageUser
} from "@/api/system/roleapi/postrole";
import {
custerAppInfo
} from "@/api/system/roleapi/types";
import type { LoadFunction } from 'element-plus'
import AddRoleGroup from '@/views/system/monitor/online/roleConfig/addRoleGroup.vue'
import EditRoleGroup from '@/views/system/monitor/online/roleConfig/editRoleGroup.vue'
const squareUrl = ref<string>(
"https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png"
);
const orgTree = ref<orgInfo[]>([])
const roleGroupOrInfo = ref(1)
const searchQuery = ref('')
const orgWorkRole = ref("org")
const appSysPick = ref("system")
const treeRef = ref<TreeInstance>()
const treeRefOrg = ref<TreeInstance>()
const roleListdata = ref<RoleListTree[]>([])
const orgPostisListdata = ref<orgAndPostisListTree[]>([])
const treeBoxHeight = ref(300)
const treeBoxHeightOrg = ref(300)
const roleLeft = ref()
const systemPowerTree = ref<AppPowerTree[]>([])
const ownerPeople = ref<any>([])
const props = {
value: 'id',
label: 'label',
disabled:'status',
children: 'children',
}
const propsOrg = {
value: 'id',
label: 'name',
disabled:'status',
children: 'child',
}
const propsOrgPost = {
value: 'id',
label: 'label',
disabled:'status',
children: 'children',
}
const searchUser = reactive({
page:1,
pageSize:19,
name:"",
total:0,
});
const systemPower = ref<getSystemPower>({
powerType:"org",
appType:"appsystem",
appSystem:"system",
roleId:"",
})
const roleLoading = ref(false)
const openRoleGroup = ref(false)
const orgLoading = ref(false)
const orgPostLoading = ref(false)
const appList = ref<custerAppInfo[]>([]);
//
const onQueryChanged = (query: string) => {
treeRef.value!.filter(query)
}
//
const onQueryChangedOrg = (query: string) => {
// treeRefOrg.value!.filter(query)
searchUser.page = 1
searchUser.total = 0
fpickUserTabs()
}
const filterMethod = (query: string, node: any) => node.label!.includes(query)
const filterMethodOrg = (query: string, node: any) => node.name!.includes(query)
//
watch(()=>systemPower.value.powerType,(val:string)=>{
console.log("监测赋权组",val)
getSystemPowerSub();
switch(val){
case "org":
getOrgTreeAry();
break;
case "job":
getOrgPostisTree()
break;
case "role":
getRoleTree();
break;
case "person":
fpickUserTabs();
break;
default:
}
if(systemPower.value.appSystem=="app"){
getAppList();
}else{
getSystemPowerSub();
}
},{
deep:true
})
//
const pickRoleTree = (data:any) => {
if(data.status && data.types==1){
console.log("监测赋权组------->",data)
}
}
//
const pickOrgTree = (data:any) => {
console.log("监测赋权组------->",data)
}
//
const getRoleTree = () => {
roleLoading.value = true
giveRoleTree().then(({data})=>{
console.log("监测赋权组------->",data)
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id
}
roleListdata.value=data;
roleLoading.value = false;
}).finally(()=>{roleLoading.value = false})
}
const editRoleCont = ref<RoleFormInfo>()
const openEditRoleGroup = ref(false)
//
const editMyInfoIcon = (data:RoleListTree,types:number) => {
console.log("编辑角色信息------->",data)
console.log("编辑角色信息---types---->",types)
switch(types){
case 1:
editRoleStatusBut(data.id,2)
break;
case 2:
editRoleStatusBut(data.id,1)
break;
case 3:
editRoleCont.value = {
id:data.id,
name:data.label,
type:data.types,
superior:data.superior,
sort:data.sort
}
openEditRoleGroup.value = true
break;
case 4:
ElMessageBox.confirm(
"您确定要删除此信息吗?一经删除!数据将不可恢复!请慎重操作!",
"警告",
{
confirmButtonText: '确定删除',
cancelButtonText: '取消删除',
type: 'warning',
}
).then(()=>{
editRoleStatusBut(data.id,3)
})
break;
default:
break;
}
}
//
const editRoleStatusBut = (id:string|number,types:number) => {
// console.log("--->",id)
editRoleStatus({id:id.toString(),status:types}).then((data:any)=>{
if(data.code==0){
ElMessage({
message: data.msg,
type: 'success',
})
getRoleTree()
}else{
ElMessage({
message: data.msg,
type: 'success',
})
}
})
}
//
const addRoleGroup = (types:number) => {
roleGroupOrInfo.value = types
openRoleGroup.value = true
}
//
const getOrgTreeAry = () => {
roleLoading.value = true
if(!Array.isArray(orgTree.value) || orgTree.value.length<=0){
getOrgTreeList({ orgid: 0 })
.then(({ data }) => {
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id
}
orgTree.value = data
roleLoading.value = false
}).finally(()=>{roleLoading.value = false})
}else{
roleLoading.value = false
}
}
//
const getOrgPostisTree = () => {
orgPostLoading.value=true
if(!Array.isArray(orgPostisListdata.value) || orgPostisListdata.value.length<=0){
getOrgPostTree({id:"313"}).then(({data})=>{
console.log("获取行政组织及岗位--------->",data)
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id
}
orgPostisListdata.value = data
orgPostLoading.value=false
}).finally(()=>{orgPostLoading.value=false})
}else{
orgPostLoading.value=true
}
}
//
const getSystemPowerSub = () => {
appPowerUnit(systemPower.value).then(({data})=>{
console.log("获取平台授权项目------->",data)
systemPowerTree.value = data
})
}
const activeAppId = ref<string>("");
const appTableList = ref<custerAppTablePower[]>([]);
/**
@ 作者: 秦东
@ 时间: 2025-05-13 14:20:47
@ 功能: 获取自定义App
*/
const getAppList = () => {
gainAppList().then((data: any) => {
console.log("获取自定义App", data);
appList.value = data.data;
if (data.data && data.data.length > 0) {
if (data.data[0] && data.data[0].signCode) {
activeAppId.value = data.data[0].signCode;
getAppTableList();
}
}
console.log("获取自定义App", activeAppId.value);
});
};
/**
@ 作者: 秦东
@ 时间: 2025-05-13 16:00:19
@ 功能: 获取对应App下边的表单
*/
const getAppTableList = () => {
systemPower.value.roleId = activeAppId.value
gainAppTableListNew({id:activeAppId.value,appType:systemPower.value.appType,powerType:systemPower.value.powerType,roleId:systemPower.value.roleId}).then(
(data: any) => {
console.log("获取对应App下边的表单", data);
if (Array.isArray(data.data)) {
appTableList.value = data.data;
} else {
appTableList.value = [];
}
}
);
};
watch(()=>systemPower.value.appSystem,(val:string)=>{
if(val=="app"){
getAppList();
}
},{
immediate:true
})
onMounted(()=>{
// getOrgTreeAry();
getSystemPowerSub();
console.log("高度-----1---->",roleLeft.value?.offsetHeight)
nextTick(()=>{
treeBoxHeight.value = roleLeft.value?.offsetHeight - 140
treeBoxHeightOrg.value = roleLeft.value?.offsetHeight - 100
})
})
watch(
() => activeAppId.value,
(val) => {
getAppTableList();
},
{
immediate:true
}
);
/**
@ 作者: 秦东
@ 时间: 2025-05-14 15:01:26
@ 功能: 选择App数据
*/
const pickAppList = (val: custerAppInfo) => {
activeAppId.value = val.signCode;
};
const systemMenuTreePropsing = {
children: "child",
label: "name",
value: "id",
};
interface Tree {
name: string
leaf?: boolean
}
const propsLoading = {
label: 'name',
children: 'zones',
isLeaf: 'isLeaf',
}
const loadNode: LoadFunction<Tree> = (node, resolve, reject) => {
console.log("node============>",node)
console.log("resolve===>",resolve)
if (node.level === 0) {
getMyPeoplceAndSunOrg({id:"313",level:node.level}).then((res) => {
console.log("res================>",res)
resolve(res.data)
})
}
if (node.level > 0){
getMyPeoplceAndSunOrg({id:node.data.id.toString(),level:1}).then((res) => {
console.log("res=========1=======>",res.data)
if(res.data && Array.isArray(res.data) && res.data.length > 0){
resolve(res.data)
}else{
resolve([])
}
}).catch(() => {
return reject()
})
}
}
const loadNodePost: LoadFunction<Tree> = (node, resolve, reject) => {
console.log("node============>",node)
console.log("resolve===>",resolve)
if (node.level === 0) {
getMyPeopleAndSunOrgPost({id:"313",level:node.level,types:node.data.types}).then((res) => {
console.log("res================>",res)
resolve(res.data)
})
}
if (node.level > 0){
getMyPeopleAndSunOrgPost({id:node.data.id.toString(),level:1,types:node.data.types}).then((res) => {
console.log("res=========1=======>",res.data)
if(res.data && Array.isArray(res.data) && res.data.length > 0){
resolve(res.data)
}else{
resolve([])
}
}).catch(() => {
return reject()
})
}
}
//
const fpickUserTabs = () => {
getPowerPageUser(searchUser).then((res) => {
console.log("res================>",res)
ownerPeople.value = res.data.list
searchUser.total = res.data.total
})
}
//
const pageCurrentChange = (val:number) => {
searchUser.page = val
fpickUserTabs()
}
</script>
<template>
<div class="roleBox">
<div ref="roleLeft" class="roleLeft">
<el-tabs v-model="systemPower.powerType" class="demo-tabs">
<el-tab-pane label="组织" name="org">
<template #label>
<el-text class="tabsTitle">组织</el-text>
</template>
<el-scrollbar class="tab_pane_bodyLoading">
<el-tree
ref="treeRefOrg"
style="max-width: 350px;"
:props="propsLoading"
:load="loadNode"
:highlight-current="true"
:expand-on-click-node="false"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
node-key="id"
lazy
show-checkbox
@node-click="pickOrgTree"
/>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="岗位" name="job">
<template #label>
<el-text class="tabsTitle">岗位</el-text>
</template>
<el-scrollbar class="tab_pane_bodyLoading">
<el-tree
ref="treeRefOrg"
style="max-width: 350px;"
:props="propsLoading"
:load="loadNodePost"
:highlight-current="true"
:expand-on-click-node="false"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
node-key="id"
lazy
show-checkbox
@node-click="pickOrgTree"
/>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="角色" name="role">
<template #label>
<el-text class="tabsTitle">角色</el-text>
</template>
<div class="butBox">
<el-button type="primary" @click="addRoleGroup(1)">新建角色组</el-button>
<el-button type="primary" @click="addRoleGroup(2)">新建角色</el-button>
</div>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的角色" :suffix-icon="Search" @input="onQueryChanged"/>
</div>
<el-tree-v2
ref="treeRef"
style="max-width: 350px;"
:data="roleListdata"
:props="props"
:filter-method="filterMethod"
:height="treeBoxHeight"
v-loading="roleLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
@node-click="pickRoleTree"
>
<template #default="{ node }" >
<div class="treeRoleBox">
<span>{{ node.label }}</span>
<div class="spanButBox">
<el-text v-if="node.disabled" type="warning" size="small" @click.stop="editMyInfoIcon(node.data,1)">禁用</el-text>
<el-text v-else type="success" size="small" @click.stop="editMyInfoIcon(node.data,2)">启用</el-text>
<el-text type="primary" size="small" @click.stop="editMyInfoIcon(node.data,3)">编辑</el-text>
<el-text type="danger" size="small" @click.stop="editMyInfoIcon(node.data,4)">删除</el-text>
</div>
</div>
</template>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="个人" name="person">
<div class="searchBox">
<el-input v-model="searchUser.name" placeholder="请输入要查找的人" :suffix-icon="Search" @input="onQueryChangedOrg"/>
</div>
<el-scrollbar class="tab_pane_bodyes">
<div class="userBox" v-for="item in ownerPeople" :key="item.id">
<el-avatar shape="square" :size="size" :src="item.icon?item.icon:squareUrl" />
<div>
<el-text type="primary" >{{item.name}}{{ '('+item.code+')' }}</el-text>
<el-text type="primary" >{{item.org}}</el-text>
</div>
</div>
</el-scrollbar>
<div style="width: 100%; display: flex; justify-content: center; margin-top: 5px;">
<el-pagination
:page-size="searchUser.pageSize"
:pager-count="7"
layout="prev, pager, next"
:total="searchUser.total"
@current-change="pageCurrentChange"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="roleright">
<el-tabs v-model="systemPower.appSystem" class="demo-tabs">
<el-tab-pane label="平台" name="system">
<template #label>
<el-text class="tabsTitleCont">平台</el-text>
</template>
<el-table
:data="systemPowerTree"
style="width: 100%; height: calc(100vh - 277px)"
:cell-style="{ padding: '10px 0' }"
:header-cell-style="{ background: '#F5F7FA', color: '#909399' }"
border
row-key="id"
>
<el-table-column fixed prop="name" label="目录/菜单" width="380" >
<template #default="scope">
<span class="tree_sapn">{{ scope.row.name }}</span>
<el-tag v-if="scope.row.types === 2" type="warning" size="small">目录</el-tag>
<el-tag v-if="scope.row.types === 1" type="success" size="small">菜单</el-tag>
<el-tag v-if="scope.row.types === 4" type="danger" size="small">按钮</el-tag>
<el-tag v-if="scope.row.types === 3" type="info" size="small">外链</el-tag>
</template>
</el-table-column>
<el-table-column prop="isTrue" label="授权" width="80" align="center" >
<template #default="scope">
<el-checkbox v-model="scope.row.isTrue" label="" />
</template>
</el-table-column>
<el-table-column prop="buttenPower" label="操作按钮" min-width="380" >
<template #header>
<div class="pickButBox">
<el-text >操作按钮</el-text>
<el-button type="primary" size="small">确定授权</el-button>
</div>
</template>
<template #default="scope">
<el-checkbox v-for="item in scope.row.buttenPower" :key="item" v-model="scope.row.isTrue" :label="item.name" />
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="应用" name="app">
<template #label>
<el-text class="tabsTitleCont">应用</el-text>
</template>
<table class="table_body">
<thead>
<tr v-if="systemPower.powerType == 'role'">
<td align="center" width="20%">应用</td>
<td align="center" width="50%">应用详情</td>
</tr>
<tr v-else>
<td align="center" width="20%">应用</td>
<td width="80%">
<div class="appPickPower">
应用详情
<el-button type="primary" size="small">确定授权</el-button>
</div>
</td>
</tr>
</thead>
<tbody>
<tr >
<td valign="top">
<el-scrollbar class="tab_pane_box">
<ul class="appListBox">
<li v-for="item in appList" :key="item" @click="pickAppList(item)">{{ item.name }}</li>
</ul>
</el-scrollbar>
</td>
<td valign="top">
<el-row class="row_head">
<el-col class="roe_col_head left_line" :span="6">
页面
</el-col>
<el-col class="roe_col_head left_line" :span="6">
表单权力
</el-col>
<el-col class="roe_col_head left_line" :span="6">
列表权限
</el-col>
<el-col class="roe_col_head" :span="6">
数据权限
</el-col>
</el-row>
<el-scrollbar class="tab_pane_body">
<el-row class="left_right" v-for="item in appTableList" :key="item.id">
<el-col class="roe_col_head left_line" :span="6">
{{ item.name }}
</el-col>
<el-col class="roe_col_head left_line" :span="6">
<el-checkbox-group v-model="item.tablePower">
<el-checkbox
v-for="city in appTableBut"
:key="city.key"
:label="city.label"
:value="city.value"
>
{{ city.label }}
</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col class="roe_col_head left_line" :span="6">
<el-checkbox-group v-if="item.istIsTrue" v-model="item.listPower">
<el-checkbox
v-for="city in appListBut"
:key="city.key"
:label="city.label"
:value="city.value"
>
{{ city.label }}
</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col class="roe_col_head" :span="6">
<el-radio-group
v-model="item.datePower.types"
@change="pickAppDataPower(item.datePower)"
>
<el-row>
<el-col :span="24"><el-radio :value="1">本人</el-radio></el-col>
<el-col :span="24"><el-radio :value="2">本岗位</el-radio></el-col>
<el-col :span="24"><el-radio :value="3">本部门</el-radio></el-col>
<el-col :span="24"><el-radio :value="4">本分部</el-radio></el-col>
<el-col :span="24">
<el-radio :value="5">指定行政组织</el-radio>
<el-tree-select
v-if="item.datePower.types == 5"
v-model="item.datePower.attribute"
:data="orgTree"
style="width: 100%"
node-key="id"
:props="systemMenuTreePropsing"
clearable
multiple
:render-after-expand="false"
show-checkbox
collapse-tags
collapse-tags-tooltip
/>
</el-col>
<el-col :span="24"><el-radio :value="6">所有</el-radio></el-col>
</el-row>
</el-radio-group>
</el-col>
</el-row>
</el-scrollbar>
</td>
</tr>
</tbody>
</table>
</el-tab-pane>
</el-tabs>
</div>
<AddRoleGroup v-if="openRoleGroup" v-model:show="openRoleGroup" :group-info="roleGroupOrInfo" @resthandel="getRoleTree" />
<EditRoleGroup v-if="openEditRoleGroup" v-model:show="openEditRoleGroup" :group-info="roleGroupOrInfo" :data="editRoleCont" @resthandel="getRoleTree" />
</div>
</template>
<style lang='scss' scoped>
.roleBox{
display: flex;
width: 100%;
height: calc(100vh - 170px);
padding: 15px 20px 0 20px;
justify-content: space-between;
.roleLeft{
width: 350px;
height: calc(100vh - 185px);
background-color: #FFFFFF;
.butBox{
display: flex;
justify-content: space-between;
padding: 0 10px 10px 10px;
}
.searchBox{
padding: 0 10px 5px 10px;
}
.treeBox{
height: calc(100vh - 330px);
}
}
.roleright{
width: calc(100% - 370px);
height: calc(100vh - 185px);
background-color: #FFFFFF;
overflow: hidden;
:deep .el-tabs__content{
padding: 15px 15px 15px 0px;
}
:deep .el-main{
padding: 0 15px;
}
.userTitleBox{
display: flex;
justify-content: space-between;
padding: 0px 0px 15px 0px;
border-bottom: 1px solid rgba($color: #000000, $alpha: 0.2);
}
.userTitleBoxes{
display: flex;
justify-content: space-between;
}
.pickButBox{
display: flex;
align-items: center;
justify-content: space-between;
}
.scrollBox{
margin-top: 5px;
height: calc(100vh - 320px);
}
}
.tabsTitle{
padding: 0 15px;
}
.tabsTitleCont{
padding: 0 35px;
}
.treeRoleBox{
display: flex;
justify-content: space-between;
width: 100%;
align-items: center;
}
.spanButBox{
span{
padding: 0 5px;
}
}
}
.tree_sapn {
padding: 0 10px 0 0;
}
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
.appListBox {
width: 100%;
li {
padding: 10px 2px;
border-bottom: 1px solid #ececec;
cursor: pointer;
}
li.active {
background-color: #a0cfff;
}
}
.tab_pane_box {
height: calc(100vh - 310px);
overflow: hidden;
overflow-y: auto;
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
}
.row_head{
background-color: #f5f7fa;
color: #000000;
text-align: center;
border: 1px solid #E4E7ED;
}
.roe_col_head{
padding: 5px 5px;
}
.left_right{
border-left: 1px solid #E4E7ED;
border-right: 1px solid #E4E7ED;
border-bottom: 1px solid #E4E7ED;
}
.left_line{
border-right: 1px solid #E4E7ED;
}
.tab_pane_body {
height: calc(100vh - 340px);
overflow: hidden;
overflow-y: auto;
}
.tab_pane_bodyes {
height: calc(100vh - 320px);
overflow: hidden;
overflow-y: auto;
}
.tab_pane_bodyLoading {
height: calc(100vh - 250px);
overflow: hidden;
overflow-y: auto;
}
.appPickPower{
display: flex;
justify-content: space-between;
align-items: center;
}
.userBox{
width: 100%;
min-height: 50px;
display: flex;
align-items: center;
justify-items: space-between;
padding: 0 10px;
border-bottom: 1px dashed rgba($color: #000000, $alpha: 0.2);
div{
span{
display: flex;
width: 100%;
padding: 0 5px;
color:rgba($color: #000000, $alpha: 0.6);
}
}
}
</style>

819
src/views/system/monitor/online/index2.vue

@ -0,0 +1,819 @@
<!--
@ 作者: 秦东
@ 时间: 2025-10-21 10:06:51
@ 备注: 在线人数
-->
<script lang='ts' setup>
import { giveRoleTree,editRoleStatus,getOrgPostTree } from '@/api/role/index'
import type {RoleListTree,RoleFormInfo,orgAndPostisListTree} from '@/api/role/types'
import type { TreeNode,TreeInstance } from 'element-plus'
import { Search } from '@element-plus/icons-vue'
import { orgInfo } from "@/api/hr/org/type";
import { getOrgTreeList } from "@/api/hr/org/index";
import { appPowerUnit } from "@/api/system/roleapi/power";
import type { getSystemPower,AppPowerTree } from "@/api/system/roleapi/types";
import { appTableBut, appListBut } from "@/utils/workflow/const";
import {
gainAppList,
gainAppTableListNew,
getMyPeoplceAndSunOrg,
getMyPeopleAndSunOrgPost,
getPowerPageUser
} from "@/api/system/roleapi/postrole";
import {
custerAppInfo
} from "@/api/system/roleapi/types";
import AddRoleGroup from '@/views/system/monitor/online/roleConfig/addRoleGroup.vue'
import EditRoleGroup from '@/views/system/monitor/online/roleConfig/editRoleGroup.vue'
const squareUrl = ref<string>(
"https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png"
);
const orgTree = ref<orgInfo[]>([])
const roleGroupOrInfo = ref(1)
const searchQuery = ref('')
const orgWorkRole = ref("org")
const appSysPick = ref("system")
const treeRef = ref<TreeInstance>()
const treeRefOrg = ref<TreeInstance>()
const treeRefOrgPost = ref<TreeInstance>()
const roleListdata = ref<RoleListTree[]>([])
const orgPostisListdata = ref<orgAndPostisListTree[]>([])
const treeBoxHeight = ref(300)
const treeBoxHeightOrg = ref(300)
const roleLeft = ref()
const systemPowerTree = ref<AppPowerTree[]>([])
const ownerPeople = ref<any>([])
const props = {
value: 'id',
label: 'label',
disabled:'status',
children: 'children',
}
const propsOrg = {
value: 'id',
label: 'name',
// disabled:'status',
children: 'child',
}
const propsOrgPost = {
value: 'id',
label: 'label',
disabled:'status',
children: 'children',
}
const systemPower = ref<getSystemPower>({
powerType:"org",
appType:"appsystem",
appSystem:"system",
roleId:"",
})
const roleLoading = ref(false)
const openRoleGroup = ref(false)
const orgLoading = ref(false)
const orgPostLoading = ref(false)
const appList = ref<custerAppInfo[]>([]);
//
const onQueryChanged = (query: string) => {
treeRef.value!.filter(query)
}
//
const onQueryChangedOrg = (query: string) => {
treeRefOrg.value!.filter(query)
}
const filterMethod = (query: string, node: any) => node.label!.includes(query)
const filterMethodOrg = (query: string, node: any) => node.label!.includes(query)
//
watch(()=>systemPower.value.powerType,(val:string)=>{
console.log("监测赋权组",val)
getSystemPowerSub();
switch(val){
case "org":
getOrgTreeAry();
break;
case "job":
getOrgPostisTree()
break;
case "role":
getRoleTree();
break;
default:
}
if(systemPower.value.appSystem=="app"){
getAppList();
}else{
getSystemPowerSub();
}
},{
deep:true
})
//
const pickRoleTree = (data:any) => {
if(data.status && data.types==1){
console.log("监测赋权组------->",data)
}
}
//
const pickOrgTree = (data:any) => {
console.log("监测赋权组------->",data)
}
//
const getRoleTree = () => {
roleLoading.value = true
giveRoleTree().then(({data})=>{
console.log("监测赋权组------->",data)
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id.toString()
}
roleListdata.value=data;
roleLoading.value = false;
}).finally(()=>{roleLoading.value = false})
}
const editRoleCont = ref<RoleFormInfo>()
const openEditRoleGroup = ref(false)
//
const editMyInfoIcon = (data:RoleListTree,types:number) => {
console.log("编辑角色信息------->",data)
console.log("编辑角色信息---types---->",types)
switch(types){
case 1:
editRoleStatusBut(data.id,2)
break;
case 2:
editRoleStatusBut(data.id,1)
break;
case 3:
editRoleCont.value = {
id:data.id,
name:data.label,
type:data.types,
superior:data.superior,
sort:data.sort
}
openEditRoleGroup.value = true
break;
case 4:
ElMessageBox.confirm(
"您确定要删除此信息吗?一经删除!数据将不可恢复!请慎重操作!",
"警告",
{
confirmButtonText: '确定删除',
cancelButtonText: '取消删除',
type: 'warning',
}
).then(()=>{
editRoleStatusBut(data.id,3)
})
break;
default:
break;
}
}
//
const editRoleStatusBut = (id:string|number,types:number) => {
// console.log("--->",id)
editRoleStatus({id:id.toString(),status:types}).then((data:any)=>{
if(data.code==0){
ElMessage({
message: data.msg,
type: 'success',
})
getRoleTree()
}else{
ElMessage({
message: data.msg,
type: 'success',
})
}
})
}
//
const addRoleGroup = (types:number) => {
roleGroupOrInfo.value = types
openRoleGroup.value = true
}
//
const getOrgTreeAry = () => {
roleLoading.value = true
if(!Array.isArray(orgTree.value) || orgTree.value.length<=0){
getOrgTreeList({ orgid: 0 })
.then(({ data }) => {
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id.toString()
}
orgTree.value = data
roleLoading.value = false
}).finally(()=>{roleLoading.value = false})
}else{
roleLoading.value = false
}
}
//
const getOrgPostisTree = () => {
orgPostLoading.value=true
if(!Array.isArray(orgPostisListdata.value) || orgPostisListdata.value.length<=0){
getOrgPostTree({id:"313"}).then(({data})=>{
console.log("获取行政组织及岗位--------->",data)
if(Array.isArray(data) && data.length>0){
systemPower.value.roleId=data[0].id.toString()
}
orgPostisListdata.value = data
orgPostLoading.value=false
}).finally(()=>{orgPostLoading.value=false})
}else{
orgPostLoading.value=true
}
}
//
const getSystemPowerSub = () => {
appPowerUnit(systemPower.value).then(({data})=>{
console.log("获取平台授权项目------->",data)
systemPowerTree.value = data
})
}
const activeAppId = ref<string>("");
const appTableList = ref<custerAppTablePower[]>([]);
/**
@ 作者: 秦东
@ 时间: 2025-05-13 14:20:47
@ 功能: 获取自定义App
*/
const getAppList = () => {
gainAppList().then((datassssssssssssssssssssssssssssssssssssssssssssssssssssss: any) => {
console.log("获取自定义App", data);
appList.value = data.data;
if (data.data && data.data.length > 0) {
if (data.data[0] && data.data[0].signCode) {
activeAppId.value = data.data[0].signCode;
getAppTableList();
}
}
console.log("获取自定义App", activeAppId.value);
});
};
/**
@ 作者: 秦东
@ 时间: 2025-05-13 16:00:19
@ 功能: 获取对应App下边的表单
*/
const getAppTableList = () => {
systemPower.value.roleId = activeAppId.value.toString()
gainAppTableListNew({id:activeAppId.value,appType:systemPower.value.appType,powerType:systemPower.value.powerType,roleId:systemPower.value.roleId}).then(
(data: any) => {
console.log("获取对应App下边的表单", data);
if (Array.isArray(data.data)) {
appTableList.value = data.data;
} else {
appTableList.value = [];
}
}
);
};
watch(()=>systemPower.value.appSystem,(val:string)=>{
if(val=="app"){
getAppList();
}
},{
immediate:true
})
onMounted(()=>{
getOrgTreeAry();
getSystemPowerSub();
console.log("高度-----1---->",roleLeft.value?.offsetHeight)
nextTick(()=>{
treeBoxHeight.value = roleLeft.value?.offsetHeight - 140
treeBoxHeightOrg.value = roleLeft.value?.offsetHeight - 100
})
})
watch(
() => activeAppId.value,
(val) => {
getAppTableList();
},
{
immediate:true
}
);
/**
@ 作者: 秦东
@ 时间: 2025-05-14 15:01:26
@ 功能: 选择App数据
*/
const pickAppList = (val: custerAppInfo) => {
activeAppId.value = val.signCode;
};
const systemMenuTreePropsing = {
children: "child",
label: "name",
value: "id",
};
//
const onQuedOrg = (query: string) => {
treeRefOrgPost.value!.filter(query)
}
</script>
<template>
<div class="roleBox">
<div ref="roleLeft" class="roleLeft">
<el-tabs v-model="systemPower.powerType" class="demo-tabs">
<el-tab-pane label="组织" name="org">
<template #label>
<el-text class="tabsTitle">组织</el-text>
</template>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的行政组织" :suffix-icon="Search" @input="onQueryChangedOrg"/>
</div>
<el-tree-v2
ref="treeRefOrg"
style="max-width: 350px;"
:data="orgTree"
:props="propsOrg"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
v-loading="roleLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
show-checkbox
@node-click="pickOrgTree"
>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="岗位" name="job">
<template #label>
<el-text class="tabsTitle">岗位</el-text>
</template>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的行政组织" :suffix-icon="Search" @input="onQuedOrg"/>
</div>
<el-tree-v2
ref="treeRefOrgPost"
style="max-width: 350px;"
:data="orgPostisListdata"
:props="propsOrgPost"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
v-loading="roleLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
show-checkbox
@node-click="pickOrgTree"
>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="角色" name="role">
<template #label>
<el-text class="tabsTitle">角色</el-text>
</template>
<div class="butBox">
<el-button type="primary" @click="addRoleGroup(1)">新建角色组</el-button>
<el-button type="primary" @click="addRoleGroup(2)">新建角色</el-button>
</div>
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的角色" :suffix-icon="Search" @input="onQueryChanged"/>
</div>
<el-tree-v2
ref="treeRef"
style="max-width: 350px;"
:data="roleListdata"
:props="props"
:filter-method="filterMethod"
:height="treeBoxHeight"
v-loading="roleLoading"
show-checkbox
@node-click="pickRoleTree"
>
<template #default="{ node }" >
<div class="treeRoleBox">
<span>{{ node.label }}</span>
<div class="spanButBox">
<el-text v-if="node.disabled" type="warning" size="small" @click.stop="editMyInfoIcon(node.data,1)">禁用</el-text>
<el-text v-else type="success" size="small" @click.stop="editMyInfoIcon(node.data,2)">启用</el-text>
<el-text type="primary" size="small" @click.stop="editMyInfoIcon(node.data,3)">编辑</el-text>
<el-text type="danger" size="small" @click.stop="editMyInfoIcon(node.data,4)">删除</el-text>
</div>
</div>
</template>
</el-tree-v2>
</el-tab-pane>
<el-tab-pane label="个人" name="person">
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的人" :suffix-icon="Search" @input="onQueryChangedOrg"/>
</div>
<el-scrollbar class="tab_pane_bodyes">
<div class="userBox" v-for="item in 30" :key="item.id">
<el-avatar shape="square" :size="size" :src="item.icon?item.icon:squareUrl" />
<div>
<el-text type="primary" >{{item.name}}{{ '('+item.code+')' }}</el-text>
<el-text type="primary" >{{item.orgName}}</el-text>
</div>
</div>
</el-scrollbar>
<div style="width: 100%; display: flex; justify-content: center; margin-top: 5px;">
<el-pagination
:page-size="19"
:pager-count="7"
layout="prev, pager, next"
:total="2"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="roleright">
<el-tabs v-model="systemPower.appSystem" class="demo-tabs">
<el-tab-pane label="平台" name="system">
<template #label>
<el-text class="tabsTitleCont">平台</el-text>
</template>
<el-table
:data="systemPowerTree"
style="width: 100%; height: calc(100vh - 277px)"
:cell-style="{ padding: '10px 0' }"
:header-cell-style="{ background: '#F5F7FA', color: '#909399' }"
border
row-key="id"
>
<el-table-column fixed prop="name" label="目录/菜单" width="380" >
<template #default="scope">
<span class="tree_sapn">{{ scope.row.name }}</span>
<el-tag v-if="scope.row.types === 2" type="warning" size="small">目录</el-tag>
<el-tag v-if="scope.row.types === 1" type="success" size="small">菜单</el-tag>
<el-tag v-if="scope.row.types === 4" type="danger" size="small">按钮</el-tag>
<el-tag v-if="scope.row.types === 3" type="info" size="small">外链</el-tag>
</template>
</el-table-column>
<el-table-column prop="isTrue" label="授权" width="80" align="center" >
<template #default="scope">
<el-checkbox v-model="scope.row.isTrue" label="" />
</template>
</el-table-column>
<el-table-column prop="buttenPower" label="操作按钮" min-width="380" >
<template #header>
<div class="pickButBox">
<el-text >操作按钮</el-text>
<el-button type="primary" size="small">确定授权</el-button>
</div>
</template>
<template #default="scope">
<el-checkbox v-for="item in scope.row.buttenPower" :key="item" v-model="scope.row.isTrue" :label="item.name" />
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="应用" name="app">
<template #label>
<el-text class="tabsTitleCont">应用</el-text>
</template>
<table class="table_body">
<thead>
<tr>
<td align="center" width="20%">应用</td>
<td width="80%">
<div class="appPickPower">
应用详情
<el-button type="primary" size="small">确定授权</el-button>
</div>
</td>
</tr>
</thead>
<tbody>
<tr >
<td valign="top">
<el-scrollbar class="tab_pane_box">
<ul class="appListBox">
<li v-for="item in appList" :key="item" @click="pickAppList(item)">{{ item.name }}</li>
</ul>
</el-scrollbar>
</td>
<td valign="top">
<el-row class="row_head">
<el-col class="roe_col_head left_line" :span="6">
页面
</el-col>
<el-col class="roe_col_head left_line" :span="6">
表单权力
</el-col>
<el-col class="roe_col_head left_line" :span="6">
列表权限
</el-col>
<el-col class="roe_col_head" :span="6">
数据权限
</el-col>
</el-row>
<el-scrollbar class="tab_pane_body">
<el-row class="left_right" v-for="item in appTableList" :key="item.id">
<el-col class="roe_col_head left_line" :span="6">
{{ item.name }}
</el-col>
<el-col class="roe_col_head left_line" :span="6">
<el-checkbox-group v-model="item.tablePower">
<el-checkbox
v-for="city in appTableBut"
:key="city.key"
:label="city.label"
:value="city.value"
>
{{ city.label }}
</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col class="roe_col_head left_line" :span="6">
<el-checkbox-group v-if="item.istIsTrue" v-model="item.listPower">
<el-checkbox
v-for="city in appListBut"
:key="city.key"
:label="city.label"
:value="city.value"
>
{{ city.label }}
</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col class="roe_col_head" :span="6">
<el-radio-group
v-model="item.datePower.types"
@change="pickAppDataPower(item.datePower)"
>
<el-row>
<el-col :span="24"><el-radio :value="1">本人</el-radio></el-col>
<el-col :span="24"><el-radio :value="2">本岗位</el-radio></el-col>
<el-col :span="24"><el-radio :value="3">本部门</el-radio></el-col>
<el-col :span="24"><el-radio :value="4">本分部</el-radio></el-col>
<el-col :span="24">
<el-radio :value="5">指定行政组织</el-radio>
<el-tree-select
v-if="item.datePower.types == 5"
v-model="item.datePower.attribute"
:data="orgTree"
style="width: 100%"
node-key="id"
:props="systemMenuTreePropsing"
clearable
multiple
:render-after-expand="false"
show-checkbox
collapse-tags
collapse-tags-tooltip
/>
</el-col>
<el-col :span="24"><el-radio :value="6">所有</el-radio></el-col>
</el-row>
</el-radio-group>
</el-col>
</el-row>
</el-scrollbar>
</td>
</tr>
</tbody>
</table>
</el-tab-pane>
</el-tabs>
</div>
<AddRoleGroup v-if="openRoleGroup" v-model:show="openRoleGroup" :group-info="roleGroupOrInfo" @resthandel="getRoleTree" />
<EditRoleGroup v-if="openEditRoleGroup" v-model:show="openEditRoleGroup" :group-info="roleGroupOrInfo" :data="editRoleCont" @resthandel="getRoleTree" />
</div>
</template>
<style lang='scss' scoped>
.roleBox{
display: flex;
width: 100%;
height: calc(100vh - 170px);
padding: 15px 20px 0 20px;
justify-content: space-between;
.roleLeft{
width: 350px;
height: calc(100vh - 185px);
background-color: #FFFFFF;
.butBox{
display: flex;
justify-content: space-between;
padding: 0 10px 10px 10px;
}
.searchBox{
padding: 0 10px 5px 10px;
}
.treeBox{
height: calc(100vh - 330px);
}
}
.roleright{
width: calc(100% - 370px);
height: calc(100vh - 185px);
background-color: #FFFFFF;
overflow: hidden;
:deep .el-tabs__content{
padding: 15px 15px 15px 0px;
}
:deep .el-main{
padding: 0 15px;
}
.userTitleBox{
display: flex;
justify-content: space-between;
padding: 0px 0px 15px 0px;
border-bottom: 1px solid rgba($color: #000000, $alpha: 0.2);
}
.userTitleBoxes{
display: flex;
justify-content: space-between;
}
.pickButBox{
display: flex;
align-items: center;
justify-content: space-between;
}
.scrollBox{
margin-top: 5px;
height: calc(100vh - 320px);
}
}
.tabsTitle{
padding: 0 15px;
}
.tabsTitleCont{
padding: 0 35px;
}
.treeRoleBox{
display: flex;
justify-content: space-between;
width: 100%;
align-items: center;
}
.spanButBox{
span{
padding: 0 5px;
}
}
}
.tree_sapn {
padding: 0 10px 0 0;
}
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
.appListBox {
width: 100%;
li {
padding: 10px 2px;
border-bottom: 1px solid #ececec;
cursor: pointer;
}
li.active {
background-color: #a0cfff;
}
}
.tab_pane_box {
height: calc(100vh - 310px);
overflow: hidden;
overflow-y: auto;
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
}
.row_head{
background-color: #f5f7fa;
color: #000000;
text-align: center;
border: 1px solid #E4E7ED;
}
.roe_col_head{
padding: 5px 5px;
}
.left_right{
border-left: 1px solid #E4E7ED;
border-right: 1px solid #E4E7ED;
border-bottom: 1px solid #E4E7ED;
}
.left_line{
border-right: 1px solid #E4E7ED;
}
.tab_pane_body {
height: calc(100vh - 340px);
overflow: hidden;
overflow-y: auto;
}
.tab_pane_bodyes {
height: calc(100vh - 320px);
overflow: hidden;
overflow-y: auto;
}
.appPickPower{
display: flex;
justify-content: space-between;
align-items: center;
}
.userBox{
width: 100%;
height: 50px;
display: flex;
align-items: center;
justify-items: space-between;
padding: 0 10px;
border-bottom: 1px dashed rgba($color: #000000, $alpha: 0.2);
div{
span{
display: flex;
width: 100%;
padding: 0 5px;
color:rgba($color: #000000, $alpha: 0.6);
}
}
}
</style>

0
src/views/system/monitor/online/index copy.vue → src/views/system/monitor/online/index_20251112.vue

283
src/views/system/monitor/online/page.vue

@ -0,0 +1,283 @@
<!--
@ 作者: 秦东
@ 时间: 2025-10-21 10:06:51
@ 备注: 在线人数
-->
<script lang='ts' setup>
import {
getMyPeoplceAndSunOrg
} from "@/api/system/roleapi/postrole";
import type { LoadFunction } from 'element-plus'
interface Tree {
name: string
leaf?: boolean
}
const props = {
label: 'name',
children: 'zones',
isLeaf: 'isLeaf',
}
let time = 0
const loadNode: LoadFunction<Tree> = (node, resolve, reject) => {
console.log("node============>",node)
console.log("resolve===>",resolve)
if (node.level === 0) {
getMyPeoplceAndSunOrg({id:"313",level:node.level}).then((res) => {
console.log("res================>",res)
resolve(res.data)
})
}
if (node.level > 0){
getMyPeoplceAndSunOrg({id:node.data.id.toString(),level:1}).then((res) => {
console.log("res=========1=======>",res.data)
if(res.data && Array.isArray(res.data) && res.data.length > 0){
resolve(res.data)
}else{
resolve([])
}
}).catch(() => {
return reject()
})
}
// time++
// if (node.level > 0){
// setTimeout(() => {
// if (time > 3) {
// console.log("node.id============>",node.id)
// console.log("node.level============>",node.level)
// getMyPeoplceAndSunOrg({id:node.data.id.toString(),level:1}).then((res) => {
// console.log("res=========1=======>",res.data)
// // resolve(res.data.data?.map((item: any) => ({
// // name: item.orgName,
// // id: item.orgId,
// // isLeaf: item.isLeaf,
// // zones: []
// // })) || [])
// if(res.data && Array.isArray(res.data) && res.data.length > 0){
// resolve(res.data)
// }else{
// resolve([])
// }
// })
// }else{
// return reject()
// }
// }, 3000)
// }
}
//
const pickOrgTree = (data:any) => {
console.log("监测赋权组------->",data)
}
</script>
<template>
<div class="roleBox">
<el-tree
style="max-width: 100%"
:props="props"
:load="loadNode"
:highlight-current="true"
:expand-on-click-node="false"
node-key="id"
lazy
@node-click="pickOrgTree"
/>
</div>
</template>
<style lang='scss' scoped>
.roleBox{
display: flex;
width: 100%;
height: calc(100vh - 170px);
padding: 15px 20px 0 20px;
justify-content: space-between;
.roleLeft{
width: 350px;
height: calc(100vh - 185px);
background-color: #FFFFFF;
.butBox{
display: flex;
justify-content: space-between;
padding: 0 10px 10px 10px;
}
.searchBox{
padding: 0 10px 5px 10px;
}
.treeBox{
height: calc(100vh - 330px);
}
}
.roleright{
width: calc(100% - 370px);
height: calc(100vh - 185px);
background-color: #FFFFFF;
overflow: hidden;
:deep .el-tabs__content{
padding: 15px 15px 15px 0px;
}
:deep .el-main{
padding: 0 15px;
}
.userTitleBox{
display: flex;
justify-content: space-between;
padding: 0px 0px 15px 0px;
border-bottom: 1px solid rgba($color: #000000, $alpha: 0.2);
}
.userTitleBoxes{
display: flex;
justify-content: space-between;
}
.pickButBox{
display: flex;
align-items: center;
justify-content: space-between;
}
.scrollBox{
margin-top: 5px;
height: calc(100vh - 320px);
}
}
.tabsTitle{
padding: 0 15px;
}
.tabsTitleCont{
padding: 0 35px;
}
.treeRoleBox{
display: flex;
justify-content: space-between;
width: 100%;
align-items: center;
}
.spanButBox{
span{
padding: 0 5px;
}
}
}
.tree_sapn {
padding: 0 10px 0 0;
}
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
.appListBox {
width: 100%;
li {
padding: 10px 2px;
border-bottom: 1px solid #ececec;
cursor: pointer;
}
li.active {
background-color: #a0cfff;
}
}
.tab_pane_box {
height: calc(100vh - 310px);
overflow: hidden;
overflow-y: auto;
.table_body {
background-color: #ffffff;
width: 100%;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #cccccc;
padding: 5px;
table {
width: 100%;
td,
th {
border: 0px solid #cccccc;
padding: 0px;
}
}
}
}
}
.row_head{
background-color: #f5f7fa;
color: #000000;
text-align: center;
border: 1px solid #E4E7ED;
}
.roe_col_head{
padding: 5px 5px;
}
.left_right{
border-left: 1px solid #E4E7ED;
border-right: 1px solid #E4E7ED;
border-bottom: 1px solid #E4E7ED;
}
.left_line{
border-right: 1px solid #E4E7ED;
}
.tab_pane_body {
height: calc(100vh - 340px);
overflow: hidden;
overflow-y: auto;
}
.tab_pane_bodyes {
height: calc(100vh - 320px);
overflow: hidden;
overflow-y: auto;
}
.appPickPower{
display: flex;
justify-content: space-between;
align-items: center;
}
.userBox{
width: 100%;
height: 50px;
display: flex;
align-items: center;
justify-items: space-between;
padding: 0 10px;
border-bottom: 1px dashed rgba($color: #000000, $alpha: 0.2);
div{
span{
display: flex;
width: 100%;
padding: 0 5px;
color:rgba($color: #000000, $alpha: 0.6);
}
}
}
</style>

308
src/views/system/monitor/online/roleConfig/setRolePeople.vue

@ -0,0 +1,308 @@
<!--
@ 作者: 秦东
@ 时间: 2025-11-26 10:13:15
@ 备注: 编辑角色使用人
-->
<script lang='ts' setup>
import type { getSystemPower,AppPowerTree,systemList } from "@/api/system/roleapi/types";
import { savePickRoleMan,getPowerPageUser,getRolePeople } from "@/api/system/roleapi/postrole";
import type { TreeInstance } from 'element-plus'
import type {RoleListTree} from '@/api/role/types'
import { Search } from '@element-plus/icons-vue'
import SvgIcon from "@/components/SvgIcon/index.vue";
const squareUrl = ref<string>(
"https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png"
);
const props = defineProps({
show: {
type: Boolean,
default: false
},
org: {
type: Array as () => orgInfo[],
default: () => []
},
roleInfo: {
type: Object as () => RoleListTree,
default: () => ({})
}
})
const userLoading = ref(false)
const emit = defineEmits(['update:show'])
const isShow = computed(() => {
if(props.show){
getPowerPageUserSub()
getPickUser()
}
return props.show
})
const roleInfo = computed(() => {
return props.roleInfo
})
const orgTree = computed(() => {
return props.org
})
const treeBoxHeightOrg = ref(400)
const treeRefOrgUser = ref<TreeInstance>()
const propsOrg = {
value: 'id',
label: 'name',
// disabled:'status',
children: 'child',
}
const userPage = reactive({
page: 1,
pageSize: 20,
orgId: '',
name: '',
total: 0
})
const userPowerList = ref<systemList>({}) //
const userPowerListPick = ref<systemList[]>([]) //
const pickUserKey = ref<string[]>([]) //使key
const searchQuery = ref('') //
//
const onQuePeople = (query: string) => {
console.log(query)
treeRefOrgUser.value!.filter(query)
}
const filterMethodOrg = (query: string, node: any) => {
return node.name!.includes(query)
}
/**
@ 作者: 秦东
@ 时间: 2025-11-26 10:19:05
@ 功能: 关闭弹窗
*/
const closeDialog = () => {
emit('update:show', false)
userPowerList.value =
pickUserKey.value=[]
userPowerListPick.value=[]
}
/**
@ 作者: 秦东
@ 时间: 2025-11-26 16:32:58
@ 功能: 选择行政组织
*/
const pickOrgTree = (node: any) => {
userPage.page = 1
userPage.name = ''
userPage.orgId = node.id
console.log(userPage)
getPowerPageUserSub()
}
const getPowerPageUserSub = () => {
userLoading.value = true
getPowerPageUser(userPage).then(({data})=>{
console.log("获取平台授权项目用户------->",data)
userPowerList.value = data.list
userPage.total = data.total
userLoading.value = false
})
}
const pickName = ref("")
const getPickUser = () => {
getRolePeople({
roleId: roleInfo.value.id*1,
name: pickName.value
}).then(({data})=>{
console.log("获取角色使用人------->",data)
if(data.list && Array.isArray(data.list)){
userPowerListPick.value = data.list
}else{
userPowerListPick.value = []
}
pickUserKey.value = data.userKey
})
}
const pickUserInfo = (item: any) => {
let isPick = true
if(pickUserKey.value.includes(item.id)){
pickUserKey.value = pickUserKey.value.filter((i) => i !== item.id)
isPick = false
}else{
pickUserKey.value.push(item.id)
isPick = true
}
if(isPick){
userPowerListPick.value.push(item)
}else{
userPowerListPick.value = userPowerListPick.value.filter((i) => i.id !== item.id)
}
}
//
const isPick = (item: any) => {
return pickUserKey.value.includes(item.id)
}
//使
const delUserPick = (item: any) => {
pickUserKey.value = pickUserKey.value.filter((i) => i !== item.id)
userPowerListPick.value = userPowerListPick.value.filter((i) => i.id !== item.id)
}
/**
@ 作者: 秦东
@ 时间: 2025-11-27 10:18:29
@ 功能: 保存人员
*/
const saveRolePeople = () => {
console.log("保存角色使用人------->",roleInfo.value.id*1,pickUserKey.value)
savePickRoleMan({
roleId: roleInfo.value.id*1,
userKey: pickUserKey.value
}).then((data)=>{
console.log("保存角色使用人------->",data)
if(data.code === 0){
ElMessage.success("保存成功")
closeDialog()
}else{
ElMessage.error(data.msg || "保存失败")
}
})
}
onMounted(() => {
getPickUser()
})
</script>
<template>
<el-dialog
v-model="isShow"
:title="`编辑<<${roleInfo.label}>>角色使用人`"
width="800"
destroy-on-close
:before-close="closeDialog"
>
<el-row class="dialog-row" :gutter="10">
<el-col :span="8">
<div class="quan">
<div class="searchBox">
<el-input v-model="searchQuery" placeholder="请输入要查找的行政组织" :prefix-icon="Search" @input="onQuePeople" clearable />
</div>
<el-tree-v2
ref="treeRefOrgUser"
style="max-width: 100%;"
:data="orgTree"
:props="propsOrg"
:filter-method="filterMethodOrg"
:height="treeBoxHeightOrg"
:v-loading="roleLoading"
:highlight-current="true"
:check-on-click-node="true"
:expand-on-click-node="false"
@node-click="pickOrgTree"
>
</el-tree-v2>
</div>
</el-col>
<el-col :span="9">
<div class="quan">
<div class="searchBox">
<el-input v-model="userPage.name" placeholder="请输入姓名、工号" :prefix-icon="Search" clearable />
</div>
<el-scrollbar v-loading="userLoading" height="370px">
<div v-for="item in userPowerList" :key="item.id" :class="isPick(item)?'userBox active':'userBox'" @click="pickUserInfo(item)">
<el-avatar shape="square" :size="size" :src="item.icon?item.icon:squareUrl" />
<div class="userInfo">
<el-text type="primary" >{{ item.name }}({{ item.code }})</el-text>
<el-text type="primary" >{{ item.org }}</el-text>
</div>
<div style="width: 40px;">
</div>
</div>
</el-scrollbar>
<div class="paginationBox">
<el-pagination
v-model:current-page="userPage.page"
:page-size="userPage.pageSize"
:pager-count="7"
layout="prev, pager, next"
:total="userPage.total"
@change="getPowerPageUserSub"
/>
</div>
</div>
</el-col>
<el-col :span="7">
<div class="quan">
<div class="searchBox">
<!-- <el-input v-model="pickName" placeholder="请输入姓名、工号" :prefix-icon="Search" clearable /> -->
已经选择的使用人
</div>
<el-scrollbar height="415px">
<div v-for="item in userPowerListPick" :key="item.id" class="userBox" >
<el-avatar shape="square" :size="size" :src="item.icon?item.icon:squareUrl" />
<div class="userInfo">
<el-text type="primary" >{{ item.name }}({{ item.code }})</el-text>
<el-text type="primary" >{{ item.org }}</el-text>
</div>
<div>
<svg-icon icon-class="dels" @click="delUserPick(item)" />
</div>
</div>
</el-scrollbar>
</div>
</el-col>
</el-row>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="saveRolePeople">
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
.dialog-row{
width: 100%;
.quan{
width: 100%;
border: 1px solid #ccc;
overflow: hidden;
}
.searchBox{
padding: 5px 10px 5px 10px;
}
}
.userBox{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 5px 10px;
border-bottom: 1px dashed rgba($color: #000000, $alpha: 0.2);
.userInfo{
width: 60%;
}
div{
span{
display: flex;
width: 100%;
padding: 0 5px;
color:rgba($color: #000000, $alpha: 0.6);
}
}
svg{
cursor: pointer;
color: #FF0000;
}
}
.userBox.active {
background-color: #a0cfff;
}
.paginationBox{
width: 100%;
display: flex;
justify-content: center;
}
</style>

1
src/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue

@ -85,6 +85,7 @@ const submitForm = () => {
// console.log("",appSetupCont) // console.log("",appSetupCont)
appBasicSettings(appSetupCont) appBasicSettings(appSetupCont)
.then(() => { .then(() => {
// eslint-disable-next-line vue/no-mutating-props
props.appCont.appName = appSetupCont.title; props.appCont.appName = appSetupCont.title;
props.appCont.appSvg = appSetupCont.appSvg; props.appCont.appSvg = appSetupCont.appSvg;
props.appCont.describe = appSetupCont.appdescribe; props.appCont.describe = appSetupCont.appdescribe;

248
src/views/taskplatform/taskmanagement/edittaskcustomerform.vue

@ -1,248 +0,0 @@
<!--
@ 作者: 秦东
@ 时间: 2023-09-26 09:12:55
@ 备注: 编辑自定义表单数据
-->
<script lang='ts' setup>
import { ref, reactive, onMounted, computed, nextTick } from 'vue'
import { useRouter } from 'vue-router'
import {
string2json,
stringToObj
} from '@/utils/DesignForm/form'
import { haveCustomerFormVersion } from '@/api/taskapi/management'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import '@/assets/scss/element-var.scss'
import '@/assets/scss/index.scss'
import '@/assets/iconfont/iconfont.css'
import 'element-plus/dist/index.css'
const props = defineProps({
iseditopen:{
type:Boolean,
default:true
},
versionid:{
type:String,
default:""
},
versiontitle:{
type:String,
default:""
},
masterskey:{
type:String,
default:""
},
infoid:{
type:String,
default:""
},
drawerwith:{
type:Number,
default:0
}
})
const submitButton = {
type: "div",
control:{},
config:{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:{
label: "保存",
type: "primary",
key: "submit"
},
config:{
textAlign: "center"
}
}
]
}
const cancelButton = {
type: "div",
control:{},
config:{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:{
label: "返回",
type: "danger",
key: "cancel"
},
config:{
textAlign: "center"
}
}
]
}
const submitAndCancelButton = {
type: "div",
control:{},
config:{
span: 24,
textAlign: "center"
},
list: [
{
type: "button",
control:{
label: "保存",
type: "primary",
key: "submit"
},
config:{
span: 0
}
},
{
type: "button",
control:{
label: "返回",
type: "danger",
key: "cancel"
},
config:{
span: 0
}
}
]
};
const loadingData = ref(false)
const formEl = ref()
const state = reactive<any>({
type: 1, // 123 4 5
formData: {
list: [],
form: {},
config: {}
},
dict: {},
formId: props.versionid,
id: props.masterskey,
loading: true
})
const formType = computed(() => {
// id
if (props.infoid) {
return 2
} else {
return 1
}
})
const emits = defineEmits(["update:iseditopen","searchquery"]);
const isShow = computed({
get: () => props.iseditopen,
set: (val) => {
emits("update:iseditopen", val);
},
});
//
const getTaskFormData = () =>{
loadingData.value = true;
haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{
// console.log("",data)
state.id=props.versionid
state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict)
judgeSubmitCancel({"name":data.mastesformjson})
.then((data:any) =>{
if(data.code == 0){
if (data.data == 3 || data.data == 4){
state.formData.list.push(submitButton)
}
}
})
})
.finally(()=>{
formEl.value.getData({ formId: props.versionid, id: props.masterskey})
loadingData.value = false;
})
}
const drawerWith = ref<number>(0);
onMounted(()=>{
drawerWith.value = window.innerWidth - 220
});
window.addEventListener("resize", function(){
drawerWith.value = window.innerWidth -220
})
const beforeSubmit = (params: any) => {
params.formId = props.masterskey
params.id = props.versionid
// emits("update:isopen", false);
// console.log(params,"===========================>")
return params
}
const afterSubmit = (type: string) => {
if (type === 'success') {
// router.go(-1)
// console.log("")
emits("searchquery");
closeAppSubmit();
}
}
const closeAppSubmit = () => {
emits("update:iseditopen", false);
initData();
}
const initData = () => {
state.formData = {
list: [],
form: {},
config: {}
};
state.dict = {};
state.formId = 0;
state.id = 0;
state.loading = true;
}
watch(()=>props.iseditopen,()=>{
if(props.iseditopen){
getTaskFormData();
}else{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
</script>
<template>
<el-drawer v-model="isShow" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<div class="drawerBody">
<ak-form
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
</style>

3
src/views/taskplatform/taskmanagement/flowStep.vue

@ -141,7 +141,6 @@ const updateNode = (val:any) =>{
</el-tooltip> </el-tooltip>
</template> </template>
<template #description> <template #description>
<table> <table>
<tr v-for="items in item.operator" :key="items.id"> <tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50"> <td valign="top" align="center" width="50">
@ -187,7 +186,7 @@ const updateNode = (val:any) =>{
</template> </template>
</el-step> </el-step>
</el-steps> </el-steps>
{{ openOrClose }}======={{ openclosebox }}
<OrgUserPage v-if="openOrClose" v-model:openclose="openOrClose" :preset-personnel="presetPersonnel" :selected-people="selectedPeople" @update-node="updateNode" /> <OrgUserPage v-if="openOrClose" v-model:openclose="openOrClose" :preset-personnel="presetPersonnel" :selected-people="selectedPeople" @update-node="updateNode" />
<OrgAllUserPage v-if="openclosebox" v-model:openclosebox="openclosebox" :selected-people="selectedPeople" @update-node="updateNode" /> <OrgAllUserPage v-if="openclosebox" v-model:openclosebox="openclosebox" :selected-people="selectedPeople" @update-node="updateNode" />
</div> </div>

215
vite.config.ts.timestamp-1762732876054-97f8b5f7ef739.mjs

File diff suppressed because one or more lines are too long

215
vite.config.ts.timestamp-1763685117626-b9e83b063ec3.mjs

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save