@befly-addon/admin 1.1.30 → 1.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/apis/admin/cacheRefresh.ts +29 -21
  2. package/apis/admin/del.ts +10 -10
  3. package/apis/admin/detail.ts +7 -7
  4. package/apis/admin/ins.ts +11 -11
  5. package/apis/admin/list.ts +10 -10
  6. package/apis/admin/upd.ts +14 -14
  7. package/apis/api/all.ts +8 -8
  8. package/apis/api/list.ts +10 -10
  9. package/apis/auth/login.ts +43 -43
  10. package/apis/auth/sendSmsCode.ts +6 -6
  11. package/apis/dashboard/configStatus.ts +18 -18
  12. package/apis/dashboard/environmentInfo.ts +12 -12
  13. package/apis/dashboard/performanceMetrics.ts +5 -5
  14. package/apis/dashboard/permissionStats.ts +7 -7
  15. package/apis/dashboard/serviceStatus.ts +29 -29
  16. package/apis/dashboard/systemInfo.ts +5 -5
  17. package/apis/dashboard/systemOverview.ts +7 -7
  18. package/apis/dashboard/systemResources.ts +8 -8
  19. package/apis/dict/all.ts +16 -16
  20. package/apis/dict/del.ts +6 -6
  21. package/apis/dict/detail.ts +19 -19
  22. package/apis/dict/ins.ts +9 -9
  23. package/apis/dict/items.ts +8 -8
  24. package/apis/dict/list.ts +22 -22
  25. package/apis/dict/upd.ts +11 -11
  26. package/apis/dictType/all.ts +5 -5
  27. package/apis/dictType/del.ts +8 -8
  28. package/apis/dictType/detail.ts +6 -6
  29. package/apis/dictType/ins.ts +7 -7
  30. package/apis/dictType/list.ts +8 -10
  31. package/apis/dictType/upd.ts +8 -8
  32. package/apis/email/config.ts +4 -4
  33. package/apis/email/logList.ts +8 -8
  34. package/apis/email/send.ts +18 -18
  35. package/apis/email/verify.ts +5 -5
  36. package/apis/loginLog/list.ts +8 -8
  37. package/apis/menu/all.ts +16 -18
  38. package/apis/menu/list.ts +12 -12
  39. package/apis/operateLog/list.ts +8 -8
  40. package/apis/role/all.ts +7 -7
  41. package/apis/role/apiSave.ts +10 -13
  42. package/apis/role/apis.ts +7 -12
  43. package/apis/role/del.ts +14 -14
  44. package/apis/role/detail.ts +6 -6
  45. package/apis/role/ins.ts +10 -10
  46. package/apis/role/list.ts +11 -11
  47. package/apis/role/menuSave.ts +8 -11
  48. package/apis/role/menus.ts +7 -12
  49. package/apis/role/save.ts +12 -12
  50. package/apis/role/upd.ts +10 -10
  51. package/apis/sysConfig/all.ts +5 -5
  52. package/apis/sysConfig/del.ts +9 -9
  53. package/apis/sysConfig/get.ts +9 -9
  54. package/apis/sysConfig/ins.ts +11 -11
  55. package/apis/sysConfig/list.ts +9 -9
  56. package/apis/sysConfig/upd.ts +10 -10
  57. package/libs/emailHelper.ts +7 -7
  58. package/package.json +46 -34
  59. package/plugins/email.ts +9 -9
  60. package/tables/role.json +4 -2
  61. package/views/403_1/index.vue +19 -3
  62. package/views/config/dict/components/edit.vue +26 -28
  63. package/views/config/dict/index.vue +88 -52
  64. package/views/config/dictType/components/edit.vue +22 -23
  65. package/views/config/dictType/index.vue +82 -46
  66. package/views/config/index.vue +12 -0
  67. package/views/config/system/components/edit.vue +36 -36
  68. package/views/config/system/index.vue +79 -50
  69. package/views/index/components/addonList.vue +3 -3
  70. package/views/index/components/environmentInfo.vue +10 -10
  71. package/views/index/components/operationLogs.vue +10 -10
  72. package/views/index/components/performanceMetrics.vue +8 -8
  73. package/views/index/components/quickActions.vue +3 -3
  74. package/views/index/components/serviceStatus.vue +19 -19
  75. package/views/index/components/systemNotifications.vue +12 -12
  76. package/views/index/components/systemOverview.vue +7 -7
  77. package/views/index/components/systemResources.vue +11 -11
  78. package/views/index/components/userInfo.vue +20 -19
  79. package/views/index/index.vue +12 -5
  80. package/views/log/email/index.vue +58 -51
  81. package/views/log/index.vue +12 -0
  82. package/views/log/login/index.vue +45 -38
  83. package/views/log/operate/index.vue +55 -48
  84. package/views/login_1/index.vue +25 -18
  85. package/views/people/admin/components/edit.vue +25 -26
  86. package/views/people/admin/index.vue +76 -40
  87. package/views/people/index.vue +12 -0
  88. package/views/permission/api/index.vue +21 -15
  89. package/views/permission/index.vue +12 -0
  90. package/views/permission/menu/index.vue +31 -16
  91. package/views/permission/role/components/api.vue +21 -21
  92. package/views/permission/role/components/edit.vue +18 -18
  93. package/views/permission/role/components/menu.vue +14 -16
  94. package/views/permission/role/index.vue +84 -49
  95. package/views/403_1/meta.json +0 -4
  96. package/views/config/dict/meta.json +0 -4
  97. package/views/config/dictType/meta.json +0 -4
  98. package/views/config/meta.json +0 -4
  99. package/views/config/system/meta.json +0 -4
  100. package/views/index/meta.json +0 -4
  101. package/views/log/email/meta.json +0 -4
  102. package/views/log/login/meta.json +0 -4
  103. package/views/log/meta.json +0 -4
  104. package/views/log/operate/meta.json +0 -4
  105. package/views/login_1/meta.json +0 -4
  106. package/views/people/admin/meta.json +0 -4
  107. package/views/people/meta.json +0 -4
  108. package/views/permission/api/meta.json +0 -4
  109. package/views/permission/menu/meta.json +0 -4
  110. package/views/permission/meta.json +0 -4
  111. package/views/permission/role/meta.json +0 -4
