diff --git a/admin/src/api/Api.ts b/admin/src/api/Api.ts index 24369e429aba9029527d63efaf8ebf4c3d1fc078..e93aa39646dbc7e8d9d581420b28c8b5c4c40ab1 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 0000000000000000000000000000000000000000..464a2f9d32a2cac76b47b915009d6c008cebd5e4 --- /dev/null +++ b/admin/src/api/Auth/RoleApi.ts @@ -0,0 +1,52 @@ +import httpRequest from '../Api' +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"; + +/** + * 获取角色列表 + */ +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); +} + +/** + * 查询角色的权限树 + * @param id + */ +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, 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 new file mode 100644 index 0000000000000000000000000000000000000000..2099e8be66221270129c572f3cc6c2dd22070059 --- /dev/null +++ b/admin/src/api/Model/Auth/Permission.ts @@ -0,0 +1,9 @@ +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/PermissionGroup.ts b/admin/src/api/Model/Auth/PermissionGroup.ts new file mode 100644 index 0000000000000000000000000000000000000000..a59f319a0bed68480c81211742ad0c19b1ca7c14 --- /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/PermissionTree.ts b/admin/src/api/Model/Auth/PermissionTree.ts new file mode 100644 index 0000000000000000000000000000000000000000..7849bd8cfd1bf70e545536617dbcb673ebc59fad --- /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/api/Model/Auth/Role.ts b/admin/src/api/Model/Auth/Role.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a9d72f3133be02777b53394d6277420a51c5300 --- /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 0000000000000000000000000000000000000000..9d86fdbe87455f2894fc20c20d0b51b3055ef411 --- /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 0000000000000000000000000000000000000000..e358f8ff55febee3ae1ce0f093d6a7f5938c47bd --- /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/Auth/UserCreatedRequest.ts b/admin/src/api/Model/Auth/UserCreatedRequest.ts new file mode 100644 index 0000000000000000000000000000000000000000..5defb5c98495164b5866ad01b0075dfd07922036 --- /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/Model/DockerInfo.ts b/admin/src/api/Model/DockerInfo.ts index a0e3b060bca323998fb96bdb9f894d04f90d7584..1d1f5e8e1042b225d579460814b5d34c7940c7a1 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/api/Model/User.ts b/admin/src/api/Model/User.ts index 59b52226644d4972a0fbc213aaaa31f606c94340..52181029d8912aa6d0396b7cc5494aa883937966 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 0000000000000000000000000000000000000000..51b790c85ea1e00b54a24cf1ec136b6ba81ecfaa --- /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/api/User/UserApi.ts b/admin/src/api/User/UserApi.ts index dc12b65cb2d2c91d1196ea65d31e1d18dde61c78..708a04cb6cb1cf513db9cd864eaf51d07d904299 100644 --- a/admin/src/api/User/UserApi.ts +++ b/admin/src/api/User/UserApi.ts @@ -1,17 +1,34 @@ 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); +} + + +/** + * 移除用户 + */ +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/App/Home/DockerInfoDescription/index.tsx b/admin/src/component/App/Home/DockerInfoDescription/index.tsx index 25a843947c531446a40745c185ddd7ae412a4ff1..b18ca4336e0c742e64740aa5f1fcddeda7169a67 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 b42cec4870a6837ff1bc2c3000462327ad2d5af9..bc46c091396d36755bc8be499f7cb30995fedf5e 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/component/Auth/PermissionList/index.tsx b/admin/src/component/Auth/PermissionList/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3bc9d3fbbb95605c8341ac9513ca183317aee639 --- /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/Role/index.jsx b/admin/src/component/Auth/Role/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..320bad1ac1638f4b57e9f5362f89ba25d8db2947 --- /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.css b/admin/src/component/Auth/RoleList/index.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/admin/src/component/Auth/RoleList/index.tsx b/admin/src/component/Auth/RoleList/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8c63adc2e126bb157e3475a37ee81a573cf3237a --- /dev/null +++ b/admin/src/component/Auth/RoleList/index.tsx @@ -0,0 +1,352 @@ +import React from "react"; +import Role from "../../../api/Model/Auth/Role"; +import { + createNewRole, + deleteRole, + getPermissionOfRole, + 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, + CloudUploadOutlined +} from '@ant-design/icons' +import RoleCreatedRequest from "../../../api/Model/Auth/RoleCreatedRequest"; +import './index.css' +import RoleUpdateRequest from "../../../api/Model/Auth/RoleUpdateRequest"; + +interface Props { + +} + +interface State { + roleList: Array, + modalForCreateRole: boolean, + modalForPermission: boolean, + modalForUpdateRole: boolean, + currentRoleId: number, + newRoleReq: RoleCreatedRequest, + permissionTree: Array, + selectPermissions: Array + +} + +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: [], + 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}) + }) + } + + + /** + * 保存角色 + */ + saveRole = () => { + // 检查数据 + let data = this.state.newRoleReq; + 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}`).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() + }) + } + + /** + * 保存权限 + */ + 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: []}) + }) + } + + + /*** + * 删除角色 + * @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() + } + }); + } + + /** + * 更新角色权限 + * @param role + */ + updatePermission = (role: Role) => { + this.setState({ + 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}) + } + + 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())}) + } + + 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', + ellipsis: true, + render: comment => {comment}, + 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: 120, + render: (_, role: Role) => { + return ( + + + + + + ) + } + } + ] + + + return ( +
+
+
+ + +
+
+ record.id}/> + + this.saveRole()} + onCancel={() => this.setState({modalForCreateRole: false})}> +
+ + + + + + + + + + +
+ + + this.updateRoleInfo()} + onCancel={() => this.setState({modalForUpdateRole: false})}> +
+ + + + + + + + + + +
+ +
+ this.savePermission()} + onCancel={() => this.setState({modalForPermission: false})} + > + + this.onCheck(t)} + checkedKeys={this.state.selectPermissions} + treeData={this.state.permissionTree} + /> + +
+ + ) + } +} \ 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 0000000000000000000000000000000000000000..9a9c9ca2e6fb1e9a40158c52281bd8f8aef44c84 --- /dev/null +++ b/admin/src/component/Auth/UserList/index.tsx @@ -0,0 +1,221 @@ +import Search from "antd/es/input/Search"; +import {Button, Form, Input, message, Modal, Select, Space, Table} from "antd"; +import {CloudSyncOutlined, ReloadOutlined, DeleteOutlined, UserSwitchOutlined} from "@ant-design/icons"; +import {ColumnsType} from "antd/es/table"; +import User from "../../../api/Model/User"; +import React, {useEffect, useState} from "react"; +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"; + + + +interface Props { + +} + +interface State { + users: Array, + modalOfCreateUser: boolean +} + +export default class UserList extends React.Component { + + private newUserInfo: UserCreatedRequest = {name: '', account: '', roleIds: []} + + 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() { + 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 => { + 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() + }) + } + + createUserInfoChange = (_: any, value: UserCreatedRequest) => { + this.newUserInfo = value + 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 ( +
+
+
+ + + +
+
+
record.id}/> + + this.createUser()} + onCancel={() => this.hideCreateUserModal()}> +
+ + + + + + + + + + + + + + + +
+ + ); + } +} \ 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 0d7675edbd350d9fcf26eb8921b8495b2b02e8c5..f28e420cb6a08de5a780b3c33155d2d28134dedc 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 0000000000000000000000000000000000000000..296bbbd02efcd6fb0520a6a7c3beb81112e0e5dc --- /dev/null +++ b/admin/src/page/AuthPage/index.tsx @@ -0,0 +1,44 @@ +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"; +import IconFont from "../../component/Base/IconFont"; + +interface Props { + +} + +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/admin/src/page/HomePage/index.tsx b/admin/src/page/HomePage/index.tsx index e9faf5cd01a7be19b3d4b9457a96772fa90104ba..e6dd3b685ed839834e54a16987e1fd10073b1574 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/admin/src/page/UserPage/index.tsx b/admin/src/page/UserPage/index.tsx deleted file mode 100644 index e31df10e768d3228ae52a42b86995ac36e8ba1c6..0000000000000000000000000000000000000000 --- 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 5b6a5eae8ba44c5f96d087916208de0115ef3c7b..010107ef58666ecf8bdfc48c95f3dfb5a3c96117 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 a222843ab6f29a24523896c9e1b1dd841d3fccc2..d2bf53a2b46ef9abbe2870eaabcb51a50fc8d761 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 0f977d4dc18d90f02a32a9463707b33cc4d048ec..fadc6049c57f07697fb7e2c58c40824e5a935664 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 68efbdc3ef5d6dffef3a36c2582cdf964cfb6374..0441f0974eeea58d4c5ef74bb51bf76c8574f1c6 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 8d03ae26dcc43aeb5858686b049668c03c23db36..8504e08ae12367911ea7e43356aab15486f267d9 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 3132af7554d462484f3bc7607b01d29df3652a6a..809f6d87659e0d32dfbb49b02c4fbecf529efa18 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 7dd11e14bd4fe7de4adb2f737926fedce21e87fa..43ab44531f2ee5cfe3a0aad4057f6099c5239b1e 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 93f346a58dfa041be7ea66d9e0f2689018844675..cba3d3dc4be24c8f77d5db2109f490798fcdadb4 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 447f0147302546ba4800704f9e6079635a3b4ca0..7807a9de7e620f2bce84c4e05678ab07169de70c 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/config/interceptor/UserLoginInterceptor.java b/backend-src/src/main/java/com/taoes/simpledocker/config/interceptor/UserLoginInterceptor.java index 34152cbfbe19b49889d6a80d4cbe5154f99274a4..5a782ee87f36a76faaa3c27af892b0784e0a1fd3 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/AuthController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/AuthController.java index 812e44c065d78948655034a0acc7f009086f8fe6..b40d9922595413879c22dc5a30798fcf4b0a76e4 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 0f76e427e66810ad9d5ef1786f75b62b521f83fe..45acd0ebbd85978ab1fd8b5c784eb5f4e74eb27a 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; @@ -12,9 +14,10 @@ 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 = "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 75656ad1a412c2df039ee796d4ba99a3d733ac0b..988866ad4a61ea8ffa0a4d5b538ad98389cf375d 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; @@ -16,9 +20,10 @@ 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 下午 */ +@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 95a5c24e21724df01a46eff1648ec22d84f4a76c..49971028d98c6fee2e78e599692a08c2b2d0d609 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; @@ -23,38 +28,49 @@ import org.springframework.web.bind.annotation.RestController; /** * 容器相关服务 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/4 11:35 下午 */ @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 444bd892ae093b807948b746ea3add2b143effb0..ed3edd80884285f1988f1725872d4f8b4f5fab6a 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; @@ -28,9 +32,10 @@ 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 下午 */ +@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 800dd40f745258098413c74f2e15ecb09cb2b116..12bdba2f6310f815dff65a95c716e0e654819aae 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; @@ -15,16 +20,19 @@ 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 下午 */ +@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 b32602b9eacced2cfb8db678b2d4b3d00cc8579b..c8bb09e024e27fb7617b69777942b0cea35b8d23 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 2e9d60aa704fced74353315740974c50ffa08d3d..3c5a86fc83c4099e0b7ced1389e486638c86a4cf 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; @@ -14,20 +19,23 @@ import java.util.List; /** * 网络控制器接口 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @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/RoleController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/RoleController.java index eea9a1d531cc5a2b97763dfa30a8db23510303c6..8b59e19c209ef0c15f742983a319b742b71d0e9f 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/UserController.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/UserController.java index a02e40122fa76ea96f986737153276ebf8ace70a..63a0177f4bc83087f6ade9b757d7bd3ce54dc01d 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,16 +1,23 @@ 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; 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 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; @@ -21,23 +28,46 @@ 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 = "用户管理") @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) { + 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: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 06f09dcb9af47d8d03fc50671c1785dd61cf5422..f1de042665c2cba06b7d3229c105a7b8234a0ce9 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; @@ -17,32 +22,41 @@ 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 = "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/controller/auth/UserCreateRequest.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/auth/UserCreateRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..9d5519d437ccab1c6b729abb13fd31f23be27b32 --- /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/controller/client/DockerClientConfig.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/client/DockerClientConfig.java index 0073751d8604b5fe0e3e5124b5507ad0557a6c74..607bb1a1b1cc154b543d050d21f345395c20ddc9 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 06a7db1bf6050f226c33a2ab799d8d0417aba743..dc5e87a8c0a032f7dc459d28b8e4422325c60515 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 f3f7877e38b3336677ff1216f65cd36a8da31a27..83e3dc9a26986b087a399ee2680a2247faab6858 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 5a8730d6beea81eeebf8dda746bc7ca749f09d6b..fce986ba97311292aad25112a51f4038661f28c4 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 ad4e68419c5a9fcdb761b45c43b6aea42547fa14..f18e061e9d0d1ad7a60d4931eb0b6aa72714537c 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/PermissionTreeResponse.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/PermissionTreeResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..342d65edf5f6fbc8f90a8b934d1056e8e980df08 --- /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/role/RoleResponse.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/role/RoleResponse.java index 8dd39c123cb2432b9b67138b69403eea2f2d07c3..9a9474ea2b90e6a105b4dbc0c8f6431ce79b2d98 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/controller/response/tree/DataNode.java b/backend-src/src/main/java/com/taoes/simpledocker/controller/response/tree/DataNode.java new file mode 100644 index 0000000000000000000000000000000000000000..25d7dc8a9a317c9653841df56918e31fe187d67b --- /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/converter/UserConverter.java b/backend-src/src/main/java/com/taoes/simpledocker/converter/UserConverter.java index df0270765b62037518c0e290337c92b0f32debde..560077f8829998c9cb35f76f057363d7b690a3f5 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/bean/BaseDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/BaseDao.java index 68cf381938a792457962f872a001735f0d309dff..b76716f1c2b260e6e30814e4275bb985ff8bed59 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/bean/ConfigDao.java b/backend-src/src/main/java/com/taoes/simpledocker/dao/bean/ConfigDao.java index 5b6674280c2ca4f851679b6ecabf4affd2fb17bd..7895f2063ab12209bb21c330009737bec2b2296e 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 2a326328b248d870471b6cb99ccb99e49bc29ae4..8e71670b5284713bcd0e941033c35a537840dc24 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 5ddcc18d72f5ff667edd7eeaa75b0ac577f54cc5..3a0dbd823a86b5f5c3ac34a041d9124cfddbac6e 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 11f64cb33f9e469bb074e1cdc137a1dcea9bb01c..5d461000292dcde243c65589219c1ca66bdba400 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 feed55cb7853ce05187303ec10cfd02ebbbfd084..6185753c721133e922ccee581ea00d7f83171935 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 eb304632e1996a8088cbd856dc0623b75764068f..b884e82c4121a54919a7f6996c977ac77785bd0a 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 3f0b61d6486b34a92e151220524990497e25fc76..2203fbbbbe0dcc352966206e76ade18548057952 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 76ed2e3eb240f51c72f70d085e9e135234e09fe2..bbfaa604a5178d141b25c85f010e1b2a54f477d6 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 3044e7caf905fe2bd0f39dd7092177751f87a72e..192f74aa47ee0481bf747b0d4385c8d00c478b06 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 8c1640d62a93a87c0753ad639c07c15785a353d7..a5961db73862bd10ba7d8c8a6702c3fe7f10bd29 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 621333f000ef10a9928ec0fd13105e895601c855..b14ed53744e6c446eea815cf2a97820976059dc2 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 fed734a7339fa2a564bdb612fee392605392c615..3efd2337375841475aaba280a19d6392ee0bd035 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 93e106633c3c26a7d8bec91744e051d8ba76decc..c816ccd269099b452458c57cf292bbb31cc0c80e 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 c5c862d3800c743c0e3936db57d8217c82f52fef..ba0af217626b4d4deb40674b769e75fecdea7f3b 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,15 @@ 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.BaseDao; 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 +24,37 @@ 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<>(); + wrapper.orderByDesc(BaseDao::getId); + 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 RoleDao findByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RoleDao::getName, name); + return this.baseMapper.selectOne(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 8bd3af5525570838225460c32e5be7aea0d57833..dfea195a6f2efd88fd8eed511708e454d18dfe02 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 0056a1c83771781f2f77320002c880abf39bf1e1..8f90ef4b103b0ffcdf90f0e41a7804cfaaf9a234 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 d01d64cebb9ed6a7a451004508924152d1f80af6..5e0f8fadf78a8dabbfa8e6794d898ba854386864 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 0e8c13748ef77b7454904c389bdf08bb3b784b26..d33ebbc1d11e77bc85582d1bf15fa3ad9403fe72 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 4447b9e8035aee5c296340bdc7dfeb50a3e8aaa1..b42c200d4c7c378a7213f9a69fcdd3a2f5fc14b8 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 @@ -24,6 +24,10 @@ public class User { */ private String name; + /** + * 角色信息 + */ + private String roleIds; /** * 创建时间 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 4c8802b4c3da9d689c8785c549d5d47c7a2aa365..8b5b033e62ae12782f3efb1b100764baeda03410 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 e19fa052bd335a21204b92231a4cadae194db71e..7b7c9c469a3f91fb2aff5d8b393e1cfe06b14ffc 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 0000000000000000000000000000000000000000..04023bf3c6b4741a53d270f8da072aae784f8b75 --- /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 2f5a70d73283db6e985c8ed773f1cfed7e85edff..8fd902663f26efb74fcd5fa1819e936ce640ad59 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 0c922b28b1bf8af7e113c3a1807f1394d09a7f31..474b14c79497ae5b38e0fd5a0612907b377b919d 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 5da4ccc437bd2b0aa33b17c1916ec44ebdf2e6ba..2a526c606f782dfb33b080d35b52d6501cadf2e0 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 0e8b7e5c900a3cc5e09d7b3e9ab8a320915c10cd..813f1a2438432e5223612355f602642475f5520f 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 c60c581fae1026588041147d11c7f19e44346ff3..9d621bb521fd83e8698bf113ad6cfeecbeceb1d3 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 88d157a7392455e48c65e6bf1e45d600e166b976..a2d295119bdc9e75e60f7463ac43cf8197dddc03 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 de71797178d36e1ea01e6969d4cf51803e211ab0..07d6b340ce275e7bca6a0d0584b7990c14695664 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 c403d33be18582d48e6a35d5d94ecb6c6e3474a7..12ce7568d757e2fa6915ad611187932d3d29ad84 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 824bcebfd979fdcea3e4b380ef73ae42b08e47a1..6cd706544a9b269b4a3ac9732b5426790e7091c1 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 6b57eea7d1e2b575d75c032115a6c88e9b5ca1f2..4223f188a656e546138718449b9be67e4b1f3a04 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/RoleService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java index 7b0694ad14808b2d5eacc999902734238c960ad6..ae22c62bc2805e9946125650996a48dd36df156f 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/UserService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java index 9d50fe4e9c4d1b85a4fd7aa9904dbcb72da9aeba..8c783a3b186b2b686efd00eefbdf5dfeb4ef7a18 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 { @@ -19,7 +19,7 @@ public interface UserService { * @param username 账户民 * @return 生成的token */ - User findByName(String username); + User findByAccount(String username); /** * 禁用用户 @@ -40,4 +40,18 @@ public interface UserService { void authRole(Long userId, List roleIds); List getUserRoles(Long userId); + + /** + * 创建新用户 + * + * @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/AuthServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java index 04bbfa6f471f8a809332e5ae66799bcf61b8a184..5dace515b527121ac2a85c3f438bd77c2f4f54d3 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 1796e51c94cbd97316a32c316051d7b193018678..44ef646bd98e23db12f2dfb29ace28a9363b8e07 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 f29b966826ff7fcafee761719a6e3b761bafe8db..fb2e4bf04e9f538ee827148b0dff986638cb5444 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 44e2caa15d59efbf42eef24c87461a4a537fa15b..b6b41281ca674132ec57beb4bedac2a96f624401 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 fc74a39597aafe746e860d708a62d474c51753dd..f2a223f84e1aa8ec16f4ad188a011d368f8b80bb 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,10 +16,16 @@ 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.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; @@ -28,6 +37,7 @@ import java.util.stream.Collectors; * @author manwang (569258yin) * @date 2022/7/13 21:53 */ +@Slf4j @Service public class RoleServiceImpl implements RoleService { @@ -46,6 +56,13 @@ public class RoleServiceImpl implements RoleService { @Override public void addRole(Role role) { + 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("保存角色失败"); @@ -96,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); @@ -108,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/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 5cc651b10633f3f86b9151bd1d5c6aacfcf43761..e79bebaddc1582e3d95dbd8141a4730774dabe6a 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; @@ -23,7 +24,7 @@ import java.util.stream.Collectors; /** * 用户服务实现 * - * @author 枕上江南 zhoutao925638@vip.qq.com + * @author 枕上江南 zhoutao825638@vip.qq.com * @date 2021/12/15 1:29 下午 */ @Slf4j @@ -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,23 @@ 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); + } + + + @Override + public void delete(Long userId) { + userRepository.removeById(userId); + log.info("删除用户:{}",userId); + } } 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 d17ef7eedbce34c50293dec7a6ee17516f31b062..cf9f8ac21c04f040ba956b14d12079b950dbb668 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 6ee285626ae3b7ceab14c41468c4d0ec47c79758..842c312bfb0e9e259305b29ef238f0658369d1c7 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 38cfcc865e6306bad7213128c41b208176da642c..c11209b800b801d390c2004bf79d7ec9f5ef085e 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 9d57958179e974ebd6771d672f02373ab113dcb5..99313528a35305ac2a15a36a3b5d4dd7165fd9bf 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 fa191471a701ae96bf0741967b453730bd12f096..a0822d80bb8167b4e65898ed48197b66436afd7d 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 8cd41ded05f751fa08abd36a84b06d4df5266ec5..07887c36fb314d419023d00af73ab7528f1b0dd7 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 5646e50387e1811b5e1c21cb0ed45286fab3b3b5..1aa08232b8b10f190a74c0caaf7b154f916ba438 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 078ad18486ae92759a1de00bedbea2d923c706ce..25af55159f1617eafd654fcd021474dabb252981 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/main/main.iml b/backend-src/src/main/main.iml new file mode 100644 index 0000000000000000000000000000000000000000..908ad4f521a27722a24664f5a0adb595bf81f4e7 --- /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/java/Main.java b/backend-src/src/test/java/Main.java index b41ca0faa6226ae87fbb5eaafd81cfb748f75d02..c51ba6e6251de94e6747ee2193f0f7722707684a 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 { diff --git a/backend-src/src/test/test.iml b/backend-src/src/test/test.iml new file mode 100644 index 0000000000000000000000000000000000000000..5ebc6f48ecbe7e78271fcbb44057f6682d802638 --- /dev/null +++ b/backend-src/src/test/test.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/database/update.sql b/database/update.sql index 918d8ea790a2b27b67619738272c9effa29fb7b1..adee66d8a2cb9761ff87139729b2bc71566537d1 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;