diff --git a/src/api/system/employee.js b/src/api/permission/employee.js
similarity index 100%
rename from src/api/system/employee.js
rename to src/api/permission/employee.js
diff --git a/src/api/permission/role.js b/src/api/permission/role.js
new file mode 100644
index 0000000..9d839a8
--- /dev/null
+++ b/src/api/permission/role.js
@@ -0,0 +1,42 @@
+import request from '@/utils/request.js';
+export const search = (params) => {
+ return request({
+ url: '/uc/role',
+ method: 'get',
+ params,
+ });
+};
+export const detail = (id) => {
+ return request({
+ url: '/uc/role/' + id,
+ method: 'get',
+ });
+};
+export const create = (data) => {
+ return request({
+ url: '/uc/role',
+ method: 'post',
+ data,
+ });
+};
+export const update = (data) => {
+ return request({
+ url: '/uc/role/' + data.id,
+ method: 'put',
+ data,
+ });
+};
+export const updateMenu = (data) => {
+ return request({
+ url: '/uc/role/menu',
+ method: 'put',
+ data,
+ });
+};
+export const remove = (idList) => {
+ return request({
+ url: '/uc/role',
+ method: 'delete',
+ params: { idList },
+ });
+};
diff --git a/src/router/modules/permission.js b/src/router/modules/permission.js
index 9a7c670..1ccbecf 100644
--- a/src/router/modules/permission.js
+++ b/src/router/modules/permission.js
@@ -27,6 +27,15 @@ export default [
icon: 'menu-2',
},
},
+ {
+ path: 'role',
+ name: 'RoleManagement',
+ component: () => import('@/views/permission/role/index.vue'),
+ meta: {
+ title: '角色管理',
+ icon: 'account-box-fill',
+ },
+ },
{
path: 'employee',
name: 'EmployeeManagement',
diff --git a/src/store/modules/permission/employee/employee.js b/src/store/modules/permission/employee/employee.js
index 4ab7c91..693f822 100644
--- a/src/store/modules/permission/employee/employee.js
+++ b/src/store/modules/permission/employee/employee.js
@@ -1,5 +1,5 @@
import * as deptAPI from '@/api/permission/dept.js';
-import * as api from '@/api/system/employee.js';
+import * as api from '@/api/permission/employee.js';
import { ElMessage, ElMessageBox } from '@/plugins/element-plus';
const state = () => ({
code: 'EmployeeManagement',
diff --git a/src/store/modules/permission/role/role.js b/src/store/modules/permission/role/role.js
new file mode 100644
index 0000000..69816a6
--- /dev/null
+++ b/src/store/modules/permission/role/role.js
@@ -0,0 +1,115 @@
+import * as featureAPI from '@/api/permission/feature.js';
+import * as menuAPI from '@/api/permission/menu.js';
+import * as api from '@/api/permission/role.js';
+import * as systemAPI from '@/api/permission/system.js';
+import { ElMessage, ElMessageBox } from '@/plugins/element-plus';
+const state = () => ({
+ code: 'RoleManagement',
+ condition: {},
+ list: [],
+ total: 0,
+ opts: {
+ init: false,
+ system: [],
+ status: [
+ {
+ label: '启用',
+ value: true,
+ },
+ {
+ label: '禁用',
+ value: false,
+ },
+ ],
+ },
+});
+const getters = {};
+const mutations = {
+ setCode: (state, data) => (state.code = data),
+ setCondition: (state, data) => (state.condition = data),
+ setList: (state, data) => (state.list = data),
+ setTotal: (state, data) => (state.total = data),
+ setOpts: (state, data) => (state.opts = data),
+};
+const actions = {
+ search: async ({ state, commit, rootGetters }) => {
+ let res = await api.search({ ...rootGetters['local/page'](state.code), ...state.condition });
+ commit('setList', res?.records || []);
+ commit('setTotal', res?.total || 0);
+ if (!res) {
+ ElMessage.error('查询失败');
+ }
+ return res;
+ },
+ load: async ({ state, commit }) => {
+ commit('setOpts', {
+ ...state.opts,
+ init: true,
+ system: await systemAPI.search(),
+ });
+ },
+ loadMenu: async (context, systemId) => {
+ return await menuAPI.search({ systemId });
+ },
+ loadPermission: async (context, menuId) => {
+ return await featureAPI.search({ menuId });
+ },
+ updateMenu: async (context, data) => {
+ let res = await api.updateMenu(data);
+ if (!res) {
+ ElMessage.error('保存菜单权限失败');
+ }
+ return res;
+ },
+ detail: async (context, id) => {
+ let res = await api.detail(id);
+ if (!res) {
+ ElMessage.error('加载详情失败');
+ }
+ return res;
+ },
+ save: async ({ dispatch }, data) => {
+ let save = data.id ? api.update : api.create;
+ let res = await save(data);
+ if (res) {
+ ElMessage.success('保存成功');
+ dispatch('search');
+ } else {
+ ElMessage.error('保存失败');
+ }
+ return res;
+ },
+ remove: async ({ dispatch }, idList) => {
+ if (!idList.length) {
+ ElMessage.warning('请选择要删除的数据');
+ } else {
+ try {
+ await ElMessageBox.confirm('数据删除后无法恢复,确定要删除吗?', '危险操作');
+ let res = await api.remove(idList.join(','));
+ if (res) {
+ ElMessage.success('删除成功');
+ dispatch('search');
+ } else {
+ ElMessage.error('删除失败');
+ }
+ } catch (e) {
+ console.info('取消删除', e);
+ }
+ }
+ },
+ enable: async ({ dispatch }, data) => {
+ let res = await api.update(data);
+ if (res) {
+ ElMessage.success((data.isEnable ? '启用' : '禁用') + '成功');
+ dispatch('search');
+ } else {
+ ElMessage.error((data.isEnable ? '启用' : '禁用') + '失败');
+ }
+ },
+};
+export default {
+ state,
+ getters,
+ mutations,
+ actions,
+};
diff --git a/src/views/permission/employee/index.vue b/src/views/permission/employee/index.vue
index 2ae9a21..8433da5 100644
--- a/src/views/permission/employee/index.vue
+++ b/src/views/permission/employee/index.vue
@@ -44,7 +44,7 @@
+
+
diff --git a/src/views/system/customer/index.vue b/src/views/system/customer/index.vue
index 90e390d..b13447d 100644
--- a/src/views/system/customer/index.vue
+++ b/src/views/system/customer/index.vue
@@ -33,7 +33,7 @@