@@ -41,9 +41,9 @@ import {
41
41
  Radio as TRadio,
42
42
  Button as TButton,
43
43
  MessagePlugin
44
- } from 'tdesign-vue-next';
45
- import { fieldClear } from 'befly-shared/fieldClear';
46
- import { $Http } from '@/plugins/http';
44
+ } from "tdesign-vue-next";
45
+ import { fieldClear } from "befly-vite/utils/fieldClear";
46
+ import { $Http } from "@/plugins/http";
47
47
 
48
48
  const $Prop = defineProps({
49
49
  modelValue: {
@@ -52,7 +52,7 @@ const $Prop = defineProps({
52
52
  },
53
53
  actionType: {
54
54
  type: String,
55
- default: 'add'
55
+ default: "add"
56
56
  },
57
57
  rowData: {
58
58
  type: Object,
@@ -60,7 +60,7 @@ const $Prop = defineProps({
60
60
  }
61
61
  });
62
62
 
63
- const $Emit = defineEmits(['update:modelValue', 'success']);
63
+ const $Emit = defineEmits(["update:modelValue", "success"]);
64
64
 
65
65
  // 表单引用
66
66
  const $From = $shallowRef({
@@ -74,9 +74,9 @@ const $Data = $ref({
74
74
  submitting: false,
75
75
  formData: {
76
76
  id: 0,
77
- name: '',
78
- code: '',
79
- description: '',
77
+ name: "",
78
+ code: "",
79
+ description: "",
80
80
  sort: 0,
81
81
  state: 1
82
82
  }
@@ -84,19 +84,19 @@ const $Data = $ref({
84
84
 
85
85
  const $Data2 = $shallowRef({
86
86
  formRules: {
87
- name: [{ required: true, message: '请输入角色名称', trigger: 'blur' }],
87
+ name: [{ required: true, message: "请输入角色名称", trigger: "blur" }],
88
88
  code: [
89
- { required: true, message: '请输入角色代码', trigger: 'blur' },
90
- { pattern: /^[a-zA-Z0-9_]+$/, message: '角色代码只能包含字母、数字和下划线', trigger: 'blur' }
89
+ { required: true, message: "请输入角色代码", trigger: "blur" },
90
+ { pattern: /^[a-zA-Z0-9_]+$/, message: "角色代码只能包含字母、数字和下划线", trigger: "blur" }
91
91
  ],
92
- sort: [{ type: 'number', message: '排序必须是数字', trigger: 'blur' }]
92
+ sort: [{ type: "number", message: "排序必须是数字", trigger: "blur" }]
93
93
  }
94
94
  });
95
95
 
96
96
  // 方法集合
97
97
  const $Method = {
98
98
  async initData() {
99
- if ($Prop.actionType === 'upd' && $Prop.rowData.id) {
99
+ if ($Prop.actionType === "upd" && $Prop.rowData.id) {
100
100
  $Data.formData = Object.assign({}, $Prop.rowData);
101
101
  }
102
102
  $Method.onShow();
@@ -110,7 +110,7 @@ const $Method = {
110
110
  onClose() {
111
111
  $Data.visible = false;
112
112
  setTimeout(() => {
113
- $Emit('update:modelValue', false);
113
+ $Emit("update:modelValue", false);
114
114
  }, 300);
115
115
  },
116
116
  async onSubmit() {
@@ -119,14 +119,14 @@ const $Method = {
119
119
  if (!valid) return;
120
120
 
121
121
  $Data.submitting = true;
122
- const formData = $Prop.actionType === 'add' ? fieldClear($Data.formData, { omitKeys: ['id', 'state'] }) : $Data.formData;
123
- const res = await $Http($Prop.actionType === 'upd' ? '/addon/admin/role/upd' : '/addon/admin/role/ins', formData);
122
+ const formData = $Prop.actionType === "add" ? fieldClear($Data.formData, { omitKeys: ["id", "state"] }) : $Data.formData;
123
+ const res = await $Http($Prop.actionType === "upd" ? "/addon/admin/role/upd" : "/addon/admin/role/ins", formData);
124
124
 
125
125
  MessagePlugin.success(res.msg);
126
- $Emit('success');
126
+ $Emit("success");
127
127
  $Method.onClose();
128
128
  } catch (error) {
129
- MessagePlugin.error(error.msg || '提交失败');
129
+ MessagePlugin.error(error.msg || "提交失败");
130
130
  } finally {
131
131
  $Data.submitting = false;
132
132
  }
@@ -11,9 +11,9 @@
11
11
  </template>
12
12
 
13
13
  <script setup>
14
- import { Dialog as TDialog, Tree as TTree, Button as TButton, MessagePlugin } from 'tdesign-vue-next';
15
- import { arrayToTree } from '@/utils';
16
- import { $Http } from '@/plugins/http';
14
+ import { Dialog as TDialog, Tree as TTree, Button as TButton, MessagePlugin } from "tdesign-vue-next";
15
+ import { arrayToTree } from "befly-vite/utils/arrayToTree";
16
+ import { $Http } from "@/plugins/http";
17
17
 
18
18
  const $Prop = defineProps({
19
19
  modelValue: {
@@ -26,7 +26,7 @@ const $Prop = defineProps({
26
26
  }
27
27
  });
28
28
 
29
- const $Emit = defineEmits(['update:modelValue', 'success']);
29
+ const $Emit = defineEmits(["update:modelValue", "success"]);
30
30
 
31
31
  const $Data = $ref({
32
32
  visible: false,
@@ -51,20 +51,19 @@ const $Method = {
51
51
  onClose() {
52
52
  $Data.visible = false;
53
53
  setTimeout(() => {
54
- $Emit('update:modelValue', false);
54
+ $Emit("update:modelValue", false);
55
55
  }, 300);
56
56
  },
57
57
 
58
58
  // 加载菜单树(用于配置权限)
59
59
  async apiMenuAll() {
60
60
  try {
61
- const res = await $Http('/addon/admin/menu/all');
61
+ const res = await $Http("/addon/admin/menu/all");
62
62
  // menuAll 返回的 data 直接就是菜单数组
63
63
  const menuList = Array.isArray(res.data) ? res.data : [];
64
64
  $Data.menuTreeData = arrayToTree(menuList);
65
65
  } catch (error) {
66
- console.error('加载菜单失败:', error);
67
- MessagePlugin.error('加载菜单失败');
66
+ MessagePlugin.error("加载菜单失败");
68
67
  }
69
68
  },
70
69
 
@@ -73,14 +72,14 @@ const $Method = {
73
72
  if (!$Prop.rowData.id) return;
74
73
 
75
74
  try {
76
- const res = await $Http('/addon/admin/role/menus', {
75
+ const res = await $Http("/addon/admin/role/menus", {
77
76
  roleCode: $Prop.rowData.code
78
77
  });
79
78
 
80
79
  // menus 返回的 data 直接就是菜单 ID 数组
81
80
  $Data.menuTreeCheckedKeys = Array.isArray(res.data) ? res.data : [];
82
81
  } catch (error) {
83
- console.error('加载角色菜单失败:', error);
82
+ MessagePlugin.error("加载数据失败");
84
83
  }
85
84
  },
86
85
 
@@ -89,21 +88,20 @@ const $Method = {
89
88
  try {
90
89
  $Data.submitting = true;
91
90
 
92
- const res = await $Http('/addon/admin/role/menuSave', {
91
+ const res = await $Http("/addon/admin/role/menuSave", {
93
92
  roleCode: $Prop.rowData.code,
94
93
  menuIds: $Data.menuTreeCheckedKeys
95
94
  });
96
95
 
97
96
  if (res.code === 0) {
98
- MessagePlugin.success('保存成功');
97
+ MessagePlugin.success("保存成功");
99
98
  $Data.visible = false;
100
- $Emit('success');
99
+ $Emit("success");
101
100
  } else {
102
- MessagePlugin.error(res.msg || '保存失败');
101
+ MessagePlugin.error(res.msg || "保存失败");
103
102
  }
104
103
  } catch (error) {
105
- console.error('保存失败:', error);
106
- MessagePlugin.error('保存失败');
104
+ MessagePlugin.error("保存失败");
107
105
  } finally {
108
106
  $Data.submitting = false;
109
107
  }
@@ -18,7 +18,16 @@
18
18
  </div>
19
19
  <div class="main-content">
20
20
  <div class="main-table">
21
- <TTable :data="$Data.tableData" :columns="$Data.columns" :loading="$Data.loading" :active-row-keys="$Data.activeRowKeys" row-key="id" height="calc(100vh - var(--search-height) - var(--pagination-height) - var(--layout-gap) * 4)" active-row-type="single" @active-change="$Method.onActiveChange">
21
+ <TTable
22
+ :data="$Data.tableData"
23
+ :columns="$Data.columns"
24
+ :loading="$Data.loading"
25
+ :active-row-keys="$Data.activeRowKeys"
26
+ row-key="id"
27
+ height="calc(100vh - var(--search-height) - var(--pagination-height) - var(--layout-gap) * 4)"
28
+ active-row-type="single"
29
+ @active-change="$Method.onActiveChange"
30
+ >
22
31
  <template #state="{ row }">
23
32
  <TTag v-if="row.state === 1" shape="round" theme="success" variant="light-outline">正常</TTag>
24
33
  <TTag v-else-if="row.state === 2" shape="round" theme="warning" variant="light-outline">禁用</TTag>
@@ -74,20 +83,27 @@
74
83
  </template>
75
84
 
76
85
  <script setup>
77
- import { Button as TButton, Table as TTable, Tag as TTag, Dropdown as TDropdown, DropdownMenu as TDropdownMenu, DropdownItem as TDropdownItem, Pagination as TPagination, MessagePlugin, DialogPlugin } from 'tdesign-vue-next';
78
- import ILucidePlus from '~icons/lucide/plus';
79
- import ILucideRotateCw from '~icons/lucide/rotate-cw';
80
- import ILucidePencil from '~icons/lucide/pencil';
81
- import ILucideSettings from '~icons/lucide/settings';
82
- import ILucideCode from '~icons/lucide/code';
83
- import ILucideTrash2 from '~icons/lucide/trash-2';
84
- import ILucideChevronDown from '~icons/lucide/chevron-down';
85
- import EditDialog from './components/edit.vue';
86
- import MenuDialog from './components/menu.vue';
87
- import ApiDialog from './components/api.vue';
88
- import DetailPanel from '@/components/DetailPanel.vue';
89
- import { $Http } from '@/plugins/http';
90
- import { withDefaultColumns } from 'befly-shared/withDefaultColumns';
86
+ import { Button as TButton, Table as TTable, Tag as TTag, Dropdown as TDropdown, DropdownMenu as TDropdownMenu, DropdownItem as TDropdownItem, Pagination as TPagination, MessagePlugin, DialogPlugin } from "tdesign-vue-next";
87
+ import ILucidePlus from "~icons/lucide/plus";
88
+ import ILucideRotateCw from "~icons/lucide/rotate-cw";
89
+ import ILucidePencil from "~icons/lucide/pencil";
90
+ import ILucideSettings from "~icons/lucide/settings";
91
+ import ILucideCode from "~icons/lucide/code";
92
+ import ILucideTrash2 from "~icons/lucide/trash-2";
93
+ import ILucideChevronDown from "~icons/lucide/chevron-down";
94
+ import EditDialog from "./components/edit.vue";
95
+ import MenuDialog from "./components/menu.vue";
96
+ import ApiDialog from "./components/api.vue";
97
+ import DetailPanel from "@/components/DetailPanel.vue";
98
+ import { $Http } from "@/plugins/http";
99
+ import { withDefaultColumns } from "befly-vite/utils/withDefaultColumns";
100
+
101
+ definePage({
102
+ meta: {
103
+ title: "角色管理",
104
+ order: 1
105
+ }
106
+ });
91
107
 
92
108
  // 响应式数据
93
109
  const $Data = $ref({
@@ -96,25 +112,25 @@ const $Data = $ref({
96
112
  activeRowKeys: [],
97
113
  currentRow: null,
98
114
  columns: withDefaultColumns([
99
- { colKey: 'id', title: 'ID' },
100
- { colKey: 'name', title: '角色名称' },
101
- { colKey: 'code', title: '角色代码' },
102
- { colKey: 'description', title: '描述' },
103
- { colKey: 'sort', title: '排序' },
104
- { colKey: 'state', title: '状态' },
105
- { colKey: 'operation', title: '操作' }
115
+ { colKey: "id", title: "ID" },
116
+ { colKey: "name", title: "角色名称" },
117
+ { colKey: "code", title: "角色代码" },
118
+ { colKey: "description", title: "描述" },
119
+ { colKey: "sort", title: "排序" },
120
+ { colKey: "state", title: "状态" },
121
+ { colKey: "operation", title: "操作" }
106
122
  ]),
107
123
  pagerConfig: {
108
124
  currentPage: 1,
109
125
  limit: 30,
110
126
  total: 0,
111
- align: 'right',
112
- layout: 'total, prev, pager, next, jumper'
127
+ align: "right",
128
+ layout: "total, prev, pager, next, jumper"
113
129
  },
114
130
  editVisible: false,
115
131
  menuVisible: false,
116
132
  apiVisible: false,
117
- actionType: 'add',
133
+ actionType: "add",
118
134
  rowData: {}
119
135
  });
120
136
 
@@ -127,7 +143,7 @@ const $Method = {
127
143
  async apiRoleList() {
128
144
  $Data.loading = true;
129
145
  try {
130
- const res = await $Http('/addon/admin/role/list', {
146
+ const res = await $Http("/addon/admin/role/list", {
131
147
  page: $Data.pagerConfig.currentPage,
132
148
  limit: $Data.pagerConfig.limit
133
149
  });
@@ -143,8 +159,7 @@ const $Method = {
143
159
  $Data.activeRowKeys = [];
144
160
  }
145
161
  } catch (error) {
146
- console.error('加载角色列表失败:', error);
147
- MessagePlugin.error('加载数据失败');
162
+ MessagePlugin.error("加载数据失败");
148
163
  } finally {
149
164
  $Data.loading = false;
150
165
  }
@@ -152,22 +167,43 @@ const $Method = {
152
167
 
153
168
  // 删除角色
154
169
  async apiRoleDel(row) {
155
- DialogPlugin.confirm({
156
- header: '确认删除',
157
- body: `确定要删除角色“${row.name}” 吗?`,
158
- status: 'warning'
159
- }).then(async () => {
160
- try {
161
- const res = await $Http('/addon/admin/role/del', { id: row.id });
162
- if (res.code === 0) {
163
- MessagePlugin.success('删除成功');
164
- $Method.apiRoleList();
165
- } else {
166
- MessagePlugin.error(res.msg || '删除失败');
170
+ let dialog = null;
171
+ let destroyed = false;
172
+
173
+ const destroy = () => {
174
+ if (destroyed) return;
175
+ destroyed = true;
176
+ if (dialog && typeof dialog.destroy === "function") {
177
+ dialog.destroy();
178
+ }
179
+ };
180
+
181
+ dialog = DialogPlugin.confirm({
182
+ header: "确认删除",
183
+ body: `确认删除角色“${row.name}”吗?`,
184
+ status: "warning",
185
+ confirmBtn: "删除",
186
+ cancelBtn: "取消",
187
+ onConfirm: async () => {
188
+ if (dialog && typeof dialog.setConfirmLoading === "function") {
189
+ dialog.setConfirmLoading(true);
190
+ }
191
+
192
+ try {
193
+ await $Http("/addon/admin/role/del", { id: row.id });
194
+ MessagePlugin.success("删除成功");
195
+ destroy();
196
+ await $Method.apiRoleList();
197
+ } catch (error) {
198
+ MessagePlugin.error("删除失败");
199
+ } finally {
200
+ if (dialog && typeof dialog.setConfirmLoading === "function") {
201
+ dialog.setConfirmLoading(false);
202
+ }
167
203
  }
168
- } catch (error) {
169
- console.error('删除失败:', error);
170
- MessagePlugin.error('删除失败');
204
+ },
205
+ onClose: () => {
206
+ destroy();
171
207
  }
172
208
  });
173
209
  },
@@ -207,13 +243,13 @@ const $Method = {
207
243
  onAction(command, rowData) {
208
244
  $Data.actionType = command;
209
245
  $Data.rowData = rowData;
210
- if (command === 'add' || command === 'upd') {
246
+ if (command === "add" || command === "upd") {
211
247
  $Data.editVisible = true;
212
- } else if (command === 'menu') {
248
+ } else if (command === "menu") {
213
249
  $Data.menuVisible = true;
214
- } else if (command === 'api') {
250
+ } else if (command === "api") {
215
251
  $Data.apiVisible = true;
216
- } else if (command === 'del') {
252
+ } else if (command === "del") {
217
253
  $Method.apiRoleDel(rowData);
218
254
  }
219
255
  }
@@ -223,6 +259,5 @@ $Method.initData();
223
259
  </script>
224
260
 
225
261
  <style scoped lang="scss">
226
- .page-role {
227
- }
262
+ /* page styles */
228
263
  </style>
@@ -1,4 +0,0 @@
1
- {
2
- "name": "403",
3
- "order": 101
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "字典列表",
3
- "order": 1
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "字典类型",
3
- "order": 0
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "配置管理",
3
- "order": 30
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "系统配置",
3
- "order": 2
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "首页",
3
- "order": 0
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "邮件日志",
3
- "order": 2
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "登录日志",
3
- "order": 1
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "日志管理",
3
- "order": 40
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "操作日志",
3
- "order": 3
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "登录页",
3
- "order": 100
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "管理员",
3
- "order": 1
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "人员管理",
3
- "order": 10
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "接口列表",
3
- "order": 3
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "菜单列表",
3
- "order": 2
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "权限设置",
3
- "order": 20
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "角色管理",
3
- "order": 1
4
- }