This commit is contained in:
李想 2025-04-08 15:49:24 +08:00
commit bdc26e94ee
10 changed files with 709 additions and 15 deletions

View File

@ -1,11 +1,11 @@
# 正式环境
VITE_APP_NAME = 'daimp-front-main'
VITE_APP_TITLE = '数字农业产业管理平台'
VITE_APP_SUB_OS = '//http://47.109.205.240:88/sub-operation-service/'
VITE_APP_SUB_OA = '//http://47.109.205.240:88/sub-operation-admin/'
VITE_APP_SUB_GAS = '//http://47.109.205.240:88/sub-government-affairs-service/'
VITE_APP_SUB_GAA = '//http://47.109.205.240:88/sub-government-affairs-admin/'
VITE_APP_SUB_GSS = '//http://47.109.205.240:88/sub-government-screen-service/'
VITE_APP_SUB_OS = '//47.109.205.240:80/sub-operation-service/'
VITE_APP_SUB_OA = '//47.109.205.240:80/sub-operation-admin/'
VITE_APP_SUB_GAS = '//47.109.205.240:80/sub-government-affairs-service/'
VITE_APP_SUB_GAA = '//47.109.205.240:80/sub-government-affairs-admin/'
VITE_APP_SUB_GSS = '//47.109.205.240:80/sub-government-screen-service/'
# 接口
VITE_APP_BASE_API = '/apis'
VITE_APP_BASE_URL = ''

View File

@ -1,7 +1,7 @@
# 生产环境
VITE_MODE = 'PRO'
VITE_APP_MIAN = 'daimp-front-main'
VITE_APP_MIAN_URL = 'http://47.109.205.240:88'
VITE_APP_MIAN_URL = 'http://47.109.205.240:80'
VITE_APP_NAME = 'sub-government-affairs-service'
# 接口
VITE_APP_BASE_API = '/apis'

View File

@ -0,0 +1,49 @@
import request from '@/utils/axios';
/**
* @Title: 查询角色已授权用户列表
*/
export function AuthUserList(params = {}) {
return request('/system/role/authUser/allocatedList', {
method: 'GET',
params,
});
}
/**
* @Title: 查询角色未授权用户列表
*/
export function UnAuthUserList(params = {}) {
return request('/system/role/authUser/unallocatedList', {
method: 'GET',
params,
});
}
// 取消用户授权角色
export function AuthUserCancel(data) {
return request('/system/role/authUser/cancel', {
method: 'PUT',
data,
});
}
/**
* @Title: 批量取消用户授权角色
*/
export function AuthUserCancelAll(params = {}) {
return request('/system/role/authUser/cancelAll', {
method: 'PUT',
params,
});
}
/**
* @Title: 授权用户选择
*/
export function AuthUserSelectAll(params = {}) {
return request('/system/role/authUser/selectAll', {
method: 'PUT',
params,
});
}

View File

@ -0,0 +1,78 @@
import request from '@/utils/axios';
/**
* @Title: 列表
*/
export function GetEntityList(params = {}) {
return request('/system/role/list', {
method: 'GET',
params,
});
}
/**
* @Title: 新增
*/
export function AddEntity(data = {}) {
return request('/system/role', {
method: 'POST',
data,
});
}
/**
* @Title: 修改
*/
export function UpdateEntity(data = {}) {
return request('/system/role', {
method: 'PUT',
data,
});
}
/**
* @Title: 删除
*/
export function DeleteEntity(params = {}) {
return request(`/system/role/${params.id}`, {
method: 'DELETE',
});
}
/**
* @Title: 角色状态修改
*/
export function UpdateStatus(data = {}) {
return request('/system/role/changeStatus', {
method: 'PUT',
data,
});
}
/**
* @Title: 查询角色详细
*/
export function GetRole(roleId) {
return request(`/system/role/${roleId}`, {
method: 'GET',
});
}
/**
* @Title: 根据角色ID查询部门树结构
*/
export function GetRoleDept(roleId) {
return request(`/system/role/deptTree/${roleId}`, {
method: 'GET',
});
}
/**
* @Title: 角色菜单权限
*/
export function UpdateDataScope(data = {}) {
return request('/system/role/dataScope', {
method: 'PUT',
data,
});
}

View File

@ -0,0 +1 @@
import request from '@/utils/axios';

View File

