From bcdb50bc9e9d6ad8ba35ed01650ce6ada14ac2e9 Mon Sep 17 00:00:00 2001 From: yan Date: Sat, 16 Jul 2022 22:48:10 +0800 Subject: [PATCH 1/5] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8DHOMEPAGE=20Docker?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=B1=9E=E6=80=A7=E4=B8=8D=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/api/Model/DockerInfo.ts | 4 ++-- .../App/Home/DockerInfoDescription/index.tsx | 4 ++++ .../App/Home/DockerVersionDescription/index.tsx | 5 ++++- admin/src/page/HomePage/index.tsx | 7 ++++++- backend-src/src/main/main.iml | 11 +++++++++++ backend-src/src/test/test.iml | 12 ++++++++++++ 6 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 backend-src/src/main/main.iml create mode 100644 backend-src/src/test/test.iml diff --git a/admin/src/api/Model/DockerInfo.ts b/admin/src/api/Model/DockerInfo.ts index a0e3b06..1d1f5e8 100644 --- a/admin/src/api/Model/DockerInfo.ts +++ b/admin/src/api/Model/DockerInfo.ts @@ -1,6 +1,6 @@ interface DockerServerInfo { - version: any - info: any + version?: any + info?: any } export default DockerServerInfo \ No newline at end of file diff --git a/admin/src/component/App/Home/DockerInfoDescription/index.tsx b/admin/src/component/App/Home/DockerInfoDescription/index.tsx index 25a8439..b18ca43 100644 --- a/admin/src/component/App/Home/DockerInfoDescription/index.tsx +++ b/admin/src/component/App/Home/DockerInfoDescription/index.tsx @@ -34,6 +34,10 @@ class DockerInfoDescription extends React.Component { } } + componentWillReceiveProps(nextProps:Props){ + this.setState({dockerInfo:nextProps.dockerInfo}) + } + render() { let items = [] diff --git a/admin/src/component/App/Home/DockerVersionDescription/index.tsx b/admin/src/component/App/Home/DockerVersionDescription/index.tsx index b42cec4..bc46c09 100644 --- a/admin/src/component/App/Home/DockerVersionDescription/index.tsx +++ b/admin/src/component/App/Home/DockerVersionDescription/index.tsx @@ -37,9 +37,12 @@ class DockerVersionDescription extends React.Component { } } + componentWillReceiveProps(nextProps:Props){ + this.setState({dockerInfo:nextProps.dockerInfo}) + } - render() { + render() { let items: Array = new Array(); for (let config of configs) { let {name, path} = config diff --git a/admin/src/page/HomePage/index.tsx b/admin/src/page/HomePage/index.tsx index e9faf5c..e6dd3b6 100644 --- a/admin/src/page/HomePage/index.tsx +++ b/admin/src/page/HomePage/index.tsx @@ -19,7 +19,7 @@ class HomePage extends React.Component { constructor(props: HomePageProps) { super(props); this.state = { - dockerServiceInfo: {version: null, info: null} + dockerServiceInfo: {} } } @@ -29,6 +29,11 @@ class HomePage extends React.Component { }) } + componentWillReceiveProps(nextProps:HomePageProps){ + console.log(nextProps) + this.setState(nextProps) + } + render() { return ( diff --git a/backend-src/src/main/main.iml b/backend-src/src/main/main.iml new file mode 100644 index 0000000..908ad4f --- /dev/null +++ b/backend-src/src/main/main.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend-src/src/test/test.iml b/backend-src/src/test/test.iml new file mode 100644 index 0000000..5ebc6f4 --- /dev/null +++ b/backend-src/src/test/test.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file -- Gitee From 7568a970da3db36dba478fb0a1ec3dca85c8a024 Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 17 Jul 2022 02:18:53 +0800 Subject: [PATCH 2/5] =?UTF-8?q?:bug:=20=E5=BC=80=E5=A7=8B=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=20&=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/api/Api.ts | 36 +-- admin/src/api/Auth/RoleApi.ts | 47 ++++ admin/src/api/Model/Auth/Permission.ts | 7 + admin/src/api/Model/Auth/PermissionGroup.ts | 9 + admin/src/api/Model/Auth/Role.ts | 9 + .../src/api/Model/Auth/RoleCreatedRequest.ts | 7 + admin/src/api/Model/Auth/RoleUpdateRequest.ts | 5 + admin/src/api/Model/User.ts | 2 +- admin/src/api/Page.ts | 8 + .../component/Auth/PermissionList/index.tsx | 20 ++ admin/src/component/Auth/RoleList/index.css | 3 + admin/src/component/Auth/RoleList/index.tsx | 254 ++++++++++++++++++ admin/src/component/Auth/UserList/index.tsx | 110 ++++++++ .../src/component/Main/MainSideMenu/index.tsx | 2 +- admin/src/page/AuthPage/index.tsx | 40 +++ admin/src/page/UserPage/index.tsx | 111 -------- admin/src/router/MainPageRouter.tsx | 7 +- admin/src/router/TerminalPageRouter.tsx | 2 +- .../config/CommandExceptionHandler.java | 34 ++- .../config/DockerClientFactory.java | 2 +- .../config/DockerClientInterception.java | 2 +- .../simpledocker/config/GoServiceCommand.java | 2 +- .../simpledocker/config/SpringConfig.java | 2 +- .../config/SpringInterception.java | 2 +- .../simpledocker/config/WebSocketConfig.java | 2 +- .../controller/AuthController.java | 2 +- .../controller/ClientController.java | 2 +- .../controller/ConfigController.java | 2 +- .../controller/ContainerController.java | 2 +- .../controller/ImageController.java | 2 +- .../controller/InfoController.java | 2 +- .../controller/NetWorkController.java | 2 +- .../controller/UserController.java | 2 +- .../controller/VolumeController.java | 2 +- .../controller/client/DockerClientConfig.java | 2 +- .../container/OperateContainerRequest.java | 2 +- .../container/RunNewContainerRequest.java | 2 +- .../controller/image/PushImageRequest.java | 2 +- .../controller/image/RemoveImageRequest.java | 2 +- .../response/role/RoleResponse.java | 26 +- .../simpledocker/dao/bean/ConfigDao.java | 2 +- .../dao/bean/DockerConfigDao.java | 2 +- .../taoes/simpledocker/dao/bean/RoleDao.java | 7 +- .../taoes/simpledocker/dao/bean/UserDao.java | 2 +- .../simpledocker/dao/mapper/ConfigMapper.java | 2 +- .../dao/mapper/DockerEndpointMapper.java | 2 +- .../simpledocker/dao/mapper/DockerMapper.java | 2 +- .../dao/mapper/OperateRecordMapper.java | 2 +- .../simpledocker/dao/mapper/UserMapper.java | 2 +- .../dao/responsity/ConfigRepository.java | 2 +- .../dao/responsity/DockerRepository.java | 2 +- .../dao/responsity/EndpointRepository.java | 2 +- .../responsity/OperateRecordRepository.java | 2 +- .../dao/responsity/RoleRepository.java | 50 ++-- .../dao/responsity/UserRepository.java | 2 +- .../simpledocker/model/DockerConfig.java | 2 +- .../simpledocker/model/ResponseModel.java | 18 +- .../com/taoes/simpledocker/model/Role.java | 7 + .../com/taoes/simpledocker/model/User.java | 2 +- .../model/enums/ContainerOperate.java | 2 +- .../simpledocker/model/enums/EPlatform.java | 2 +- .../simpledocker/model/enums/ErrorCode.java | 27 ++ .../model/enums/PermissionEnum.java | 14 + .../model/enums/PermissionGroupEnum.java | 6 +- .../exception/NotFoundClientException.java | 2 +- .../simpledocker/service/AuthService.java | 2 +- .../simpledocker/service/ConfigService.java | 2 +- .../service/ContainerService.java | 2 +- .../service/DockerEndpointService.java | 2 +- .../service/DockerTestService.java | 2 +- .../simpledocker/service/GoProgramRunner.java | 2 +- .../simpledocker/service/ImageService.java | 2 +- .../simpledocker/service/UserService.java | 2 +- .../service/imple/AuthServiceImpl.java | 2 +- .../service/imple/ContainerServiceImpl.java | 2 +- .../service/imple/GoProgramRunnerImpl.java | 2 +- .../service/imple/ImageServiceImpl.java | 2 +- .../service/imple/RoleServiceImpl.java | 9 + .../service/imple/UserServiceImpl.java | 2 +- .../simpledocker/utils/BooleanUtils.java | 2 +- .../taoes/simpledocker/utils/JsonUtils.java | 2 +- .../com/taoes/simpledocker/utils/OSInfo.java | 2 +- .../taoes/simpledocker/utils/TimeUtils.java | 3 + .../ws/ContainerFileWebSocket.java | 2 +- .../ws/ContainerLogWebSocket.java | 2 +- .../ws/ContainerTerminalWebSocket.java | 2 +- .../simpledocker/ws/ImagePullWebSocket.java | 2 +- backend-src/src/test/java/Main.java | 2 +- 88 files changed, 767 insertions(+), 231 deletions(-) create mode 100644 admin/src/api/Auth/RoleApi.ts create mode 100644 admin/src/api/Model/Auth/Permission.ts create mode 100644 admin/src/api/Model/Auth/PermissionGroup.ts create mode 100644 admin/src/api/Model/Auth/Role.ts create mode 100644 admin/src/api/Model/Auth/RoleCreatedRequest.ts create mode 100644 admin/src/api/Model/Auth/RoleUpdateRequest.ts create mode 100644 admin/src/api/Page.ts create mode 100644 admin/src/component/Auth/PermissionList/index.tsx create mode 100644 admin/src/component/Auth/RoleList/index.css create mode 100644 admin/src/component/Auth/RoleList/index.tsx create mode 100644 admin/src/component/Auth/UserList/index.tsx create mode 100644 admin/src/page/AuthPage/index.tsx delete mode 100644 admin/src/page/UserPage/index.tsx create mode 100644 backend-src/src/main/java/com/taoes/simpledocker/model/enums/ErrorCode.java diff --git a/admin/src/api/Api.ts b/admin/src/api/Api.ts index 24369e4..e93aa39 100644 --- a/admin/src/api/Api.ts +++ b/admin/src/api/Api.ts @@ -3,33 +3,35 @@ import {message} from "antd"; let BASE_URL = process.env.REACT_APP_BASE_URL let config: AxiosRequestConfig = { - baseURL: `${BASE_URL}api` + baseURL: `${BASE_URL}api` } const httpRequest = axios.create(config); httpRequest.interceptors.request.use(function (config) { - // @ts-ignore - config.headers.Token = " " + localStorage.getItem('token') - // @ts-ignore - config.headers.clientId = localStorage.getItem('clientId') - return config; + // @ts-ignore + config.headers.Token = " " + localStorage.getItem('token') + // @ts-ignore + config.headers.clientId = localStorage.getItem('clientId') + return config; }, function (error) { - // 对请求错误做些什么 - return Promise.reject(error); + // 对请求错误做些什么 + return Promise.reject(error); }); httpRequest.interceptors.response.use(function (response) { - if (response.data.code === 401) { - window.location.href = '/'; - return Promise.reject(response); - } - return response; + if (response.data.code === 401 || response.data.code === 403003) { + message.error("用户token过期或者无效,请重新登录后尝试").then(); + console.error("用户token过期或者无效,请重新登录") + window.location.href = '/'; + return Promise.reject(response); + } + return response; }, function (error) { - message.error("连接服务出现异常,请检查网络连接或服务器是否正常").then(); - console.error(`连接服务器出现异常信息,请检查网络连接或服务器是否正常,错误信息:${error}`) - // 对请求错误做些什么 - return Promise.reject(error); + message.error("连接服务出现异常,请检查网络连接或服务器是否正常").then(); + console.error(`连接服务器出现异常信息,请检查网络连接或服务器是否正常,错误信息:${error}`) + // 对请求错误做些什么 + return Promise.reject(error); }); export default httpRequest; \ No newline at end of file diff --git a/admin/src/api/Auth/RoleApi.ts b/admin/src/api/Auth/RoleApi.ts new file mode 100644 index 0000000..149c3de --- /dev/null +++ b/admin/src/api/Auth/RoleApi.ts @@ -0,0 +1,47 @@ +import httpRequest from '../Api' +import DockerContainer from "../Model/DockerContainer"; +import UserLoginRequest from "../Model/Auth/UserLoginRequest"; +import Role from "../Model/Auth/Role"; +import {Base} from "../Base"; +import {Page} from "../Page"; +import RoleCreatedRequest from "../Model/Auth/RoleCreatedRequest"; +import RoleUpdateRequest from "../Model/Auth/RoleUpdateRequest"; +import PermissionGroup from "../Model/Auth/PermissionGroup"; + +/** + * 获取角色列表 + */ +function roleList(pageNum: number, pageSize: number): Promise>> { + return httpRequest.get>>(`/role/list?pageNum=${pageNum}&pageSize=${pageSize}`).then(data => data.data) +} + +/** + * 创建新的角色 + */ +function createNewRole(req: RoleCreatedRequest): Promise> { + return httpRequest.post>(`/role`, req).then(data => data.data) +} + +/** + * 更新角色信息 + */ +function updateRole(req: RoleUpdateRequest): Promise> { + return httpRequest.put>(`/role`, req).then(data => data.data); +} + +/** + * 删除角色 + */ +function deleteRole(id: number): Promise> { + return httpRequest.delete>(`/role?id=${id}`).then(data => data.data); +} + + +/** + * 获取权限组配置 + */ +function getPermissionGroup(): Promise>> { + return httpRequest.get>>('/role/permission/config').then(data => data.data); +} + +export {roleList, createNewRole, updateRole, deleteRole,getPermissionGroup} \ No newline at end of file diff --git a/admin/src/api/Model/Auth/Permission.ts b/admin/src/api/Model/Auth/Permission.ts new file mode 100644 index 0000000..de6ad91 --- /dev/null +++ b/admin/src/api/Model/Auth/Permission.ts @@ -0,0 +1,7 @@ +interface Permission { + groupId: number; + permission: string; + permissionName:string; +} + +export default Permission; \ No newline at end of file diff --git a/admin/src/api/Model/Auth/PermissionGroup.ts b/admin/src/api/Model/Auth/PermissionGroup.ts new file mode 100644 index 0000000..a59f319 --- /dev/null +++ b/admin/src/api/Model/Auth/PermissionGroup.ts @@ -0,0 +1,9 @@ +import Permission from "./Permission"; + +interface PermissionGroup { + groupId: number; + groupName: string; + permissions: Array; +} + +export default PermissionGroup; \ No newline at end of file diff --git a/admin/src/api/Model/Auth/Role.ts b/admin/src/api/Model/Auth/Role.ts new file mode 100644 index 0000000..9a9d72f --- /dev/null +++ b/admin/src/api/Model/Auth/Role.ts @@ -0,0 +1,9 @@ +/** + * 角色信息定义 + */ +export default interface Role { + id: number; + name: string; + comment: string; + permissions: Array; +} \ No newline at end of file diff --git a/admin/src/api/Model/Auth/RoleCreatedRequest.ts b/admin/src/api/Model/Auth/RoleCreatedRequest.ts new file mode 100644 index 0000000..9d86fdb --- /dev/null +++ b/admin/src/api/Model/Auth/RoleCreatedRequest.ts @@ -0,0 +1,7 @@ +/** + * 角色创建请求对象 + */ +export default interface RoleCreatedRequest { + name?: string; + comment?: string; +} \ No newline at end of file diff --git a/admin/src/api/Model/Auth/RoleUpdateRequest.ts b/admin/src/api/Model/Auth/RoleUpdateRequest.ts new file mode 100644 index 0000000..58e1e51 --- /dev/null +++ b/admin/src/api/Model/Auth/RoleUpdateRequest.ts @@ -0,0 +1,5 @@ +import RoleCreatedRequest from "./RoleCreatedRequest"; + +export default interface RoleUpdateRequest extends RoleCreatedRequest { + id: number +} \ No newline at end of file diff --git a/admin/src/api/Model/User.ts b/admin/src/api/Model/User.ts index 59b5222..5218102 100644 --- a/admin/src/api/Model/User.ts +++ b/admin/src/api/Model/User.ts @@ -1,6 +1,6 @@ export default interface User { id: number - name: string + account: string createdAt: string updatedAt: string } \ No newline at end of file diff --git a/admin/src/api/Page.ts b/admin/src/api/Page.ts new file mode 100644 index 0000000..51b790c --- /dev/null +++ b/admin/src/api/Page.ts @@ -0,0 +1,8 @@ +export interface Page { + pages: number; + total: number; + hasNext: boolean; + hasPrevious: boolean; + currentPage: boolean; + results: Array; +} \ No newline at end of file diff --git a/admin/src/component/Auth/PermissionList/index.tsx b/admin/src/component/Auth/PermissionList/index.tsx new file mode 100644 index 0000000..3bc9d3f --- /dev/null +++ b/admin/src/component/Auth/PermissionList/index.tsx @@ -0,0 +1,20 @@ +import React from "react"; + +interface Props { + +} + +interface State { + +} + + +export default class PermissionList extends React.Component{ + constructor(props:Props) { + super(props); + } + + render() { + return Permission + } +} \ No newline at end of file diff --git a/admin/src/component/Auth/RoleList/index.css b/admin/src/component/Auth/RoleList/index.css new file mode 100644 index 0000000..e9658e8 --- /dev/null +++ b/admin/src/component/Auth/RoleList/index.css @@ -0,0 +1,3 @@ +#rolePermissionConfigModal,.ant-modal-body{ + padding: 0 14px 10px 14px !important; +} \ No newline at end of file diff --git a/admin/src/component/Auth/RoleList/index.tsx b/admin/src/component/Auth/RoleList/index.tsx new file mode 100644 index 0000000..d4eb95d --- /dev/null +++ b/admin/src/component/Auth/RoleList/index.tsx @@ -0,0 +1,254 @@ +import React from "react"; +import Role from "../../../api/Model/Auth/Role"; +import {createNewRole, deleteRole, getPermissionGroup, roleList} from "../../../api/Auth/RoleApi"; +import {Button, Checkbox, Form, Input, message, Modal, Space, Table, Tabs} from "antd"; +import {ColumnsType} from "antd/es/table"; +import {ReloadOutlined, CloudSyncOutlined, ExclamationCircleOutlined} from '@ant-design/icons' +import Search from "antd/es/input/Search"; +import RoleCreatedRequest from "../../../api/Model/Auth/RoleCreatedRequest"; +import PermissionGroup from "../../../api/Model/Auth/PermissionGroup"; +import './index.css' + +interface Props { + +} + +interface State { + roleList: Array, + modalForCreateRole: boolean, + modalForPermission: boolean, + currentRoleId: number, + newRoleReq: RoleCreatedRequest, + permissionConfig: Array +} + +const {confirm} = Modal; + +export default class RoleList extends React.Component { + + constructor(props: Props) { + super(props); + this.state = { + modalForCreateRole: false, + modalForPermission: false, + roleList: [], + permissionConfig: [], + currentRoleId: 0, + newRoleReq: {name: '', comment: ''} + } + } + + componentDidMount() { + this.refresh() + } + + + /** + * 刷新列表 + */ + refresh = () => { + roleList(1, 100).then(resp => { + let {code, msg, data} = resp; + if (code !== 0) { + message.error(`加载角色列表失败:${msg}`).then(); + return + } + this.setState({roleList: data.results}) + }) + + getPermissionGroup().then(resp => { + if (resp.code === 0) { + this.setState({permissionConfig: resp.data}) + } + }); + } + + + /** + * 保存角色 + */ + saveRole = () => { + // 检查数据 + let data = this.state.newRoleReq; + if (data.name?.trim() === '' || data.comment?.trim() === '') { + message.error(`创建失败,角色信息不能为空`) + return + } + createNewRole(data).then(resp => { + let {code, msg} = resp; + if (code !== 0) { + message.info(`创建失败,${msg}`); + return + } + message.info(`创建成功,正在刷新角色列表`) + this.setState({modalForCreateRole: false, newRoleReq: {name: '', comment: ''}}) + this.refresh() + }) + } + /** + * 保存权限 + */ + savePermission = () => { + } + + + /*** + * 删除角色 + * @param role 需要删除的角色信息 + */ + deleteRole = (role: Role) => { + let remove = () => { + deleteRole(role.id).then(resp => { + let {code, msg, data} = resp; + if (code !== 0) { + message.error(`删除角色失败,${msg}`) + return + } + this.refresh() + }) + } + confirm({ + title: `是否确认删除角色${role.name}?`, + icon: , + content: '此操作不可逆,请谨慎操作', + okText: '确认', + cancelText: '取消', + onOk() { + remove() + } + }); + } + + updatePermission = (role: Role) => { + this.setState({ + currentRoleId: role.id, + modalForPermission: true + }) + } + + onRoleChange = (_: any, value: RoleCreatedRequest) => { + this.setState({newRoleReq: value}) + } + + render() { + const columns: ColumnsType = [ + { + title: '角色ID', + dataIndex: 'id', + render: id => {id}, + ellipsis: true, + width: 150, + }, + { + title: '角色名称', + dataIndex: 'name', + render: name => {name}, + ellipsis: true, + width: 150, + }, + { + title: '角色描述', + dataIndex: 'comment', + render: comment => {comment}, + ellipsis: true, + width: 150, + }, + { + title: '创建时间', + dataIndex: 'createdAt', + render: createdAt => {createdAt}, + ellipsis: true, + width: 150, + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + render: updatedAt => {updatedAt}, + ellipsis: true, + width: 150, + }, + { + title: '操作', + dataIndex: 'id', + fixed: 'right', + width: 180, + render: (_, role: Role) => { + return ( + + + + + + ) + } + } + ] + + return ( +
+
+
+ + + +
+
+ record.id}/> + + this.saveRole()} + onCancel={() => this.setState({modalForCreateRole: false})}> +
+ + + + + + + + + + +
+ +
+ this.savePermission()} + onCancel={() => this.setState({modalForPermission: false})} + footer={null} + > + + { + this.state.permissionConfig.map(group => { + return + { + group.permissions.map(p => { + return {p.permissionName} + }) + } + + }) + } + + +
+ + ) + } +} \ No newline at end of file diff --git a/admin/src/component/Auth/UserList/index.tsx b/admin/src/component/Auth/UserList/index.tsx new file mode 100644 index 0000000..110d8e6 --- /dev/null +++ b/admin/src/component/Auth/UserList/index.tsx @@ -0,0 +1,110 @@ +import Search from "antd/es/input/Search"; +import {Button, message, Modal, Space, Table} from "antd"; +import {CloudSyncOutlined, ReloadOutlined} from "@ant-design/icons"; +import {ColumnsType} from "antd/es/table"; +import User from "../../../api/Model/User"; +import {useEffect, useState} from "react"; +import {userList} from "../../../api/User/UserApi"; +import UserCreate from "../../../component/App/User/UserCreate"; + +const columns: ColumnsType = [ + { + title: '用户ID', + dataIndex: 'id', + render: id => {id}, + ellipsis: true, + width: 150, + }, + { + title: '用户名', + dataIndex: 'account', + render: account => {account}, + ellipsis: true, + width: 150, + }, + { + title: '角色', + dataIndex: 'role', + render: role => ADMIN, + ellipsis: true, + width: 150, + }, + { + title: '创建时间', + dataIndex: 'createdAt', + render: createdAt => {createdAt}, + ellipsis: true, + width: 150, + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + render: updatedAt => {updatedAt}, + ellipsis: true, + width: 150, + }, { + title: '操作', + dataIndex: 'address', + fixed: 'right', + width: 120, + render: (_, user: User) => { + return ( + + + + + + ) + } + + } +] + +function UserList() { + + let [users, setUsers] = useState>([]) + + let [createUserState, setCreateUserState] = useState(false) + useEffect(() => refresh(false), []) + + let refresh = (fresh: boolean) => { + if (fresh) { + message.info("开始刷新用户列表中").then(); + } + userList().then(resp => { + setUsers(resp.data) + }) + } + + + let createUser = () => { + setCreateUserState(true) + + } + return ( +
+
+
+ + + +
+
+
record.id}/> + + setCreateUserState(false)} + onCancel={() => setCreateUserState(false)}> + + + + ) +} + +export default UserList; \ No newline at end of file diff --git a/admin/src/component/Main/MainSideMenu/index.tsx b/admin/src/component/Main/MainSideMenu/index.tsx index 0d7675e..f28e420 100644 --- a/admin/src/component/Main/MainSideMenu/index.tsx +++ b/admin/src/component/Main/MainSideMenu/index.tsx @@ -28,7 +28,7 @@ const items = [ {label: '网络管理', key: 'network', icon: }, {label: '监控设置', key: 'monitor', icon: }, {label: '系统设置', key: 'setting', icon: }, - {label: '账户管理', key: 'user', icon: }, + {label: '授权管理', key: 'auth', icon: }, {label: '关于界面', key: 'about', icon: }, ]; diff --git a/admin/src/page/AuthPage/index.tsx b/admin/src/page/AuthPage/index.tsx new file mode 100644 index 0000000..77839f2 --- /dev/null +++ b/admin/src/page/AuthPage/index.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import {Tabs} from "antd"; +import UserList from "../../component/Auth/UserList"; +import RoleList from "../../component/Auth/RoleList"; +import PermissionList from "../../component/Auth/PermissionList"; + +interface Props { + +} + +interface State { + +} + + + +const {TabPane} = Tabs; +export default class AuthPage extends React.Component { + constructor(props: Props) { + super(props); + } + + render() { + return ( +
+ + + + + + + + + + + +
+ ) + } +} diff --git a/admin/src/page/UserPage/index.tsx b/admin/src/page/UserPage/index.tsx deleted file mode 100644 index e31df10..0000000 --- a/admin/src/page/UserPage/index.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import Search from "antd/es/input/Search"; -import {Button, message, Modal, Space, Table} from "antd"; -import {CloudSyncOutlined, ReloadOutlined} from "@ant-design/icons"; -import {ColumnsType} from "antd/es/table"; -import User from "../../api/Model/User"; -import {useEffect, useState} from "react"; -import {userList} from "../../api/User/UserApi"; -import UserCreate from "../../component/App/User/UserCreate"; - -const columns: ColumnsType = [ - { - title: '用户ID', - dataIndex: 'id', - render: id => {id}, - ellipsis: true, - width: 150, - }, - { - title: '用户名', - dataIndex: 'username', - render: username => {username}, - ellipsis: true, - width: 150, - }, - { - title: '角色', - dataIndex: 'role', - render: role => ADMIN, - ellipsis: true, - width: 150, - }, - { - title: '创建时间', - dataIndex: 'createdAt', - render: createdAt => {createdAt}, - ellipsis: true, - width: 150, - }, - { - title: '更新时间', - dataIndex: 'updatedAt', - render: updatedAt => {updatedAt}, - ellipsis: true, - width: 150, - }, { - title: '操作', - dataIndex: 'address', - fixed: 'right', - width: 180, - render: (_, user: User) => { - return ( - - - - - - - ) - } - - } -] - -function UserPage() { - - let [users, setUsers] = useState>([]) - - let [createUserState, setCreateUserState] = useState(false) - useEffect(() => refresh(false), []) - - let refresh = (fresh: boolean) => { - if (fresh) { - message.info("开始刷新用户列表中").then(); - } - userList().then(resp => { - setUsers(resp.data) - }) - } - - - let createUser = () => { - setCreateUserState(true) - - } - return ( -
-
-
- - - -
-
-
record.id}/> - - setCreateUserState(false)} - onCancel={() => setCreateUserState(false)}> - - - - ) -} - -export default UserPage; \ No newline at end of file diff --git a/admin/src/router/MainPageRouter.tsx b/admin/src/router/MainPageRouter.tsx index 5b6a5ea..010107e 100644 --- a/admin/src/router/MainPageRouter.tsx +++ b/admin/src/router/MainPageRouter.tsx @@ -6,10 +6,11 @@ import NetworkPage from "../page/NetworkPage"; import HomePage from "../page/HomePage"; import MonitorPage from "../page/MonitorPage"; import SettingPage from "../page/SettingPage"; -import UserPage from "../page/UserPage"; +import UserPage from "../page/AuthPage"; import AboutPage from "../page/AboutPage"; import CreateContainerPage from "../page/CreateContainerPage"; import ContainerLogPage from "../page/ContainerLogPage"; +import AuthPage from "../page/AuthPage"; export const appRouter: Array = [ @@ -54,8 +55,8 @@ export const appRouter: Array = [ exact: true }, { - path: '/app/user', - component: , + path: '/app/auth', + component: , exact: true }, { diff --git a/admin/src/router/TerminalPageRouter.tsx b/admin/src/router/TerminalPageRouter.tsx index a222843..d2bf53a 100644 --- a/admin/src/router/TerminalPageRouter.tsx +++ b/admin/src/router/TerminalPageRouter.tsx @@ -6,7 +6,7 @@ import NetworkPage from "../page/NetworkPage"; import HomePage from "../page/HomePage"; import MonitorPage from "../page/MonitorPage"; import SettingPage from "../page/SettingPage"; -import UserPage from "../page/UserPage"; +import UserPage from "../page/AuthPage"; import AboutPage from "../page/AboutPage"; import CreateContainerPage from "../page/CreateContainerPage"; import ContainerLogPage from "../page/ContainerLogPage"; diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/CommandExceptionHandler.java b/backend-src/src/main/java/com/taoes/simpledocker/config/CommandExceptionHandler.java index 0f977d4..fadc604 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/CommandExceptionHandler.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/CommandExceptionHandler.java @@ -1,20 +1,24 @@ package com.taoes.simpledocker.config; +import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.exception.SaTokenException; import com.taoes.simpledocker.model.ResponseModel; +import com.taoes.simpledocker.model.enums.ErrorCode; +import com.taoes.simpledocker.model.exception.ParamCheckException; import javax.ws.rs.ProcessingException; import com.taoes.simpledocker.model.enums.PermissionEnum; import org.springframework.http.HttpEntity; +import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; /** * 统一异常处理器 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:49 下午 */ @ControllerAdvice @@ -24,15 +28,37 @@ public class CommandExceptionHandler { public HttpEntity> corsFilter(RuntimeException e) { if (e instanceof ProcessingException) { String msg = "Docker服务连接异常"; - return new HttpEntity<>(ResponseModel.fail(msg).setCode(400)); + return new HttpEntity<>(ResponseModel.fail(msg).setErrorCode(ErrorCode.DOCKER_ENDPOINT_CONNECT_ERROR)); } - return new HttpEntity<>(ResponseModel.fail(e.getMessage()).setCode(400)); + return new HttpEntity<>(ResponseModel.fail(e.getMessage()).setErrorCode(ErrorCode.SYSTEM_ERROR)); } + @ExceptionHandler(BindException.class) + public HttpEntity> handleBindException(BindException e){ + // TODO 待优化异常提示文案 + return new HttpEntity<>(ResponseModel.fail(e.getMessage()).setErrorCode(ErrorCode.PARAM_ERROR)); + } + + /** + * 未登录异常 + */ + @ExceptionHandler(NotLoginException.class) + public HttpEntity> handleNotLoginException(NotLoginException e){ + return new HttpEntity<>(ResponseModel.fail("未登录系统").setErrorCode(ErrorCode.NOT_LOGIN)); + } + + /** + * 无权限异常 + */ @ExceptionHandler(NotPermissionException.class) public HttpEntity> saPermissionFilter(NotPermissionException e) { PermissionEnum permissionEnum = PermissionEnum.getPermissionEnum(e.getPermission()); - return new HttpEntity<>(ResponseModel.fail("无" + permissionEnum.getDesc() + "权限").setCode(400)); + return new HttpEntity<>(ResponseModel.fail("无" + permissionEnum.getDesc() + "权限").setErrorCode(ErrorCode.PERMISSION_NOT_FOUND)); + } + + @ExceptionHandler(ParamCheckException.class) + public HttpEntity> paramCheckException(ParamCheckException e){ + return new HttpEntity<>(ResponseModel.fail(e.getMessage()).setCode(403)); } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientFactory.java b/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientFactory.java index 68efbdc..0441f09 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientFactory.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientFactory.java @@ -27,7 +27,7 @@ import org.springframework.util.StringUtils; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:09 上午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientInterception.java b/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientInterception.java index 8d03ae2..8504e08 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientInterception.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/DockerClientInterception.java @@ -9,7 +9,7 @@ import org.springframework.web.servlet.ModelAndView; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:53 上午 */ diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/GoServiceCommand.java b/backend-src/src/main/java/com/taoes/simpledocker/config/GoServiceCommand.java index 3132af7..809f6d8 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/GoServiceCommand.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/GoServiceCommand.java @@ -24,7 +24,7 @@ import org.springframework.util.StringUtils; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:09 上午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/SpringConfig.java b/backend-src/src/main/java/com/taoes/simpledocker/config/SpringConfig.java index 7dd11e1..43ab445 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/SpringConfig.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/SpringConfig.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:49 下午 */ @Component diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/SpringInterception.java b/backend-src/src/main/java/com/taoes/simpledocker/config/SpringInterception.java index 93f346a..cba3d3d 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/SpringInterception.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/SpringInterception.java @@ -10,7 +10,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:49 下午 */ diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/WebSocketConfig.java b/backend-src/src/main/java/com/taoes/simpledocker/config/WebSocketConfig.java index 447f014..7807a9d 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/WebSocketConfig.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/WebSocketConfig.java @@ -7,7 +7,7 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:49 上午 */ @Component diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/AuthController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/AuthController.java index 812e44c..b40d992 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/AuthController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/AuthController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @Api(tags = "认证") diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java index 0f76e42..9e3f473 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @RestController diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java index 75656ad..4e351f1 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java @@ -16,7 +16,7 @@ import java.util.Map; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @RestController diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java index 95a5c24..b9c3443 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java @@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.RestController; /** * 容器相关服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java index 444bd89..3f8553b 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java @@ -28,7 +28,7 @@ import javax.servlet.http.HttpServletResponse; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @RestController diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java index 800dd40..a2aafeb 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java @@ -15,7 +15,7 @@ import java.util.Map; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @RestController diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java index 2e9d60a..4aad557 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java @@ -14,7 +14,7 @@ import java.util.List; /** * 网络控制器接口 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @RestController diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java index a02e401..89340f5 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java @@ -21,7 +21,7 @@ import java.util.List; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @Api(tags = "用户管理") diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java index 06f09dc..637a33a 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @RestController diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/client/DockerClientConfig.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/client/DockerClientConfig.java index 0073751..607bb1a 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/client/DockerClientConfig.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/client/DockerClientConfig.java @@ -5,7 +5,7 @@ import lombok.Data; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:13 上午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/container/OperateContainerRequest.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/container/OperateContainerRequest.java index 06a7db1..dc5e87a 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/container/OperateContainerRequest.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/container/OperateContainerRequest.java @@ -8,7 +8,7 @@ import lombok.Data; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:18 上午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/container/RunNewContainerRequest.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/container/RunNewContainerRequest.java index f3f7877..83e3dc9 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/container/RunNewContainerRequest.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/container/RunNewContainerRequest.java @@ -10,7 +10,7 @@ import java.util.Map; /** * 运行新的容器的请求对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:18 上午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/image/PushImageRequest.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/image/PushImageRequest.java index 5a8730d..fce986b 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/image/PushImageRequest.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/image/PushImageRequest.java @@ -5,7 +5,7 @@ import lombok.Data; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:58 上午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/image/RemoveImageRequest.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/image/RemoveImageRequest.java index ad4e684..f18e061 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/image/RemoveImageRequest.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/image/RemoveImageRequest.java @@ -5,7 +5,7 @@ import lombok.Data; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:58 上午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/RoleResponse.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/RoleResponse.java index 8dd39c1..9a9474e 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/RoleResponse.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/RoleResponse.java @@ -1,6 +1,8 @@ package com.taoes.simpledocker.controller.response.role; +import cn.hutool.core.date.LocalDateTimeUtil; import com.taoes.simpledocker.model.Role; +import com.taoes.simpledocker.utils.TimeUtils; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -16,15 +18,19 @@ import lombok.NoArgsConstructor; @Builder public class RoleResponse { - private Integer id; - private String name; - private String comment; + private Integer id; + private String name; + private String comment; + private String createdAt; + private String updatedAt; - public static RoleResponse factory(Role role) { - RoleResponse roleResponse = new RoleResponse(); - roleResponse.setId(role.getId()); - roleResponse.setName(role.getName()); - roleResponse.setComment(role.getComment()); - return roleResponse; - } + public static RoleResponse factory(Role role) { + RoleResponse roleResponse = new RoleResponse(); + roleResponse.setId(role.getId()); + roleResponse.setName(role.getName()); + roleResponse.setComment(role.getComment()); + roleResponse.setCreatedAt(TimeUtils.format(role.getCreatedAt())); + roleResponse.setUpdatedAt(TimeUtils.format(role.getUpdatedAt())); + return roleResponse; + } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/ConfigDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/ConfigDao.java index 5b66742..7895f20 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/ConfigDao.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/ConfigDao.java @@ -8,7 +8,7 @@ import lombok.Data; /** * 系统配置表 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:11 下午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/DockerConfigDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/DockerConfigDao.java index 2a32632..8e71670 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/DockerConfigDao.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/DockerConfigDao.java @@ -10,7 +10,7 @@ import lombok.Data; /** * docker 服务端配置 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:11 下午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/RoleDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/RoleDao.java index 5ddcc18..3a0dbd8 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/RoleDao.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/RoleDao.java @@ -1,6 +1,7 @@ package com.taoes.simpledocker.dao.bean; import com.baomidou.mybatisplus.annotation.TableName; +import java.time.LocalDateTime; import lombok.Data; /** @@ -11,6 +12,8 @@ import lombok.Data; @TableName("role") public class RoleDao extends BaseDao { - private String comment; - private String name; + private String comment; + private String name; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/UserDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/UserDao.java index 11f64cb..5d46100 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/UserDao.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/UserDao.java @@ -15,7 +15,7 @@ import java.util.List; /** * 用户DAO对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:11 下午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/ConfigMapper.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/ConfigMapper.java index feed55c..6185753 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/ConfigMapper.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/ConfigMapper.java @@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Mapper; /** * Config 的数据库映射对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:17 下午 */ @Mapper diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerEndpointMapper.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerEndpointMapper.java index eb30463..b884e82 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerEndpointMapper.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerEndpointMapper.java @@ -7,7 +7,7 @@ import org.apache.ibatis.annotations.Mapper; /** * docker 端点配置 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:17 下午 */ @Mapper diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerMapper.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerMapper.java index 3f0b61d..2203fbb 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerMapper.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/DockerMapper.java @@ -7,7 +7,7 @@ import org.apache.ibatis.annotations.Mapper; /** * Docker 的数据库映射对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:17 下午 */ @Mapper diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/OperateRecordMapper.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/OperateRecordMapper.java index 76ed2e3..bbfaa60 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/OperateRecordMapper.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/OperateRecordMapper.java @@ -7,7 +7,7 @@ import org.apache.ibatis.annotations.Mapper; /** * Config 的数据库映射对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:17 下午 */ @Mapper diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/UserMapper.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/UserMapper.java index 3044e7c..192f74a 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/UserMapper.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/mapper/UserMapper.java @@ -9,7 +9,7 @@ import org.apache.ibatis.annotations.Mapper; /** * User的数据库映射对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:17 下午 */ @Mapper diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/ConfigRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/ConfigRepository.java index 8c1640d..a5961db 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/ConfigRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/ConfigRepository.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Repository; /** * ConfigRepository 对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:18 下午 */ @Repository diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/DockerRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/DockerRepository.java index 621333f..b14ed53 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/DockerRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/DockerRepository.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; /** * DockerRepository 对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:18 下午 */ @Repository diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/EndpointRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/EndpointRepository.java index fed734a..3efd233 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/EndpointRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/EndpointRepository.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; /** * ConfigRepository 对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:18 下午 */ @Repository diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/OperateRecordRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/OperateRecordRepository.java index 93e1066..c816ccd 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/OperateRecordRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/OperateRecordRepository.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Repository; /** * OperateRecordRepository 对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:18 下午 */ @Repository diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java index c5c862d..361ecd2 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java @@ -1,10 +1,14 @@ package com.taoes.simpledocker.dao.responsity; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.taoes.simpledocker.dao.bean.RoleDao; import com.taoes.simpledocker.dao.mapper.RoleMapper; +import com.taoes.simpledocker.model.Role; +import io.netty.util.internal.StringUtil; +import java.util.Optional; import org.springframework.stereotype.Repository; import java.util.Collection; @@ -19,30 +23,36 @@ import java.util.List; public class RoleRepository extends ServiceImpl { - public List getAll() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - return this.baseMapper.selectList(wrapper); - } + public List getAll() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + return this.baseMapper.selectList(wrapper); + } - public boolean insertRole(RoleDao roleDao) { - return this.baseMapper.insert(roleDao) > 0; - } + public boolean insertRole(RoleDao roleDao) { + return this.baseMapper.insert(roleDao) > 0; + } - public boolean updateRole(RoleDao roleDao) { - return this.baseMapper.updateById(roleDao) > 0; - } + public boolean updateRole(RoleDao roleDao) { + return this.baseMapper.updateById(roleDao) > 0; + } - public boolean deleteRole(Integer id) { - return this.baseMapper.deleteById(id) > 0; - } + public boolean deleteRole(Integer id) { + return this.baseMapper.deleteById(id) > 0; + } - public List getByIds(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(RoleDao::getId, ids); - return this.baseMapper.selectList(wrapper); + public List getByIds(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(RoleDao::getId, ids); + return this.baseMapper.selectList(wrapper); + } + + public int countByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RoleDao::getName, name); + return this.count(wrapper); + } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/UserRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/UserRepository.java index 8bd3af5..dfea195 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/UserRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/UserRepository.java @@ -13,7 +13,7 @@ import java.util.Optional; /** * UserRepository 对象¬ * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:18 下午 */ @Repository diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/DockerConfig.java b/backend-src/src/main/java/com/taoes/simpledocker/model/DockerConfig.java index 0056a1c..8f90ef4 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/DockerConfig.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/DockerConfig.java @@ -6,7 +6,7 @@ import lombok.Data; /** * Docker配置信息 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:26 下午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/ResponseModel.java b/backend-src/src/main/java/com/taoes/simpledocker/model/ResponseModel.java index d01d64c..5e0f8fa 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/ResponseModel.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/ResponseModel.java @@ -1,11 +1,12 @@ package com.taoes.simpledocker.model; +import com.taoes.simpledocker.model.enums.ErrorCode; import lombok.Data; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:26 上午 */ @Data @@ -14,8 +15,23 @@ public class ResponseModel { private T data; + /** + * 错误代码 + * @apiNote 代码400表示登录异常,会被剔除出系统 + */ private int code; + + public ResponseModel setCode(int code) { + this.code = code; + return this; + } + + public ResponseModel setErrorCode(ErrorCode errorCode){ + this.code = errorCode.getCode(); + return this; + } + /** * 失败的数据 * diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java b/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java index 0e8c137..d33ebbc 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import com.taoes.simpledocker.dao.bean.PermissionDao; import com.taoes.simpledocker.dao.bean.RoleDao; import com.taoes.simpledocker.model.enums.PermissionEnum; +import java.time.LocalDateTime; import lombok.Data; import lombok.NoArgsConstructor; @@ -27,6 +28,8 @@ public class Role { private Integer id; private String name; private String comment; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; private List permissions; @@ -44,6 +47,8 @@ public class Role { role.setName(roleDao.getName()); role.setComment(roleDao.getComment()); role.setPermissions(Collections.emptyList()); + role.setCreatedAt(roleDao.getCreatedAt()); + role.setUpdatedAt(roleDao.getUpdatedAt()); return role; } @@ -52,6 +57,8 @@ public class Role { role.setId(roleDao.getId()); role.setName(roleDao.getName()); role.setComment(roleDao.getComment()); + role.setCreatedAt(roleDao.getCreatedAt()); + role.setUpdatedAt(roleDao.getUpdatedAt()); role.setPermissions(convertPermission2Enum(permissions)); return role; } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/User.java b/backend-src/src/main/java/com/taoes/simpledocker/model/User.java index 4447b9e..a27193b 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/User.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/User.java @@ -5,7 +5,7 @@ import lombok.Data; /** * 用户对象 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:26 下午 */ @Data diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ContainerOperate.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ContainerOperate.java index 4c8802b..8b5b033 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ContainerOperate.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ContainerOperate.java @@ -5,7 +5,7 @@ import lombok.AllArgsConstructor; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:15 上午 */ diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/EPlatform.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/EPlatform.java index e19fa05..7b7c9c4 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/EPlatform.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/EPlatform.java @@ -3,7 +3,7 @@ package com.taoes.simpledocker.model.enums; /** * 操作系统平台类型 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:35 下午 */ public enum EPlatform { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ErrorCode.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ErrorCode.java new file mode 100644 index 0000000..04023bf --- /dev/null +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/ErrorCode.java @@ -0,0 +1,27 @@ +package com.taoes.simpledocker.model.enums; + +import lombok.Getter; + +/** + * 错误代码 + */ +public enum ErrorCode { + + SYSTEM_ERROR("未知系统异常", 501001), + DOCKER_ENDPOINT_CONNECT_ERROR("endPoint链接失败", 401001), + PERMISSION_NOT_FOUND("无操作权限", 403001), + ERROR_TOKEN("Token异常", 403002), + NOT_LOGIN("未登录", 403003), + PARAM_ERROR("参数不正确", 405001); + + @Getter + private final String desc; + + @Getter + private final int code; + + ErrorCode(String desc, int code) { + this.desc = desc; + this.code = code; + } +} diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java index 2f5a70d..8fd9026 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java @@ -24,6 +24,20 @@ public enum PermissionEnum { DOCKER_ENDPOINT_DELETE(PermissionGroupEnum.DOCKER_ENDPOINT.getId(), "docker:endpoint:delete", "删除docker节点"), DOCKER_ENDPOINT_QUERY(PermissionGroupEnum.DOCKER_ENDPOINT.getId(), "docker:endpoint:query", "查看docker节点"), + + IMAGE_BUILD(PermissionGroupEnum.IMAGE.getId(),"image:build","构建镜像"), + IMAGE_PUSH(PermissionGroupEnum.IMAGE.getId(),"image:push","推送镜像"), + IMAGE_DELETE(PermissionGroupEnum.IMAGE.getId(),"image:delete","删除镜像"), + IMAGE_TAG(PermissionGroupEnum.IMAGE.getId(),"image:tag","标记镜像"), + IMAGE_BACK(PermissionGroupEnum.IMAGE.getId(),"image:back","备份镜像"), + IMAGE_EXPORT(PermissionGroupEnum.IMAGE.getId(),"image:export","导出镜像"), + + + CONTAINER_CREATE(PermissionGroupEnum.CONTAINER.getId(), "container:create","创建容器"), + CONTAINER_OPERATOR(PermissionGroupEnum.CONTAINER.getId(), "container:operator","操作容器"), + CONTAINER_FILE(PermissionGroupEnum.CONTAINER.getId(), "container:file","容器文件"), + CONTAINER_TERMINAL(PermissionGroupEnum.CONTAINER.getId(), "container:terminal","容器终端"), + USER_ADD(PermissionGroupEnum.USER.getId(), "user:add", "新增用户"), USER_UPDATE(PermissionGroupEnum.USER.getId(), "user:update", "修改用户"), USER_DELETE(PermissionGroupEnum.USER.getId(), "user:delete", "删除用户"), diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java index 0c922b2..474b14c 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java @@ -16,7 +16,11 @@ import java.util.Map; public enum PermissionGroupEnum { ADMIN(0, "超级管理员"), - DOCKER_ENDPOINT(1, "容器资源"), + DOCKER_ENDPOINT(10, "节点"), + IMAGE(11, "镜像"), + CONTAINER(12, "容器"), + VOLUME(13, "储存"), + NETWORK(14, "网络"), USER(21, "用户"), ROLE(22, "角色"), ; diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/NotFoundClientException.java b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/NotFoundClientException.java index 5da4ccc..2a526c6 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/NotFoundClientException.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/NotFoundClientException.java @@ -3,7 +3,7 @@ package com.taoes.simpledocker.model.exception; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:24 上午 */ public class NotFoundClientException extends BaseBizException { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java index 0e8b7e5..813f1a2 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java @@ -3,7 +3,7 @@ package com.taoes.simpledocker.service; /** * 授权服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:23 下午 */ public interface AuthService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/ConfigService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/ConfigService.java index c60c581..9d621bb 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/ConfigService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/ConfigService.java @@ -6,7 +6,7 @@ import java.util.Set; /** * 配置服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:23 下午 */ public interface ConfigService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/ContainerService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/ContainerService.java index 88d157a..a2d2951 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/ContainerService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/ContainerService.java @@ -12,7 +12,7 @@ import com.taoes.simpledocker.controller.container.RunNewContainerRequest; /** * 容器服务接口 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/10 11:31 下午 */ public interface ContainerService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/DockerEndpointService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/DockerEndpointService.java index de71797..07d6b34 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/DockerEndpointService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/DockerEndpointService.java @@ -6,7 +6,7 @@ import java.util.List; /** * docker 服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:23 下午 */ public interface DockerEndpointService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/DockerTestService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/DockerTestService.java index c403d33..12ce756 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/DockerTestService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/DockerTestService.java @@ -3,7 +3,7 @@ package com.taoes.simpledocker.service; /** * docker 服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:23 下午 */ public interface DockerTestService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/GoProgramRunner.java b/backend-src/src/main/java/com/taoes/simpledocker/service/GoProgramRunner.java index 824bceb..6cd7065 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/GoProgramRunner.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/GoProgramRunner.java @@ -5,7 +5,7 @@ import java.util.concurrent.Future; /** * 程序入口 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:41 下午 */ public interface GoProgramRunner { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/ImageService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/ImageService.java index 6b57eea..4223f18 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/ImageService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/ImageService.java @@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletResponse; /** * 镜像相关服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 12:47 上午 */ public interface ImageService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java index 9d50fe4..8e48308 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java @@ -8,7 +8,7 @@ import java.util.List; /** * 用户服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:23 下午 */ public interface UserService { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java index 04bbfa6..5dace51 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java @@ -19,7 +19,7 @@ import java.util.Optional; /** * 授权服务接口实现 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:24 下午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ContainerServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ContainerServiceImpl.java index 1796e51..44ef646 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ContainerServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ContainerServiceImpl.java @@ -27,7 +27,7 @@ import org.springframework.stereotype.Service; /** * 容器服务实现类 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/10 11:40 下午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/GoProgramRunnerImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/GoProgramRunnerImpl.java index f29b966..fb2e4bf 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/GoProgramRunnerImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/GoProgramRunnerImpl.java @@ -14,7 +14,7 @@ import org.springframework.stereotype.Service; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:43 下午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ImageServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ImageServiceImpl.java index 44e2caa..b6b4128 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ImageServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/ImageServiceImpl.java @@ -27,7 +27,7 @@ import javax.servlet.http.HttpServletResponse; /** * 镜像相关服务实现 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 7:32 下午 */ diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java index fc74a39..e772e78 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java @@ -17,6 +17,8 @@ import com.taoes.simpledocker.model.exception.DataNotFoundException; import com.taoes.simpledocker.model.exception.OperateFailException; import com.taoes.simpledocker.model.exception.ParamCheckException; import com.taoes.simpledocker.service.RoleService; +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,6 +30,7 @@ import java.util.stream.Collectors; * @author manwang (569258yin) * @date 2022/7/13 21:53 */ +@Slf4j @Service public class RoleServiceImpl implements RoleService { @@ -46,6 +49,12 @@ public class RoleServiceImpl implements RoleService { @Override public void addRole(Role role) { + final int countByName = roleRepository.countByName(role.getName()); + if (countByName>0){ + log.warn("创建角色:{}失败,当前角色已存在",role.getName()); + throw new OperateFailException("角色已存在"); + } + boolean result = roleRepository.insertRole(role.convertRoleDao()); if (!result) { throw new OperateFailException("保存角色失败"); diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java index 5cc651b..a1f8f96 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java @@ -23,7 +23,7 @@ import java.util.stream.Collectors; /** * 用户服务实现 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:29 下午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/utils/BooleanUtils.java b/backend-src/src/main/java/com/taoes/simpledocker/utils/BooleanUtils.java index d17ef7e..cf9f8ac 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/utils/BooleanUtils.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/utils/BooleanUtils.java @@ -5,7 +5,7 @@ import org.springframework.util.StringUtils; /** * 布尔类型的工具类 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/10 6:32 下午 */ public class BooleanUtils { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java b/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java index 6ee2856..842c312 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java @@ -11,7 +11,7 @@ import java.util.List; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/9 10:33 下午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/utils/OSInfo.java b/backend-src/src/main/java/com/taoes/simpledocker/utils/OSInfo.java index 38cfcc8..c11209b 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/utils/OSInfo.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/utils/OSInfo.java @@ -5,7 +5,7 @@ import com.taoes.simpledocker.model.enums.EPlatform; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:34 下午 */ public class OSInfo { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/utils/TimeUtils.java b/backend-src/src/main/java/com/taoes/simpledocker/utils/TimeUtils.java index 9d57958..9931352 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/utils/TimeUtils.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/utils/TimeUtils.java @@ -6,6 +6,9 @@ import java.time.LocalDateTime; public class TimeUtils { public static String format(LocalDateTime time) { + if (time == null) { + return "-"; + } return LocalDateTimeUtil.format(time, "yyyy-MM-dd HH:mm:ss"); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerFileWebSocket.java b/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerFileWebSocket.java index fa19147..a0822d8 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerFileWebSocket.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerFileWebSocket.java @@ -25,7 +25,7 @@ import org.springframework.stereotype.Component; /** * 容器终端服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:33 上午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerLogWebSocket.java b/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerLogWebSocket.java index 8cd41de..07887c3 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerLogWebSocket.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerLogWebSocket.java @@ -24,7 +24,7 @@ import org.springframework.stereotype.Component; /** * 容器日志服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:33 上午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerTerminalWebSocket.java b/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerTerminalWebSocket.java index 5646e50..1aa0823 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerTerminalWebSocket.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/ws/ContainerTerminalWebSocket.java @@ -22,7 +22,7 @@ import org.springframework.stereotype.Component; /** * 容器终端服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:33 上午 */ @Slf4j diff --git a/backend-src/src/main/java/com/taoes/simpledocker/ws/ImagePullWebSocket.java b/backend-src/src/main/java/com/taoes/simpledocker/ws/ImagePullWebSocket.java index 078ad18..25af551 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/ws/ImagePullWebSocket.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/ws/ImagePullWebSocket.java @@ -29,7 +29,7 @@ import org.springframework.util.StringUtils; /** * 镜像拉取服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/5 1:33 上午 */ @Slf4j diff --git a/backend-src/src/test/java/Main.java b/backend-src/src/test/java/Main.java index b41ca0f..c51ba6e 100644 --- a/backend-src/src/test/java/Main.java +++ b/backend-src/src/test/java/Main.java @@ -9,7 +9,7 @@ import lombok.Synchronized; /** * TODO: please input file info * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/8 12:23 下午 */ public class Main { -- Gitee From 79981cc32c588c83427d47cc80b183453a27d752 Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 17 Jul 2022 12:31:17 +0800 Subject: [PATCH 3/5] =?UTF-8?q?:bug:=20=E5=BC=80=E5=A7=8B=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=20&=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/api/Auth/RoleApi.ts | 19 ++-- admin/src/api/Model/Auth/Permission.ts | 2 + admin/src/api/Model/Auth/PermissionTree.ts | 6 ++ admin/src/component/Auth/RoleList/index.css | 3 - admin/src/component/Auth/RoleList/index.tsx | 89 +++++++++++-------- admin/src/component/Auth/UserList/index.tsx | 9 +- admin/src/page/AuthPage/index.tsx | 12 ++- .../controller/RoleController.java | 14 +++ .../response/role/PermissionTreeResponse.java | 36 ++++++++ .../controller/response/tree/DataNode.java | 14 +++ .../taoes/simpledocker/dao/bean/BaseDao.java | 4 + .../dao/responsity/RoleRepository.java | 4 +- .../simpledocker/service/RoleService.java | 9 ++ .../service/imple/RoleServiceImpl.java | 61 ++++++++++++- database/update.sql | 5 +- 15 files changed, 225 insertions(+), 62 deletions(-) create mode 100644 admin/src/api/Model/Auth/PermissionTree.ts create mode 100644 backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/PermissionTreeResponse.java create mode 100644 backend-src/src/main/java/com/taoes/simpledocker/controller/response/tree/DataNode.java diff --git a/admin/src/api/Auth/RoleApi.ts b/admin/src/api/Auth/RoleApi.ts index 149c3de..464a2f9 100644 --- a/admin/src/api/Auth/RoleApi.ts +++ b/admin/src/api/Auth/RoleApi.ts @@ -1,12 +1,13 @@ import httpRequest from '../Api' -import DockerContainer from "../Model/DockerContainer"; -import UserLoginRequest from "../Model/Auth/UserLoginRequest"; import Role from "../Model/Auth/Role"; import {Base} from "../Base"; import {Page} from "../Page"; import RoleCreatedRequest from "../Model/Auth/RoleCreatedRequest"; import RoleUpdateRequest from "../Model/Auth/RoleUpdateRequest"; import PermissionGroup from "../Model/Auth/PermissionGroup"; +import Permission from "../Model/Auth/Permission"; +import type {DataNode} from 'antd/es/tree' +import PermissionTree from "../Model/Auth/PermissionTree"; /** * 获取角色列表 @@ -36,12 +37,16 @@ function deleteRole(id: number): Promise> { return httpRequest.delete>(`/role?id=${id}`).then(data => data.data); } - /** - * 获取权限组配置 + * 查询角色的权限树 + * @param id */ -function getPermissionGroup(): Promise>> { - return httpRequest.get>>('/role/permission/config').then(data => data.data); +function getPermissionOfRole(id: number): Promise> { + return httpRequest.get>(`/role/permission/${id}/tree`).then(data => data.data); +} + +function saveRolePermission(roleId: number, permissions: Array): Promise> { + return httpRequest.post(`/role/permission`, {roleId, permissions}).then(data => data.data); } -export {roleList, createNewRole, updateRole, deleteRole,getPermissionGroup} \ No newline at end of file +export {roleList, createNewRole, updateRole, deleteRole, getPermissionOfRole, saveRolePermission} \ No newline at end of file diff --git a/admin/src/api/Model/Auth/Permission.ts b/admin/src/api/Model/Auth/Permission.ts index de6ad91..2099e8b 100644 --- a/admin/src/api/Model/Auth/Permission.ts +++ b/admin/src/api/Model/Auth/Permission.ts @@ -2,6 +2,8 @@ interface Permission { groupId: number; permission: string; permissionName:string; + hasPermission?:boolean; + disabled?:boolean; } export default Permission; \ No newline at end of file diff --git a/admin/src/api/Model/Auth/PermissionTree.ts b/admin/src/api/Model/Auth/PermissionTree.ts new file mode 100644 index 0000000..7849bd8 --- /dev/null +++ b/admin/src/api/Model/Auth/PermissionTree.ts @@ -0,0 +1,6 @@ +import type {DataNode} from 'antd/es/tree' + +export default interface PermissionTree { + selectPermissions: Array, + permissionTree: Array +} \ No newline at end of file diff --git a/admin/src/component/Auth/RoleList/index.css b/admin/src/component/Auth/RoleList/index.css index e9658e8..e69de29 100644 --- a/admin/src/component/Auth/RoleList/index.css +++ b/admin/src/component/Auth/RoleList/index.css @@ -1,3 +0,0 @@ -#rolePermissionConfigModal,.ant-modal-body{ - padding: 0 14px 10px 14px !important; -} \ No newline at end of file diff --git a/admin/src/component/Auth/RoleList/index.tsx b/admin/src/component/Auth/RoleList/index.tsx index d4eb95d..b1a495c 100644 --- a/admin/src/component/Auth/RoleList/index.tsx +++ b/admin/src/component/Auth/RoleList/index.tsx @@ -1,12 +1,16 @@ import React from "react"; import Role from "../../../api/Model/Auth/Role"; -import {createNewRole, deleteRole, getPermissionGroup, roleList} from "../../../api/Auth/RoleApi"; -import {Button, Checkbox, Form, Input, message, Modal, Space, Table, Tabs} from "antd"; +import { + createNewRole, + deleteRole, + getPermissionOfRole, + roleList, saveRolePermission +} from "../../../api/Auth/RoleApi"; +import {Button, Form, Input, message, Modal, Space, Table, Tree} from "antd"; import {ColumnsType} from "antd/es/table"; -import {ReloadOutlined, CloudSyncOutlined, ExclamationCircleOutlined} from '@ant-design/icons' -import Search from "antd/es/input/Search"; +import type {DataNode} from "antd/es/tree"; +import {ReloadOutlined, CloudSyncOutlined, ExclamationCircleOutlined,DeleteOutlined,UnlockOutlined} from '@ant-design/icons' import RoleCreatedRequest from "../../../api/Model/Auth/RoleCreatedRequest"; -import PermissionGroup from "../../../api/Model/Auth/PermissionGroup"; import './index.css' interface Props { @@ -19,7 +23,9 @@ interface State { modalForPermission: boolean, currentRoleId: number, newRoleReq: RoleCreatedRequest, - permissionConfig: Array + permissionTree: Array, + selectPermissions: Array + } const {confirm} = Modal; @@ -32,7 +38,8 @@ export default class RoleList extends React.Component { modalForCreateRole: false, modalForPermission: false, roleList: [], - permissionConfig: [], + permissionTree: [], + selectPermissions: [], currentRoleId: 0, newRoleReq: {name: '', comment: ''} } @@ -55,12 +62,6 @@ export default class RoleList extends React.Component { } this.setState({roleList: data.results}) }) - - getPermissionGroup().then(resp => { - if (resp.code === 0) { - this.setState({permissionConfig: resp.data}) - } - }); } @@ -80,7 +81,6 @@ export default class RoleList extends React.Component { message.info(`创建失败,${msg}`); return } - message.info(`创建成功,正在刷新角色列表`) this.setState({modalForCreateRole: false, newRoleReq: {name: '', comment: ''}}) this.refresh() }) @@ -89,6 +89,16 @@ export default class RoleList extends React.Component { * 保存权限 */ savePermission = () => { + saveRolePermission(this.state.currentRoleId, this.state.selectPermissions) + .then(resp => { + if (resp.code !== 0) { + message.error(`配置权限出现错误:${resp.msg}`).then() + return + } + + message.info(`权限保存成功`).then() + this.setState({modalForPermission: false, selectPermissions: []}) + }) } @@ -124,12 +134,26 @@ export default class RoleList extends React.Component { currentRoleId: role.id, modalForPermission: true }) + + // 查询权限详情 + getPermissionOfRole(role.id).then(resp => { + if (resp.code !== 0) { + message.error(`查询角色信息出现异常,${resp.msg}`).then(); + return + } + this.setState({...resp.data}) + }) } onRoleChange = (_: any, value: RoleCreatedRequest) => { this.setState({newRoleReq: value}) } + + onCheck = (e: { checked: boolean, checkedNodes: Array }) => { + this.setState({selectPermissions: e.checkedNodes.map(p => p.key.toString())}) + } + render() { const columns: ColumnsType = [ { @@ -171,28 +195,25 @@ export default class RoleList extends React.Component { title: '操作', dataIndex: 'id', fixed: 'right', - width: 180, + width: 80, render: (_, role: Role) => { return ( - - - + + ) } } ] + return (
- - - + +
{ visible={this.state.modalForPermission} onOk={() => this.savePermission()} onCancel={() => this.setState({modalForPermission: false})} - footer={null} > - - { - this.state.permissionConfig.map(group => { - return - { - group.permissions.map(p => { - return {p.permissionName} - }) - } - - }) - } - + + this.onCheck(t)} + checkedKeys={this.state.selectPermissions} + treeData={this.state.permissionTree} + /> diff --git a/admin/src/component/Auth/UserList/index.tsx b/admin/src/component/Auth/UserList/index.tsx index 110d8e6..b55192e 100644 --- a/admin/src/component/Auth/UserList/index.tsx +++ b/admin/src/component/Auth/UserList/index.tsx @@ -1,6 +1,6 @@ import Search from "antd/es/input/Search"; import {Button, message, Modal, Space, Table} from "antd"; -import {CloudSyncOutlined, ReloadOutlined} from "@ant-design/icons"; +import {CloudSyncOutlined, ReloadOutlined,DeleteOutlined,UserSwitchOutlined} from "@ant-design/icons"; import {ColumnsType} from "antd/es/table"; import User from "../../../api/Model/User"; import {useEffect, useState} from "react"; @@ -46,13 +46,12 @@ const columns: ColumnsType = [ title: '操作', dataIndex: 'address', fixed: 'right', - width: 120, + width: 80, render: (_, user: User) => { return ( - - - + + ) } diff --git a/admin/src/page/AuthPage/index.tsx b/admin/src/page/AuthPage/index.tsx index 77839f2..296bbbd 100644 --- a/admin/src/page/AuthPage/index.tsx +++ b/admin/src/page/AuthPage/index.tsx @@ -3,6 +3,7 @@ import {Tabs} from "antd"; import UserList from "../../component/Auth/UserList"; import RoleList from "../../component/Auth/RoleList"; import PermissionList from "../../component/Auth/PermissionList"; +import IconFont from "../../component/Base/IconFont"; interface Props { @@ -13,24 +14,27 @@ interface State { } - const {TabPane} = Tabs; export default class AuthPage extends React.Component { constructor(props: Props) { super(props); } + createTab = (icon: string, text: string): React.ReactNode => { + return {text} + } + render() { return (
- + - + - + diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/RoleController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/RoleController.java index eea9a1d..8b59e19 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/RoleController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/RoleController.java @@ -8,7 +8,9 @@ import com.taoes.simpledocker.controller.request.role.RolePermissionSaveRequest; import com.taoes.simpledocker.controller.request.role.RoleUpdateRequest; import com.taoes.simpledocker.controller.response.role.PermissionGroupResponse; import com.taoes.simpledocker.controller.response.role.PermissionResponse; +import com.taoes.simpledocker.controller.response.role.PermissionTreeResponse; import com.taoes.simpledocker.controller.response.role.RoleResponse; +import com.taoes.simpledocker.controller.response.tree.DataNode; import com.taoes.simpledocker.model.PageModel; import com.taoes.simpledocker.model.ResponseModel; import com.taoes.simpledocker.model.Role; @@ -18,6 +20,9 @@ import com.taoes.simpledocker.model.exception.DataNotFoundException; import com.taoes.simpledocker.service.RoleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import java.util.ArrayList; +import java.util.Set; +import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; @@ -122,6 +127,15 @@ public class RoleController { ); } + + @ApiOperation("获取当前角色下已配置的权限树(包含已有权限)") + @SaCheckPermission(value = "role:permission:query", orRole = Role.ADMIN_ROLE_NAME) + @GetMapping("/permission/{id}/tree") + public ResponseModel getPermissionTreeByRoleId(@PathVariable("id") Integer id) { + final PermissionTreeResponse tree = roleService.createPermissionTree(id); + return ResponseModel.ok(tree); + } + @ApiOperation("变更角色权限") @SaCheckPermission(value = "role:permission:save", orRole = Role.ADMIN_ROLE_NAME) @PostMapping("/permission") diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/PermissionTreeResponse.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/PermissionTreeResponse.java new file mode 100644 index 0000000..342d65e --- /dev/null +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/PermissionTreeResponse.java @@ -0,0 +1,36 @@ +package com.taoes.simpledocker.controller.response.role; + +import com.taoes.simpledocker.controller.response.tree.DataNode; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import lombok.Data; + +/** + * 角色的权限树 + */ +@Data +public class PermissionTreeResponse { + + public final static PermissionTreeResponse EMPTY; + + static { + EMPTY = new PermissionTreeResponse(Collections.emptyList(),Collections.emptyList()); + } + + /** + * 已选择的的权限 + */ + private Collection selectPermissions; + + + /** + * 权限分组 + */ + private List permissionTree; + + public PermissionTreeResponse(Collection selectPermissions, List permissionTree) { + this.selectPermissions = selectPermissions; + this.permissionTree = permissionTree; + } +} diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/response/tree/DataNode.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/tree/DataNode.java new file mode 100644 index 0000000..25d7dc8 --- /dev/null +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/tree/DataNode.java @@ -0,0 +1,14 @@ +package com.taoes.simpledocker.controller.response.tree; + +import java.util.List; +import lombok.Data; + +@Data +public class DataNode { + + private String key; + private String title; + private List children; + private boolean disabled; + private boolean selectable; +} \ No newline at end of file diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/BaseDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/BaseDao.java index 68cf381..b76716f 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/BaseDao.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/BaseDao.java @@ -16,4 +16,8 @@ public class BaseDao { protected Integer id; @TableLogic protected Integer deleted; + + public boolean deleted(){ + return this.deleted == 1; + } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java index 361ecd2..4c68895 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java @@ -50,9 +50,9 @@ public class RoleRepository extends ServiceImpl { return this.baseMapper.selectList(wrapper); } - public int countByName(String name) { + public RoleDao findByName(String name) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(RoleDao::getName, name); - return this.count(wrapper); + return this.baseMapper.selectOne(wrapper); } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java index 7b0694a..ae22c62 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java @@ -1,5 +1,6 @@ package com.taoes.simpledocker.service; +import com.taoes.simpledocker.controller.response.role.PermissionTreeResponse; import com.taoes.simpledocker.model.PageModel; import com.taoes.simpledocker.model.Role; @@ -25,4 +26,12 @@ public interface RoleService { void savePermission(Integer roleId, List permissions); + + /** + * 创建角色树信息 + * + * @param id 角色ID + * @return + */ + PermissionTreeResponse createPermissionTree(Integer id); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java index e772e78..f2a223f 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java @@ -2,10 +2,13 @@ package com.taoes.simpledocker.service.imple; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.github.pagehelper.PageInfo; import com.github.pagehelper.page.PageMethod; import com.google.common.collect.Lists; +import com.taoes.simpledocker.controller.response.role.PermissionTreeResponse; +import com.taoes.simpledocker.controller.response.tree.DataNode; import com.taoes.simpledocker.dao.bean.PermissionDao; import com.taoes.simpledocker.dao.bean.RoleDao; import com.taoes.simpledocker.dao.responsity.PermissionRepository; @@ -13,11 +16,15 @@ import com.taoes.simpledocker.dao.responsity.RoleRepository; import com.taoes.simpledocker.model.PageModel; import com.taoes.simpledocker.model.Role; import com.taoes.simpledocker.model.enums.PermissionEnum; +import com.taoes.simpledocker.model.enums.PermissionGroupEnum; import com.taoes.simpledocker.model.exception.DataNotFoundException; import com.taoes.simpledocker.model.exception.OperateFailException; import com.taoes.simpledocker.model.exception.ParamCheckException; import com.taoes.simpledocker.service.RoleService; -import java.util.Optional; +import java.util.ArrayList; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -49,12 +56,13 @@ public class RoleServiceImpl implements RoleService { @Override public void addRole(Role role) { - final int countByName = roleRepository.countByName(role.getName()); - if (countByName>0){ + final RoleDao roleDao = roleRepository.findByName(role.getName()); + if (roleDao!=null && !roleDao.deleted()){ log.warn("创建角色:{}失败,当前角色已存在",role.getName()); throw new OperateFailException("角色已存在"); } + // 如果不存在,则直接新增 boolean result = roleRepository.insertRole(role.convertRoleDao()); if (!result) { throw new OperateFailException("保存角色失败"); @@ -105,10 +113,16 @@ public class RoleServiceImpl implements RoleService { public void savePermission(Integer roleId, List permissions) { checkRole(roleId); for (String permission : permissions) { + if (NumberUtil.isInteger(permission)){ + continue; + } PermissionEnum.getPermissionEnum(permission); } List permissionDaoList = Lists.newArrayListWithCapacity(permissions.size()); for (String permission : permissions) { + if (NumberUtil.isInteger(permission)){ + continue; + } permissionDaoList.add(new PermissionDao(roleId, permission)); } boolean result = permissionRepository.savePermission(roleId, permissionDaoList); @@ -117,6 +131,47 @@ public class RoleServiceImpl implements RoleService { } } + @Override + public PermissionTreeResponse createPermissionTree(Integer id) { + Role role = this.getById(id); + if (role == null) { + throw new DataNotFoundException("角色不存在或已删除"); + } + + // 构建权限树 + final List nodes = new ArrayList<>(); + Map> groupPermissionMap = PermissionEnum.getGroupPermission(); + groupPermissionMap.forEach((groupId, list) -> { + PermissionGroupEnum groupEnum = PermissionGroupEnum.getPermissionGroup(groupId); + final DataNode dataNode = new DataNode(); + dataNode.setDisabled(Objects.equals(role.getName(),Role.ADMIN_ROLE_NAME)); + dataNode.setKey(groupId.toString()); + dataNode.setTitle(groupEnum.getDesc()); + dataNode.setSelectable(Objects.equals(role.getName(),Role.ADMIN_ROLE_NAME)); + + List children = new ArrayList<>(); + for (PermissionEnum permissionEnum : list) { + DataNode node = new DataNode(); + node.setKey(permissionEnum.getPermission()); + node.setTitle(permissionEnum.getDesc()); + node.setSelectable(Objects.equals(role.getName(),Role.ADMIN_ROLE_NAME)); + node.setDisabled(Objects.equals(role.getName(),Role.ADMIN_ROLE_NAME)); + children.add(node); + } + dataNode.setChildren(children); + nodes.add(dataNode); + }); + + if (CollUtil.isEmpty(role.getPermissions())) { + return new PermissionTreeResponse(Collections.emptyList(),nodes); + } + + final Set selectedPermission = role.getPermissions().stream() + .map(PermissionEnum::getPermission).collect(Collectors.toSet()); + + return new PermissionTreeResponse(selectedPermission,nodes); + } + private void checkRole(Integer id) { RoleDao roleDao = roleRepository.getById(id); if (roleDao == null) { diff --git a/database/update.sql b/database/update.sql index 918d8ea..adee66d 100644 --- a/database/update.sql +++ b/database/update.sql @@ -22,7 +22,6 @@ CREATE TABLE `permission` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ALTER TABLE `user` - CHANGE COLUMN `username` `account` varchar(128) NOT NULL COMMENT '账号' AFTER `id`, ADD COLUMN `role_ids` varchar(255) NOT NULL DEFAULT '[]' COMMENT '角色数组' AFTER `salt_value`, ADD COLUMN `deleted` tinyint(1) NOT NULL DEFAULT '0', ADD COLUMN `name` varchar(64) NULL COMMENT '昵称' AFTER `id`; @@ -30,3 +29,7 @@ ALTER TABLE `user` INSERT INTO `sd`.`role` (`id`, `name`, `comment`, `deleted`) VALUES (1, 'admin', '超级管理员', 0); + +ALTER TABLE `sd`.`role` +DROP INDEX `uk_name`, +ADD INDEX `uk_name`(`name` ASC) USING BTREE; -- Gitee From 6c71404c4a9cf6da61f0be7175d50c43cbed7689 Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 17 Jul 2022 22:27:55 +0800 Subject: [PATCH 4/5] =?UTF-8?q?:bug:=20=E5=AE=8C=E6=88=90=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=96=B0=E5=A2=9E=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/api/Model/Auth/RoleUpdateRequest.ts | 2 +- .../src/api/Model/Auth/UserCreatedRequest.ts | 8 + admin/src/api/User/UserApi.ts | 23 ++- admin/src/component/Auth/Role/index.jsx | 3 + admin/src/component/Auth/RoleList/index.tsx | 103 +++++++++- admin/src/component/Auth/UserList/index.tsx | 177 ++++++++++++++---- .../controller/UserController.java | 13 ++ .../controller/auth/UserCreateRequest.java | 16 ++ .../simpledocker/converter/UserConverter.java | 7 +- .../dao/responsity/RoleRepository.java | 2 + .../com/taoes/simpledocker/model/User.java | 4 + .../simpledocker/service/UserService.java | 9 +- .../service/imple/UserServiceImpl.java | 23 ++- 13 files changed, 329 insertions(+), 61 deletions(-) create mode 100644 admin/src/api/Model/Auth/UserCreatedRequest.ts create mode 100644 admin/src/component/Auth/Role/index.jsx create mode 100644 backend-src/src/main/java/com/taoes/simpledocker/controller/auth/UserCreateRequest.java diff --git a/admin/src/api/Model/Auth/RoleUpdateRequest.ts b/admin/src/api/Model/Auth/RoleUpdateRequest.ts index 58e1e51..e358f8f 100644 --- a/admin/src/api/Model/Auth/RoleUpdateRequest.ts +++ b/admin/src/api/Model/Auth/RoleUpdateRequest.ts @@ -1,5 +1,5 @@ import RoleCreatedRequest from "./RoleCreatedRequest"; export default interface RoleUpdateRequest extends RoleCreatedRequest { - id: number + id?: number } \ No newline at end of file diff --git a/admin/src/api/Model/Auth/UserCreatedRequest.ts b/admin/src/api/Model/Auth/UserCreatedRequest.ts new file mode 100644 index 0000000..5defb5c --- /dev/null +++ b/admin/src/api/Model/Auth/UserCreatedRequest.ts @@ -0,0 +1,8 @@ +interface UserCreatedRequest { + account: string; + name: string; + roleIds: Array; +} + + +export default UserCreatedRequest \ No newline at end of file diff --git a/admin/src/api/User/UserApi.ts b/admin/src/api/User/UserApi.ts index dc12b65..c682608 100644 --- a/admin/src/api/User/UserApi.ts +++ b/admin/src/api/User/UserApi.ts @@ -1,17 +1,26 @@ import httpRequest from '../Api' import User from "../Model/User"; +import UserCreatedRequest from "../Model/Auth/UserCreatedRequest"; +import {Base} from "../Base"; interface UserResp { - code:number - data:Array - msg:string + code: number + data: Array + msg: string } /** - * 获取容器列表 + * 获取用户列表 */ -function userList(): Promise { - return httpRequest.get('/user').then(data => data.data); +function userList(): Promise>> { + return httpRequest.get>>('/user').then(data => data.data); } -export {userList} \ No newline at end of file +/** + * 创建新的用户 + */ +function createNewUser(req: UserCreatedRequest): Promise> { + return httpRequest.post>(`/user`, req).then(data => data.data); +} + +export {userList,createNewUser} \ No newline at end of file diff --git a/admin/src/component/Auth/Role/index.jsx b/admin/src/component/Auth/Role/index.jsx new file mode 100644 index 0000000..320bad1 --- /dev/null +++ b/admin/src/component/Auth/Role/index.jsx @@ -0,0 +1,3 @@ + + +export default class RoleList extends React.Component{} \ No newline at end of file diff --git a/admin/src/component/Auth/RoleList/index.tsx b/admin/src/component/Auth/RoleList/index.tsx index b1a495c..8c63adc 100644 --- a/admin/src/component/Auth/RoleList/index.tsx +++ b/admin/src/component/Auth/RoleList/index.tsx @@ -4,14 +4,22 @@ import { createNewRole, deleteRole, getPermissionOfRole, - roleList, saveRolePermission + roleList, saveRolePermission, updateRole } from "../../../api/Auth/RoleApi"; import {Button, Form, Input, message, Modal, Space, Table, Tree} from "antd"; import {ColumnsType} from "antd/es/table"; import type {DataNode} from "antd/es/tree"; -import {ReloadOutlined, CloudSyncOutlined, ExclamationCircleOutlined,DeleteOutlined,UnlockOutlined} from '@ant-design/icons' +import { + ReloadOutlined, + CloudSyncOutlined, + ExclamationCircleOutlined, + DeleteOutlined, + UnlockOutlined, + CloudUploadOutlined +} from '@ant-design/icons' import RoleCreatedRequest from "../../../api/Model/Auth/RoleCreatedRequest"; import './index.css' +import RoleUpdateRequest from "../../../api/Model/Auth/RoleUpdateRequest"; interface Props { @@ -21,6 +29,7 @@ interface State { roleList: Array, modalForCreateRole: boolean, modalForPermission: boolean, + modalForUpdateRole: boolean, currentRoleId: number, newRoleReq: RoleCreatedRequest, permissionTree: Array, @@ -32,11 +41,14 @@ const {confirm} = Modal; export default class RoleList extends React.Component { + private updateRoleReq: RoleUpdateRequest = {} + constructor(props: Props) { super(props); this.state = { modalForCreateRole: false, modalForPermission: false, + modalForUpdateRole: false, roleList: [], permissionTree: [], selectPermissions: [], @@ -71,20 +83,45 @@ export default class RoleList extends React.Component { saveRole = () => { // 检查数据 let data = this.state.newRoleReq; - if (data.name?.trim() === '' || data.comment?.trim() === '') { - message.error(`创建失败,角色信息不能为空`) + let dataUndefine = !data.name || !data.comment + if (dataUndefine || data.name?.trim() === '' || data.comment?.trim() === '') { + message.error(`创建失败,角色信息不能为空`).then(); return } createNewRole(data).then(resp => { let {code, msg} = resp; if (code !== 0) { - message.info(`创建失败,${msg}`); + message.info(`创建失败,${msg}`).then(); return } this.setState({modalForCreateRole: false, newRoleReq: {name: '', comment: ''}}) this.refresh() }) } + + /** + * 保存角色 + */ + updateRoleInfo = () => { + // 检查数据 + let data = this.updateRoleReq; + let dataUndefine = !data.name || !data.comment + if (dataUndefine || data.name === '' || data.comment === '') { + message.error(`更新失败,角色信息不能为空`).then() + return + } + + updateRole(data).then(resp => { + let {code, msg} = resp; + if (code !== 0) { + message.info(`更新失败,${msg}`).then(); + return + } + this.setState({modalForUpdateRole: false}) + this.refresh() + }) + } + /** * 保存权限 */ @@ -129,6 +166,10 @@ export default class RoleList extends React.Component { }); } + /** + * 更新角色权限 + * @param role + */ updatePermission = (role: Role) => { this.setState({ currentRoleId: role.id, @@ -149,6 +190,18 @@ export default class RoleList extends React.Component { this.setState({newRoleReq: value}) } + showUpdateModal = (role: Role) => { + this.setState({ + currentRoleId: role.id, + modalForUpdateRole: true + }) + } + + onUpdateRoleChange = (_: any, value: RoleUpdateRequest) => { + value.id = this.state.currentRoleId + this.updateRoleReq = value; + } + onCheck = (e: { checked: boolean, checkedNodes: Array }) => { this.setState({selectPermissions: e.checkedNodes.map(p => p.key.toString())}) @@ -173,8 +226,8 @@ export default class RoleList extends React.Component { { title: '角色描述', dataIndex: 'comment', - render: comment => {comment}, ellipsis: true, + render: comment => {comment}, width: 150, }, { @@ -195,12 +248,16 @@ export default class RoleList extends React.Component { title: '操作', dataIndex: 'id', fixed: 'right', - width: 80, + width: 120, render: (_, role: Role) => { return ( - - + + + ) } @@ -213,7 +270,8 @@ export default class RoleList extends React.Component {
- +
{ + + this.updateRoleInfo()} + onCancel={() => this.setState({modalForUpdateRole: false})}> +
+ + + + + + + + + + +
+
= [ { @@ -50,8 +53,8 @@ const columns: ColumnsType = [ render: (_, user: User) => { return ( - - + + ) } @@ -59,51 +62,147 @@ const columns: ColumnsType = [ } ] -function UserList() { +interface Props { - let [users, setUsers] = useState>([]) +} + +interface State { + users: Array, + modalOfCreateUser: boolean +} + +export default class UserList extends React.Component { - let [createUserState, setCreateUserState] = useState(false) - useEffect(() => refresh(false), []) + private newUserInfo: UserCreatedRequest = {name: '', account: '', roleIds: []} + + private roles: Array = [] + + constructor(props: Props) { + super(props); + this.state = { + users: [], + modalOfCreateUser: false + } + } - let refresh = (fresh: boolean) => { + componentDidMount() { + this.refresh(false); + this.loadRoles(); + } + + loadRoles = () => { + roleList(1, 100).then(resp => { + if (resp.code !== 0) { + message.error(`角色列表加载失败,${resp.msg}`).then(); + return + } + this.roles = resp.data.results; + }); + } + + refresh = (fresh: boolean) => { if (fresh) { message.info("开始刷新用户列表中").then(); } userList().then(resp => { - setUsers(resp.data) + if (resp.code !== 0) { + message.error(`加载用户列表失败,${resp.msg}`).then(); + return + } + this.setState({users: resp.data}) }) } + showCreateUserModal = () => { + this.setState({modalOfCreateUser: true}) + } + + hideCreateUserModal = () => { + this.setState({modalOfCreateUser: false}) + } + + createUser = () => { + let info = this.newUserInfo; + if (info.name === '' || info.account === '') { + message.error(`创建用户失败,用户信息不完整`).then(); + return + } + createNewUser(info).then(resp => { + if (resp.code !== 0) { + message.error(`创建用户失败,${resp.msg}`).then(); + return + } + this.refresh(false) + message.info(`创建用户成功`).then(); + this.hideCreateUserModal() + }) + - let createUser = () => { - setCreateUserState(true) + } + createUserInfoChange = (_: any, value: UserCreatedRequest) => { + this.newUserInfo = value + console.log(this.newUserInfo) } - return ( -
-
-
- - - + + render() { + return ( +
+
+
+ + + +
-
-
record.id}/> - - setCreateUserState(false)} - onCancel={() => setCreateUserState(false)}> - - - - ) -} +
record.id}/> -export default UserList; \ No newline at end of file + this.createUser()} + onCancel={() => this.hideCreateUserModal()}> +
+ + + + + + + + + + + + + + + +
+ + ); + } +} \ No newline at end of file diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java index 89340f5..3c9bb9e 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java @@ -1,11 +1,14 @@ package com.taoes.simpledocker.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.taoes.simpledocker.controller.auth.UserCreateRequest; +import com.taoes.simpledocker.controller.auth.UserResetRequest; import com.taoes.simpledocker.controller.request.user.UserAuthRoleRequest; import com.taoes.simpledocker.model.ResponseModel; import com.taoes.simpledocker.model.Role; import com.taoes.simpledocker.model.User; import com.taoes.simpledocker.service.UserService; +import com.taoes.simpledocker.utils.JsonUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -38,6 +41,16 @@ public class UserController { return ResponseModel.ok(list); } + @PostMapping + public ResponseModel create(@RequestBody UserCreateRequest request){ + User user = new User(); + user.setAccount(request.getAccount()) + .setName(request.getName()) + .setRoleIds(JsonUtils.toJsonString(request.getRoleIds())); + userService.create(user); + return ResponseModel.ok(true); + } + @ApiOperation("配置用户角色") @SaCheckPermission(value = "user:authRole", orRole = Role.ADMIN_ROLE_NAME) @PostMapping("auth_role") diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/auth/UserCreateRequest.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/auth/UserCreateRequest.java new file mode 100644 index 0000000..9d5519d --- /dev/null +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/auth/UserCreateRequest.java @@ -0,0 +1,16 @@ +package com.taoes.simpledocker.controller.auth; + +import java.time.LocalDateTime; +import java.util.List; +import lombok.Data; + +@Data +public class UserCreateRequest { + + private String account; + + private String name; + + private List roleIds; + +} diff --git a/backend-src/src/main/java/com/taoes/simpledocker/converter/UserConverter.java b/backend-src/src/main/java/com/taoes/simpledocker/converter/UserConverter.java index df02707..560077f 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/converter/UserConverter.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/converter/UserConverter.java @@ -26,6 +26,11 @@ public class UserConverter extends AbstractConverter { @Override public UserDao to(User user) { - return null; + return new UserDao() + .setAccount(user.getAccount()) + .setName(user.getName()) + .setPassword(user.getAccount()) + .setRoleIds(user.getRoleIds()) + .setSaltValue(user.getAccount()); } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java index 4c68895..ba0af21 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/dao/responsity/RoleRepository.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.taoes.simpledocker.dao.bean.BaseDao; import com.taoes.simpledocker.dao.bean.RoleDao; import com.taoes.simpledocker.dao.mapper.RoleMapper; import com.taoes.simpledocker.model.Role; @@ -25,6 +26,7 @@ public class RoleRepository extends ServiceImpl { public List getAll() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByDesc(BaseDao::getId); return this.baseMapper.selectList(wrapper); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/User.java b/backend-src/src/main/java/com/taoes/simpledocker/model/User.java index a27193b..b42c200 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/model/User.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/model/User.java @@ -24,6 +24,10 @@ public class User { */ private String name; + /** + * 角色信息 + */ + private String roleIds; /** * 创建时间 diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java index 8e48308..d25f05e 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java @@ -19,7 +19,7 @@ public interface UserService { * @param username 账户民 * @return 生成的token */ - User findByName(String username); + User findByAccount(String username); /** * 禁用用户 @@ -40,4 +40,11 @@ public interface UserService { void authRole(Long userId, List roleIds); List getUserRoles(Long userId); + + /** + * 创建新用户 + * + * @param user 用户 + */ + void create(User user); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java index a1f8f96..6c4475b 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java @@ -1,6 +1,7 @@ package com.taoes.simpledocker.service.imple; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.taoes.simpledocker.converter.UserConverter; import com.taoes.simpledocker.dao.bean.RoleDao; import com.taoes.simpledocker.dao.bean.UserDao; @@ -42,7 +43,7 @@ public class UserServiceImpl implements UserService { private RoleRepository roleRepository; @Override - public User findByName(String username) { + public User findByAccount(String username) { return null; } @@ -59,7 +60,10 @@ public class UserServiceImpl implements UserService { @Override public List list() { - return userRepository.list().stream().map(userConverter::from).collect(Collectors.toList()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByDesc(UserDao::getId); + final List userList = this.userRepository.list(wrapper); + return userList.stream().map(userConverter::from).collect(Collectors.toList()); } @Override @@ -89,4 +93,19 @@ public class UserServiceImpl implements UserService { } return roleService.getByIds(roleIds); } + + @Override + public void create(User user) { + final String account = user.getAccount(); + final User userOfExist = this.findByAccount(account); + if (userOfExist != null){ + throw new ParamCheckException("用户名已存在"); + } + + final UserDao userDao = userConverter.to(user); + userRepository.save(userDao); + } + + + } -- Gitee From 2d89ecd4afc0bc399906db66c44713eb18674cec Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 17 Jul 2022 23:39:57 +0800 Subject: [PATCH 5/5] =?UTF-8?q?:bug:=20=E5=AE=8C=E6=88=90=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=88=A0=E9=99=A4=E9=80=BB=E8=BE=91(=E5=BE=85?= =?UTF-8?q?=E6=B5=8B=E8=AF=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/api/User/UserApi.ts | 10 +- admin/src/component/Auth/UserList/index.tsx | 123 ++++++++++-------- .../interceptor/UserLoginInterceptor.java | 2 +- .../controller/ClientController.java | 4 + .../controller/ConfigController.java | 8 ++ .../controller/ContainerController.java | 20 ++- .../controller/ImageController.java | 23 ++++ .../controller/InfoController.java | 12 +- .../controller/MonitorController.java | 7 +- .../controller/NetWorkController.java | 24 ++-- .../controller/UserController.java | 27 +++- .../controller/VolumeController.java | 18 ++- .../simpledocker/service/UserService.java | 7 + .../service/imple/UserServiceImpl.java | 6 +- 14 files changed, 212 insertions(+), 79 deletions(-) diff --git a/admin/src/api/User/UserApi.ts b/admin/src/api/User/UserApi.ts index c682608..708a04c 100644 --- a/admin/src/api/User/UserApi.ts +++ b/admin/src/api/User/UserApi.ts @@ -23,4 +23,12 @@ function createNewUser(req: UserCreatedRequest): Promise> { return httpRequest.post>(`/user`, req).then(data => data.data); } -export {userList,createNewUser} \ No newline at end of file + +/** + * 移除用户 + */ +function removeUserApi(id: number): Promise> { + return httpRequest.delete(`/user/${id}`).then(data => data.data); +} + +export {userList, createNewUser,removeUserApi} \ No newline at end of file diff --git a/admin/src/component/Auth/UserList/index.tsx b/admin/src/component/Auth/UserList/index.tsx index 57729de..9a9c9ca 100644 --- a/admin/src/component/Auth/UserList/index.tsx +++ b/admin/src/component/Auth/UserList/index.tsx @@ -4,63 +4,13 @@ import {CloudSyncOutlined, ReloadOutlined, DeleteOutlined, UserSwitchOutlined} f import {ColumnsType} from "antd/es/table"; import User from "../../../api/Model/User"; import React, {useEffect, useState} from "react"; -import {userList, createNewUser} from "../../../api/User/UserApi"; +import {userList, createNewUser, removeUserApi} from "../../../api/User/UserApi"; import UserCreate from "../../../component/App/User/UserCreate"; import UserCreatedRequest from "../../../api/Model/Auth/UserCreatedRequest"; import Role from "../../../api/Model/Auth/Role"; import {roleList} from "../../../api/Auth/RoleApi"; -const columns: ColumnsType = [ - { - title: '用户ID', - dataIndex: 'id', - render: id => {id}, - ellipsis: true, - width: 150, - }, - { - title: '用户名', - dataIndex: 'account', - render: account => {account}, - ellipsis: true, - width: 150, - }, - { - title: '角色', - dataIndex: 'role', - render: role => ADMIN, - ellipsis: true, - width: 150, - }, - { - title: '创建时间', - dataIndex: 'createdAt', - render: createdAt => {createdAt}, - ellipsis: true, - width: 150, - }, - { - title: '更新时间', - dataIndex: 'updatedAt', - render: updatedAt => {updatedAt}, - ellipsis: true, - width: 150, - }, { - title: '操作', - dataIndex: 'address', - fixed: 'right', - width: 80, - render: (_, user: User) => { - return ( - - - - - ) - } - } -] interface Props { @@ -77,12 +27,66 @@ export default class UserList extends React.Component { private roles: Array = [] + private readonly columns:ColumnsType =[]; + constructor(props: Props) { super(props); this.state = { users: [], modalOfCreateUser: false } + + this.columns = [ + { + title: '用户ID', + dataIndex: 'id', + render: id => {id}, + ellipsis: true, + width: 150, + }, + { + title: '用户名', + dataIndex: 'account', + render: account => {account}, + ellipsis: true, + width: 150, + }, + { + title: '角色', + dataIndex: 'role', + render: role => ADMIN, + ellipsis: true, + width: 150, + }, + { + title: '创建时间', + dataIndex: 'createdAt', + render: createdAt => {createdAt}, + ellipsis: true, + width: 150, + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + render: updatedAt => {updatedAt}, + ellipsis: true, + width: 150, + }, { + title: '操作', + dataIndex: 'address', + fixed: 'right', + width: 80, + render: (_, user: User) => { + return ( + + + + + ) + } + + } + ] } componentDidMount() { @@ -136,8 +140,6 @@ export default class UserList extends React.Component { message.info(`创建用户成功`).then(); this.hideCreateUserModal() }) - - } createUserInfoChange = (_: any, value: UserCreatedRequest) => { @@ -145,6 +147,17 @@ export default class UserList extends React.Component { console.log(this.newUserInfo) } + removeUser = (user: User) => { + removeUserApi(user.id).then(resp => { + if (resp.code !== 0) { + message.error(`删除用户失败,${resp.msg}`).then(); + return + } + message.info('删除用户完成').then(); + this.refresh(true); + }); + } + render() { return (
@@ -159,7 +172,7 @@ export default class UserList extends React.Component {
record.id}/> @@ -191,7 +204,7 @@ export default class UserList extends React.Component { name="roleIds" rules={[{required: true}]} > - { this.roles.map(r => { return {r.name} diff --git a/backend-src/src/main/java/com/taoes/simpledocker/config/interceptor/UserLoginInterceptor.java b/backend-src/src/main/java/com/taoes/simpledocker/config/interceptor/UserLoginInterceptor.java index 34152cb..5a782ee 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/config/interceptor/UserLoginInterceptor.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/config/interceptor/UserLoginInterceptor.java @@ -16,7 +16,7 @@ public class UserLoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - log.info("url={}",request.getRequestURL().toString()); + log.info("url={}", request.getRequestURL().toString()); StpUtil.checkLogin(); return HandlerInterceptor.super.preHandle(request, response, handler); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java index 9e3f473..45acd0e 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ClientController.java @@ -3,6 +3,8 @@ package com.taoes.simpledocker.controller; import com.taoes.simpledocker.model.DockerEndpoint; import com.taoes.simpledocker.model.ResponseModel; import com.taoes.simpledocker.service.DockerEndpointService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; @@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController; * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ +@Api(tags = "Docker客户端") @RestController @RequestMapping("/api/endpoint") @RequiredArgsConstructor @@ -22,6 +25,7 @@ public class ClientController { private final DockerEndpointService dockerEndpointService; + @ApiOperation("Docker端列表") @GetMapping public ResponseModel> list() { return ResponseModel.ok(dockerEndpointService.list()); diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java index 4e351f1..988866a 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ConfigController.java @@ -1,8 +1,12 @@ package com.taoes.simpledocker.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.taoes.simpledocker.controller.client.DockerClientConfig; import com.taoes.simpledocker.model.ResponseModel; +import com.taoes.simpledocker.model.Role; import com.taoes.simpledocker.service.ConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +23,7 @@ import java.util.Map; * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ +@Api(tags = "系统配置") @RestController @RequestMapping("/api/config") public class ConfigController { @@ -26,11 +31,14 @@ public class ConfigController { @Autowired private ConfigService configService; + @PostMapping("/client") public ResponseModel> clientList() { return new ResponseModel<>(); } + @SaCheckPermission(value = "config:system", orRole = Role.ADMIN_ROLE_NAME) + @ApiOperation("获取系统配置") @GetMapping("/system") public ResponseModel> getConfigByKeys() { Map config = configService.findConfigByKeys(new HashSet<>()); diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java index b9c3443..4997102 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ContainerController.java @@ -1,5 +1,6 @@ package com.taoes.simpledocker.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.TopContainerResponse; @@ -7,11 +8,15 @@ import com.github.dockerjava.api.model.Container; import com.taoes.simpledocker.controller.container.OperateContainerRequest; import com.taoes.simpledocker.controller.container.RunNewContainerRequest; import com.taoes.simpledocker.model.ResponseModel; +import com.taoes.simpledocker.model.Role; import com.taoes.simpledocker.model.enums.ContainerOperate; import com.taoes.simpledocker.service.ContainerService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import java.util.List; import java.util.Map; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,32 +34,43 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/api/container") -@AllArgsConstructor +@Api(tags = "Docker容器管理") +@RequiredArgsConstructor public class ContainerController extends BaseController { - private ContainerService service; + private final ContainerService service; @GetMapping + @ApiOperation("容器列表") + @SaCheckPermission(value = "container:query",orRole = Role.ADMIN_ROLE_NAME) public ResponseModel< List> list() { final List containers = service.list(true); return ResponseModel.ok(containers); } @GetMapping("/{containerId}") + @ApiOperation("容器详情信息") + @SaCheckPermission(value = "container:query",orRole = Role.ADMIN_ROLE_NAME) public InspectContainerResponse inspect(@PathVariable String containerId) { return service.inspect(containerId); } + @ApiOperation("运行新容器") @PostMapping("/new") + @SaCheckPermission(value = "container:run",orRole = Role.ADMIN_ROLE_NAME) public CreateContainerResponse run(@RequestBody RunNewContainerRequest request) { return service.run(request); } + @ApiOperation("查看容器进程") + @SaCheckPermission(value = "container:runtime",orRole = Role.ADMIN_ROLE_NAME) @GetMapping("/{containerId}/top") public TopContainerResponse top(@PathVariable String containerId, String psArgs) { return service.top(containerId, psArgs); } + @ApiOperation("变更容器状态") + @SaCheckPermission(value = "container:operator",orRole = Role.ADMIN_ROLE_NAME) @PostMapping("/operator/{operate}") public ResponseModel operateContainer( @PathVariable ContainerOperate operate, diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java index 3f8553b..ed3edd8 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/ImageController.java @@ -1,5 +1,6 @@ package com.taoes.simpledocker.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.InspectImageResponse; @@ -8,7 +9,10 @@ import com.taoes.simpledocker.config.DockerClientFactory; import com.taoes.simpledocker.controller.image.ImageTagUpdateRequest; import com.taoes.simpledocker.controller.image.PushImageRequest; import com.taoes.simpledocker.model.ResponseModel; +import com.taoes.simpledocker.model.Role; import com.taoes.simpledocker.service.ImageService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; @@ -31,6 +35,7 @@ import javax.servlet.http.HttpServletResponse; * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ +@Api(tags = "Docker镜像管理") @RestController @RequestMapping("/api/images") @RequiredArgsConstructor @@ -40,6 +45,8 @@ public class ImageController { private final ImageService imageService; + @ApiOperation("查看镜像列表") + @SaCheckPermission(value = "image:query",orRole = Role.ADMIN_ROLE_NAME) @GetMapping("/list") public ResponseModel> list(@RequestParam(required = false) String searchKey) { final DockerClient dockerClient = clientFactory.get(); @@ -64,29 +71,39 @@ public class ImageController { return ResponseModel.ok(result); } + @ApiOperation("查看镜像详情") + @SaCheckPermission(value = "image:query",orRole = Role.ADMIN_ROLE_NAME) @GetMapping("/{imageId}/inspect") public InspectImageResponse findById(@PathVariable String imageId) { return imageService.inspect(imageId); } + @ApiOperation("拉取镜像") + @SaCheckPermission(value = "image:pull",orRole = Role.ADMIN_ROLE_NAME) @PutMapping public Object pull(@RequestParam String imageTag) { final DockerClient dockerClient = clientFactory.get(); return dockerClient.pullImageCmd(imageTag).exec(null); } + @ApiOperation("推送镜像") + @SaCheckPermission(value = "image:push",orRole = Role.ADMIN_ROLE_NAME) @PostMapping public Object push(@RequestBody PushImageRequest request) { final DockerClient dockerClient = clientFactory.get(); return dockerClient.pushImageCmd(request.getImageId()).exec(null); } + @ApiOperation("移除镜像") + @SaCheckPermission(value = "image:delete",orRole = Role.ADMIN_ROLE_NAME) @DeleteMapping("/{imageId}") public ResponseModel remove(@PathVariable String imageId,@RequestParam(defaultValue = "false") Boolean force) { imageService.remove(imageId, force); return ResponseModel.ok("OK"); } + @ApiOperation("清理镜像") + @SaCheckPermission(value = "image:prune",orRole = Role.ADMIN_ROLE_NAME) @PostMapping("/prune") public ResponseModel purge() { imageService.pruneImage(); @@ -96,6 +113,8 @@ public class ImageController { /** * 更新镜像信息 */ + @ApiOperation("标记镜像") + @SaCheckPermission(value = "image:tag",orRole = Role.ADMIN_ROLE_NAME) @PostMapping("/update/tag") public ResponseModel updateImageInfo(@RequestBody ImageTagUpdateRequest req) { req.check(); @@ -106,6 +125,8 @@ public class ImageController { /** * 保存镜像 */ + @ApiOperation("导出镜像") + @SaCheckPermission(value = "image:export",orRole = Role.ADMIN_ROLE_NAME) @GetMapping("/save/{nameTag}") public void save(@PathVariable String nameTag, HttpServletRequest request,HttpServletResponse response) { imageService.save(nameTag,request,response); @@ -113,6 +134,8 @@ public class ImageController { /** * 批量保存镜像 */ + @ApiOperation("批量导出镜像") + @SaCheckPermission(value = "image:export",orRole = Role.ADMIN_ROLE_NAME) @PostMapping("/saveBatch") public void saveBatch(@RequestBody List nameTagList, HttpServletRequest request,HttpServletResponse response) { imageService.saveBatch(nameTagList,request,response); diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java index a2aafeb..12bdba2 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/InfoController.java @@ -1,9 +1,14 @@ package com.taoes.simpledocker.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Info; import com.github.dockerjava.api.model.Version; import com.taoes.simpledocker.config.DockerClientFactory; +import com.taoes.simpledocker.model.Role; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -18,13 +23,16 @@ import java.util.Map; * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ +@Api(tags = "Docker信息") @RestController @RequestMapping("/api/info") +@RequiredArgsConstructor public class InfoController { - @Autowired - private DockerClientFactory clientFactory; + private final DockerClientFactory clientFactory; + @ApiOperation("查看Docker信息") + @SaCheckPermission(value = "docker:query",orRole = Role.ADMIN_ROLE_NAME) @GetMapping public Map info() { final DockerClient client = clientFactory.get(); diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/MonitorController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/MonitorController.java index b32602b..c8bb09e 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/MonitorController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/MonitorController.java @@ -2,18 +2,21 @@ package com.taoes.simpledocker.controller; import com.taoes.simpledocker.model.ResponseModel; import com.taoes.simpledocker.service.OperateRecordService; +import io.swagger.annotations.Api; import java.util.List; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +@Api(tags = "Docker监控") @RestController @RequestMapping("/api/monitor") +@RequiredArgsConstructor public class MonitorController { - @Autowired - private OperateRecordService recordService; + private final OperateRecordService recordService; @GetMapping("/container") public ResponseModel container() { diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java index 4aad557..3c5a86f 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/NetWorkController.java @@ -1,9 +1,14 @@ package com.taoes.simpledocker.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Network; import com.taoes.simpledocker.config.DockerClientFactory; import com.taoes.simpledocker.model.ResponseModel; +import com.taoes.simpledocker.model.Role; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,17 +22,20 @@ import java.util.List; * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ +@Api(tags = "Docker网络管理") @RestController @RequestMapping("/api/network") +@RequiredArgsConstructor public class NetWorkController { - @Autowired - private DockerClientFactory clientFactory; + private final DockerClientFactory clientFactory; - @GetMapping("/list") - public ResponseModel> list() { - DockerClient client = clientFactory.get(); - final List exec = client.listNetworksCmd().exec(); - return ResponseModel.ok(exec); - } + @ApiOperation("网络列表") + @SaCheckPermission(value = "network:query", orRole = Role.ADMIN_ROLE_NAME) + @GetMapping("/list") + public ResponseModel> list() { + DockerClient client = clientFactory.get(); + final List exec = client.listNetworksCmd().exec(); + return ResponseModel.ok(exec); + } } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java index 3c9bb9e..63a0177 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java @@ -1,6 +1,7 @@ package com.taoes.simpledocker.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.extension.api.R; import com.taoes.simpledocker.controller.auth.UserCreateRequest; import com.taoes.simpledocker.controller.auth.UserResetRequest; import com.taoes.simpledocker.controller.request.user.UserAuthRoleRequest; @@ -11,9 +12,12 @@ import com.taoes.simpledocker.service.UserService; import com.taoes.simpledocker.utils.JsonUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -30,27 +34,40 @@ import java.util.List; @Api(tags = "用户管理") @RestController @RequestMapping("/api/user") +@RequiredArgsConstructor public class UserController { - @Autowired - private UserService userService; + private final UserService userService; + @ApiOperation("用户列表") @GetMapping + @SaCheckPermission(value = "user:query", orRole = Role.ADMIN_ROLE_NAME) public ResponseModel> list() { final List list = userService.list(); return ResponseModel.ok(list); } + @ApiOperation("创建用户") + @SaCheckPermission(value = "user:add", orRole = Role.ADMIN_ROLE_NAME) @PostMapping - public ResponseModel create(@RequestBody UserCreateRequest request){ + public ResponseModel create(@RequestBody UserCreateRequest request) { User user = new User(); user.setAccount(request.getAccount()) - .setName(request.getName()) - .setRoleIds(JsonUtils.toJsonString(request.getRoleIds())); + .setName(request.getName()) + .setRoleIds(JsonUtils.toJsonString(request.getRoleIds())); userService.create(user); return ResponseModel.ok(true); } + @ApiOperation("删除用户") + @SaCheckPermission(value = "user:delete", orRole = Role.ADMIN_ROLE_NAME) + @DeleteMapping("/{userId}") + public ResponseModel delete(@PathVariable Long userId) { + userService.delete(userId); + return ResponseModel.ok(Boolean.TRUE); + } + + @ApiOperation("配置用户角色") @SaCheckPermission(value = "user:authRole", orRole = Role.ADMIN_ROLE_NAME) @PostMapping("auth_role") diff --git a/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java index 637a33a..f1de042 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/controller/VolumeController.java @@ -1,10 +1,15 @@ package com.taoes.simpledocker.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.github.dockerjava.api.command.InspectVolumeResponse; import com.github.dockerjava.api.command.ListVolumesResponse; import com.taoes.simpledocker.controller.volume.CreateVolumeRequest; import com.taoes.simpledocker.model.ResponseModel; +import com.taoes.simpledocker.model.Role; import com.taoes.simpledocker.service.VolumeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -20,29 +25,38 @@ import org.springframework.web.bind.annotation.RestController; * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ +@Api(tags = "Docker储存卷") @RestController @RequestMapping("/api/volume") +@RequiredArgsConstructor public class VolumeController { - @Autowired - private VolumeService volumeService; + private final VolumeService volumeService; @GetMapping + @ApiOperation("储存卷列表") + @SaCheckPermission(value = "volume:query",orRole = Role.ADMIN_ROLE_NAME) public ResponseModel list() { return ResponseModel.ok(volumeService.list()); } @PostMapping + @ApiOperation("创建储存卷") + @SaCheckPermission(value = "volume:create",orRole = Role.ADMIN_ROLE_NAME) public void create(@RequestBody CreateVolumeRequest request) { volumeService.create(request.getName(), request.getDriver()); } @GetMapping("/{name}") + @ApiOperation("储存卷详情") + @SaCheckPermission(value = "volume:query",orRole = Role.ADMIN_ROLE_NAME) public InspectVolumeResponse inspect(@PathVariable("name") String name) { return volumeService.inspect(name); } @DeleteMapping("/{name}") + @ApiOperation("储存卷移除") + @SaCheckPermission(value = "volume:delete",orRole = Role.ADMIN_ROLE_NAME) public void delete(@PathVariable("name") String name) { volumeService.remove(name); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java index d25f05e..8c783a3 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java @@ -47,4 +47,11 @@ public interface UserService { * @param user 用户 */ void create(User user); + + /** + * 删除用户 + * + * @param userId + */ + void delete(Long userId); } diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java index 6c4475b..e79beba 100644 --- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java +++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java @@ -107,5 +107,9 @@ public class UserServiceImpl implements UserService { } - + @Override + public void delete(Long userId) { + userRepository.removeById(userId); + log.info("删除用户:{}",userId); + } } -- Gitee