diff --git a/api/models/acl.py b/api/models/acl.py
index d1b3056..79328f7 100644
--- a/api/models/acl.py
+++ b/api/models/acl.py
@@ -68,7 +68,7 @@ class UserQuery(BaseQuery):
class User(CRUDModel):
__tablename__ = 'users'
- __bind_key__ = "user"
+ # __bind_key__ = "user"
query_class = UserQuery
uid = db.Column(db.Integer, primary_key=True, autoincrement=True)
diff --git a/ui/package.json b/ui/package.json
index 43220ed..0f71589 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -13,10 +13,14 @@
},
"dependencies": {
"@antv/data-set": "^0.10.2",
+ "@handsontable-pro/vue": "^3.1.1",
+ "@handsontable/vue": "^4.1.1",
"ant-design-vue": "^1.4.2",
"axios": "^0.19.0",
"core-js": "^3.1.2",
"enquire.js": "^2.1.6",
+ "handsontable": "^7.2.2",
+ "handsontable-pro": "^6.2.3",
"js-cookie": "^2.2.0",
"json2csv": "^4.5.2",
"lodash.get": "^4.4.2",
@@ -37,10 +41,7 @@
"vuex": "^3.1.1",
"wangeditor": "^3.1.1",
"xlsx": "latest",
- "@handsontable-pro/vue": "^3.1.1",
- "@handsontable/vue": "^4.1.1",
- "handsontable": "^7.2.2",
- "handsontable-pro": "^6.2.3"
+ "yarn": "^1.19.1"
},
"devDependencies": {
"@ant-design/colors": "^3.2.1",
diff --git a/ui/src/api/acl/app.js b/ui/src/api/acl/app.js
new file mode 100644
index 0000000..c134f36
--- /dev/null
+++ b/ui/src/api/acl/app.js
@@ -0,0 +1,34 @@
+import { axios } from '@/utils/request'
+
+const urlPrefix = '/v1/acl'
+
+export function searchRole (params) {
+ return axios({
+ url: urlPrefix + `/roles`,
+ method: 'GET',
+ params: params
+ })
+}
+
+export function addRole (params) {
+ return axios({
+ url: urlPrefix + '/roles',
+ method: 'POST',
+ data: params
+ })
+}
+
+export function updateRoleById (id, params) {
+ return axios({
+ url: urlPrefix + `/roles/${id}`,
+ method: 'PUT',
+ data: params
+ })
+}
+
+export function deleteRoleById (id) {
+ return axios({
+ url: urlPrefix + `/roles/${id}`,
+ method: 'DELETE'
+ })
+}
diff --git a/ui/src/api/acl/resource.js b/ui/src/api/acl/resource.js
new file mode 100644
index 0000000..106562a
--- /dev/null
+++ b/ui/src/api/acl/resource.js
@@ -0,0 +1,34 @@
+import { axios } from '@/utils/request'
+
+const urlPrefix = '/v1/acl'
+
+export function searchResource (params) {
+ return axios({
+ url: urlPrefix + `/resources`,
+ method: 'GET',
+ params: params
+ })
+}
+
+export function addResource (params) {
+ return axios({
+ url: urlPrefix + '/resources',
+ method: 'POST',
+ data: params
+ })
+}
+
+export function updateResourceById (id, params) {
+ return axios({
+ url: urlPrefix + `/resources/${id}`,
+ method: 'PUT',
+ data: params
+ })
+}
+
+export function deleteResourceById (id) {
+ return axios({
+ url: urlPrefix + `/resources/${id}`,
+ method: 'DELETE'
+ })
+}
diff --git a/ui/src/api/acl/role.js b/ui/src/api/acl/role.js
new file mode 100644
index 0000000..c134f36
--- /dev/null
+++ b/ui/src/api/acl/role.js
@@ -0,0 +1,34 @@
+import { axios } from '@/utils/request'
+
+const urlPrefix = '/v1/acl'
+
+export function searchRole (params) {
+ return axios({
+ url: urlPrefix + `/roles`,
+ method: 'GET',
+ params: params
+ })
+}
+
+export function addRole (params) {
+ return axios({
+ url: urlPrefix + '/roles',
+ method: 'POST',
+ data: params
+ })
+}
+
+export function updateRoleById (id, params) {
+ return axios({
+ url: urlPrefix + `/roles/${id}`,
+ method: 'PUT',
+ data: params
+ })
+}
+
+export function deleteRoleById (id) {
+ return axios({
+ url: urlPrefix + `/roles/${id}`,
+ method: 'DELETE'
+ })
+}
diff --git a/ui/src/api/acl/user.js b/ui/src/api/acl/user.js
index 37e55c8..f81a43f 100644
--- a/ui/src/api/acl/user.js
+++ b/ui/src/api/acl/user.js
@@ -1,6 +1,6 @@
import { axios } from '@/utils/request'
-const urlPrefix = '/v0.1'
+const urlPrefix = '/v1/acl'
export function currentUser () {
return axios({
@@ -11,8 +11,9 @@ export function currentUser () {
export function searchUser (params) {
return axios({
- url: urlPrefix + `/users?${params}`,
- method: 'GET'
+ url: urlPrefix + `/users`,
+ method: 'GET',
+ data: params
})
}
@@ -38,4 +39,3 @@ export function deleteUserById (id) {
method: 'DELETE'
})
}
-
diff --git a/ui/src/config/router.config.js b/ui/src/config/router.config.js
index ec48c6f..be7ab04 100644
--- a/ui/src/config/router.config.js
+++ b/ui/src/config/router.config.js
@@ -78,21 +78,21 @@ const cmdbRouter = [
name: 'acl_users',
hideChildrenInMenu: true,
component: () => import('@/views/cmdb/acl/users'),
- meta: { title: 'Users', keepAlive: true }
+ meta: { title: '用户管理', keepAlive: true }
},
{
path: '/acl/roles',
name: 'acl_roles',
hideChildrenInMenu: true,
component: () => import('@/views/cmdb/acl/roles'),
- meta: { title: 'Roles', keepAlive: true }
+ meta: { title: '角色管理', keepAlive: true }
},
{
path: '/acl/resources',
name: 'acl_resources',
hideChildrenInMenu: true,
component: () => import('@/views/cmdb/acl/resources'),
- meta: { title: 'Resources', keepAlive: true }
+ meta: { title: '资源管理', keepAlive: true }
}
]
}
diff --git a/ui/src/views/cmdb/acl/module/resourceForm.vue b/ui/src/views/cmdb/acl/module/resourceForm.vue
new file mode 100644
index 0000000..556f666
--- /dev/null
+++ b/ui/src/views/cmdb/acl/module/resourceForm.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+ 默认应用
+
+
+
+
+ 默认资源类型
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/cmdb/acl/module/roleForm.vue b/ui/src/views/cmdb/acl/module/roleForm.vue
new file mode 100644
index 0000000..37917a9
--- /dev/null
+++ b/ui/src/views/cmdb/acl/module/roleForm.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+ 默认应用
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/cmdb/acl/module/userForm.vue b/ui/src/views/cmdb/acl/module/userForm.vue
index 20bba40..a76863f 100644
--- a/ui/src/views/cmdb/acl/module/userForm.vue
+++ b/ui/src/views/cmdb/acl/module/userForm.vue
@@ -129,10 +129,9 @@ export default {
},
data () {
return {
-
drawerTitle: '新增用户',
drawerVisible: false,
- formLayout: 'vertical',
+ formLayout: 'vertical'
}
},
diff --git a/ui/src/views/cmdb/acl/resources.vue b/ui/src/views/cmdb/acl/resources.vue
index 6d9c248..c3eb9eb 100644
--- a/ui/src/views/cmdb/acl/resources.vue
+++ b/ui/src/views/cmdb/acl/resources.vue
@@ -1,10 +1,337 @@
-
+
+
+
+
+
+
+
+
+
+ {{ app.name }}
+
+
+
+
+
+
+
+
+
setSelectedKeys(e.target.value ? [e.target.value] : [])"
+ @pressEnter="() => handleSearch(selectedKeys, confirm, column)"
+ style="width: 188px; margin-bottom: 8px; display: block;"
+ />
+ handleSearch(selectedKeys, confirm, column)"
+ icon="search"
+ size="small"
+ style="width: 90px; margin-right: 8px"
+ >搜索
+ handleReset(clearFilters, column)"
+ size="small"
+ style="width: 90px"
+ >重置
+
+
+
+
+
+
+ {{ fragment }}
+ {{ fragment }}
+
+
+ {{ text }}
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
+
+ 编辑
+
+
+
+ 删除
+
+
+
+
+
+
+
+
-
diff --git a/ui/src/views/cmdb/acl/roles.vue b/ui/src/views/cmdb/acl/roles.vue
index 6d9c248..8968342 100644
--- a/ui/src/views/cmdb/acl/roles.vue
+++ b/ui/src/views/cmdb/acl/roles.vue
@@ -1,10 +1,337 @@
-
+
+
+
+
+
+
+
+
+
+ {{ app.name }}
+
+
+
+
+
+
+
+
+
setSelectedKeys(e.target.value ? [e.target.value] : [])"
+ @pressEnter="() => handleSearch(selectedKeys, confirm, column)"
+ style="width: 188px; margin-bottom: 8px; display: block;"
+ />
+ handleSearch(selectedKeys, confirm, column)"
+ icon="search"
+ size="small"
+ style="width: 90px; margin-right: 8px"
+ >搜索
+ handleReset(clearFilters, column)"
+ size="small"
+ style="width: 90px"
+ >重置
+
+
+
+
+
+
+ {{ fragment }}
+ {{ fragment }}
+
+
+ {{ text }}
+
+
+
+ {{ text }}
+
+
+
+
+
+
+
+
+ 编辑
+
+
+
+ 删除
+
+
+
+
+
+
+
+
-
diff --git a/ui/src/views/cmdb/acl/users.vue b/ui/src/views/cmdb/acl/users.vue
index 5e50201..3fbedc6 100644
--- a/ui/src/views/cmdb/acl/users.vue
+++ b/ui/src/views/cmdb/acl/users.vue
@@ -43,9 +43,9 @@
-
+
-
+
{{ fragment }}
{{ fragment }}
@@ -53,9 +53,9 @@
{{ text }}
-
+
-
+
{{ fragment }}
{{ fragment }}
@@ -125,11 +125,11 @@ export default {
sorter: false,
width: 250,
scopedSlots: {
- customRender: 'aliasSearchRender',
+ customRender: 'usernameSearchRender',
filterDropdown: 'filterDropdown',
filterIcon: 'filterIcon'
},
- onFilter: (value, record) => record.alias && record.alias.toLowerCase().includes(value.toLowerCase()),
+ onFilter: (value, record) => record.username && record.username.toLowerCase().includes(value.toLowerCase()),
onFilterDropdownVisibleChange: (visible) => {
if (visible) {
setTimeout(() => {
@@ -144,11 +144,11 @@ export default {
sorter: false,
width: 250,
scopedSlots: {
- customRender: 'nameSearchRender',
+ customRender: 'nicknameSearchRender',
filterDropdown: 'filterDropdown',
filterIcon: 'filterIcon'
},
- onFilter: (value, record) => record.name && record.name.toLowerCase().includes(value.toLowerCase()),
+ onFilter: (value, record) => record.nickname && record.nickname.toLowerCase().includes(value.toLowerCase()),
onFilterDropdownVisibleChange: (visible) => {
if (visible) {
setTimeout(() => {