@ -20,18 +20,18 @@ export default [
name: 'system-dict',
meta: { title: '字典管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/system-role',
component: () => import('@/views/system/role/index.vue'),
name: 'system-role',
meta: { title: '角色管理', icon: 'Document' },
},
{
path: '/sub-government-affairs-service/system-menu',
component: () => import('@/views/system/menu/index.vue'),
name: 'system-menu',
meta: { title: '菜单管理', icon: 'Document' },
},
// {
// path: '/sub-government-affairs-service/system-dept',
// component: () => import('@/views/system/dept/index.vue'),
// name: 'system-dept',
// meta: { title: '部门管理', icon: 'Document' },
// },
],
},
];

View File

@ -35,7 +35,7 @@ import { CRUD_OPTIONS } from '@/config';
import { isEmpty, downloadFile } from '@/utils';
import { useUserStore } from '@/store/modules/user';
import { compact } from 'lodash';
import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity, ExportEntity } from '@/apis/grid';
import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity, ExportEntity } from '@/apis/resource/grid';
const { VITE_APP_BASE_API } = import.meta.env;
const app = useApp();

View File

@ -0,0 +1,566 @@
<template>
<div class="custom-page">
<avue-crud
ref="crudRef"
v-model:search="state.query"
v-model:page="state.pageData"
:table-loading="state.loading"
:data="state.data"
:option="state.options"
@refresh-change="refreshChange"
@search-reset="searchChange"
@search-change="searchChange"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@row-save="rowSave"
@row-update="rowUpdate"
@row-del="rowDel"
>
<template #status="{ row }">
<el-tag v-if="row.status == 0" type="success">启用</el-tag>
<el-tag v-if="row.status == 1" type="danger">禁用</el-tag>
</template>
<template #menuCheckStrictly-form="{ column, value, type }">
<el-checkbox v-model="state.menuExpand" @change="onCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
<el-checkbox v-model="state.menuNodeAll" @change="onCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
<el-checkbox v-model="menuCheckStrictly" @change="onCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
<el-tree
ref="menuRef"
class="tree-border"
show-checkbox
node-key="id"
empty-text="加载中,请稍候"
:data="state.menuOptions"
:check-strictly="!menuCheckStrictly"
:props="state.defaultProps"
></el-tree>
</template>
<template #menu="scope">
<custom-table-operate :show="scope.row.roleId !== 1" :actions="state.options.actions" :data="scope" />
</template>
</avue-crud>
<el-dialog
v-model="state.visible"
draggable
append-to-body
title="分配数据权限"
class="avue-dialog"
:close-on-click-modal="false"
:close-on-press-escape="false"
@close="state.visible = false"
>
<avue-form ref="formRef" v-model="state.form" :option="state.formOptions">
<template #deptCheckStrictly="{ column, value, type }">
<el-checkbox v-model="state.deptExpand" @change="onCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
<el-checkbox v-model="state.deptNodeAll" @change="onCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
<el-checkbox v-model="state.form.deptCheckStrictly" @change="onCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
<el-tree
ref="deptRef"
class="tree-border"
show-checkbox
node-key="id"
empty-text="加载中,请稍候"
:data="state.deptOptions"
:check-strictly="!state.form.deptCheckStrictly"
:props="state.defaultProps"
></el-tree>
</template>
</avue-form>
<div class="avue-dialog__footer avue-dialog__footer--right">
<el-button type="primary" icon="CircleCheck" @click="rowScopeSave"> </el-button>
<el-button icon="CircleClose" @click="state.visible = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script setup>
import { computed, onMounted, reactive, ref, nextTick, watch } from 'vue';
import { useRouter } from 'vue-router';
import { useApp } from '@/hooks';
import { CRUD_OPTIONS } from '@/config';
import { isEmpty } from '@/utils';
import { GetEntityList, AddEntity, UpdateEntity, DeleteEntity, UpdateStatus, GetRoleDept, UpdateDataScope } from '@/apis/system/role';
import { GetMenuTree, GetRoleMenu } from '@/apis/system/menu';
const app = useApp();
const router = useRouter();
const crudRef = ref(null);
const menuRef = ref(null);
const formRef = ref(null);
const deptRef = ref(null);
const state = reactive({
loading: false,
query: {
current: 1,
size: 10,
},
selection: [],
options: {
...CRUD_OPTIONS,
selection: false,
column: [
{
label: '角色名称',
prop: 'roleName',
search: true,
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '权限字符',
prop: 'roleKey',
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '状态',
prop: 'status',
type: 'select',
search: true,
dicData: [
{
label: '启用',
value: '0',
},
{
label: '禁用',
value: '1',
},
],
value: '0',
rules: {
required: true,
message: '请选择',
trigger: 'blur',
},
},
{
label: '排序',
prop: 'roleSort',
type: 'number',
rules: {
required: true,
message: '请输入',
trigger: 'blur',
},
},
{
label: '菜单权限',
prop: 'menuCheckStrictly',
hide: true,
formSlot: true,
viewDisplay: false,
span: 24,
},
{
label: '备注',
prop: 'remark',
type: 'textarea',
span: 24,
rows: 4,
overHidden: true,
width: 200,
},
],
actions: [
{
name: '查看',
icon: 'view',
event: ({ row }) => rowView(row),
},
{
name: '编辑',
icon: 'edit',
event: ({ row }) => rowEdit(row),
},
{
type: 'primary',
name: ({ row }) => {
return row.status == 0 ? '禁用' : '启用';
},
icon: ({ row }) => {
return row.status == 0 ? 'turnOff' : 'open';
},
event: ({ row }) => rowStatus(row),
},
{
name: '数据权限',
icon: 'lock',
event: ({ row }) => rowScope(row),
},
{
name: '分配用户',
icon: 'user',
event: ({ row }) => rowUser(row),
},
{
type: 'danger',
name: '删除',
icon: 'delete',
event: ({ row }) => rowDel(row),
},
],
},
pageData: {
total: 0,
currentPage: 1,
pageSize: 10,
},
data: [],
menuExpand: false,
menuNodeAll: false,
menuOptions: [],
deptExpand: true,
deptNodeAll: false,
deptOptions: [],
defaultProps: {
children: 'children',
label: 'label',
},
visible: false,
form: {},
formOptions: {
column: [
{
label: '角色名称',
prop: 'roleName',
disabled: true,
},
{
label: '权限字符',
prop: 'roleKey',
disabled: true,
},
{
label: '权限字符',
prop: 'dataScope',
type: 'select',
dicData: [
{
value: '1',
label: '全部数据权限',
},
{
value: '2',
label: '自定数据权限',
},
{
value: '3',
label: '本部门数据权限',
},
{
value: '4',
label: '本部门及以下数据权限',
},
{
value: '5',
label: '仅本人数据权限',
},
],
},
{
label: '数据权限',
prop: 'deptCheckStrictly',
span: 24,
},
],
submitBtn: false,
emptyBtn: false,
},
});
const menuCheckStrictly = computed(() => crudRef.value.tableForm.menuCheckStrictly);
//
const loadData = () => {
state.loading = true;
GetEntityList(state.query)
.then((res) => {
if (res.code === 200) {
const { current, size, total, records } = res.data;
state.data = records;
state.pageData = {
currentPage: current || 1,
pageSize: size || 10,
total: total,
};
}
})
.catch((err) => {
app.$message.error(err.msg);
state.data = [];
})
.finally(() => {
state.loading = false;
});
};
loadData();
const getMenu = () => {
GetMenuTree().then((res) => {
if (res.code === 200) {
state.menuOptions = res.data;
}
});
};
onMounted(() => {
getMenu();
});
//
const currentChange = (current) => {
state.query.current = current;
loadData();
};
//
const sizeChange = (size) => {
state.query.size = size;
loadData();
};
//
const searchChange = (params, done) => {
if (done) done();
state.query = params;
state.query.current = 1;
loadData();
};
//
const refreshChange = () => {
loadData();
app.$message.success('刷新成功');
};
//
const selectionChange = (rows) => {
state.selection = rows;
};
//
const rowView = (row) => {
crudRef.value.rowView(row);
};
//
const rowStatus = (row) => {
let status = row.status == 1 ? 0 : 1;
UpdateStatus({ roleId: row.roleId, status })
.then((res) => {
if (res.code === 200) {
app.$message.success('状态更改成功!');
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
});
};
// /
const onCheckedTreeExpand = (value, type) => {
if (type == 'menu') {
const treeList = state.menuOptions;
for (let i = 0; i < treeList.length; i++) {
menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
}
} else if (type == 'dept') {
const treeList = state.deptOptions;
for (let i = 0; i < treeList.length; i++) {
deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
}
}
};
// /
const onCheckedTreeNodeAll = (value, type) => {
if (type == 'menu') {
menuRef.value.setCheckedNodes(value ? state.menuOptions : []);
} else if (type == 'dept') {
deptRef.value.setCheckedNodes(value ? state.deptOptions : []);
}
};
//
const onCheckedTreeConnect = (value, type) => {
if (type == 'menu') {
crudRef.value.tableForm.menuCheckStrictly = value ? true : false;
} else if (type == 'dept') {
state.form.deptCheckStrictly = value ? true : false;
}
};
//
const getMenuAllCheckedKeys = () => {
let checkedKeys = menuRef.value.getCheckedKeys();
let halfCheckedKeys = menuRef.value.getHalfCheckedKeys();
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
return checkedKeys;
};
//
const getDeptAllCheckedKeys = () => {
let checkedKeys = deptRef.value.getCheckedKeys();
let halfCheckedKeys = deptRef.value.getHalfCheckedKeys();
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
return checkedKeys;
};
// ID
const getRoleMenuTreeselect = (roleId) => {
return GetRoleMenu(roleId).then((res) => {
state.menuOptions = res.menus;
return res;
});
};
// ID
const getRoleDeptTreeselect = (roleId) => {
return GetRoleDept(roleId).then((res) => {
state.deptOptions = res.depts;
return res;
});
};
//
watch(
() => state.form.dataScope,
(val) => {
state.formOptions.column[3].display = val === '2' ? true : false;
}
);
//
const rowScope = async (row) => {
const roleDept = getRoleDeptTreeselect(row.roleId);
state.form = { ...row };
state.visible = true;
nextTick(() => {
roleDept.then((res) => {
deptRef.value && deptRef.value.setCheckedKeys(res.checkedKeys);
});
});
};
const rowScopeSave = () => {
if (state.form?.roleId) {
state.form.deptIds = getDeptAllCheckedKeys();
UpdateDataScope(state.form)
.then((res) => {
if (res.code === 200) {
app.$message.success('更新成功!');
state.visible = false;
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
});
}
};
//
const rowUser = (row) => {
// router.push({
// path: '/sub-government-affairs-service/system-auth-user',
// query: { id: row.roleId },
// });
};
//
const rowSave = (row, done, loading) => {
row.menuIds = getMenuAllCheckedKeys();
AddEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('添加成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowEdit = (row) => {
const roleMenu = getRoleMenuTreeselect(row.roleId);
nextTick(() => {
roleMenu.then((res) => {
const checkedKeys = res.checkedKeys;
checkedKeys.forEach((v) => {
nextTick(() => {
menuRef.value.setChecked(v, true, false);
});
});
});
});
crudRef.value.rowEdit(row);
};
const rowUpdate = (row, index, done, loading) => {
row.menuIds = getMenuAllCheckedKeys();
UpdateEntity(row)
.then((res) => {
if (res.code === 200) {
app.$message.success('更新成功!');
done();
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
})
.finally(() => {
loading();
});
};
//
const rowDel = (row, index, done) => {
if (isEmpty(row)) return;
app
.$confirm(`删除后信息将不可查看,确认要删除吗?`, '确定删除', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
DeleteEntity({ id: row.roleId })
.then((res) => {
if (res.code === 200) {
app.$message.success('删除成功!');
loadData();
}
})
.catch((err) => {
app.$message.error(err.msg);
});
})
.catch(() => {});
};
</script>
<style lang="scss" scoped>
.tree-border {
margin-top: 5px;
border: 1px solid #e5e6e7;
min-height: 200px;
background: #ffffff none;
border-radius: 4px;
}
</style>

View File

@ -1,6 +1,6 @@
# 生产环境
VITE_APP_MIAN = 'daimp-front-main'
VITE_APP_MIAN_URL = 'http://47.109.205.240:88'
VITE_APP_MIAN_URL = 'http://47.109.205.240:80'
VITE_APP_NAME = 'sub-government-screen-service'
# 接口
VITE_APP_BASE_API = '/apis'

View File

@ -1,6 +1,6 @@
# 生产环境
VITE_APP_MIAN = 'daimp-front-main'
VITE_APP_MIAN_URL = 'http://47.109.205.240:88'
VITE_APP_MIAN_URL = 'http://47.109.205.240:80'
VITE_APP_NAME = 'sub-operation-service'
# 接口
VITE_APP_BASE_API = '/apis'