mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-11-04 10:57:10 +08:00 
			
		
		
		
	新增:新增系统管理/部门管理/查询列表功能,并将所有描述字段名从 notes 调整为 description,将部分前端方法名前缀从 query 调整为 get,以及去除部分冗余代码
This commit is contained in:
		@@ -197,6 +197,7 @@ continew-admin  # 全局通用项目配置及依赖版本管理
 | 
				
			|||||||
  │      │          ├─ mapper     # 系统管理相关 Mapper
 | 
					  │      │          ├─ mapper     # 系统管理相关 Mapper
 | 
				
			||||||
  │      │          ├─ model      # 系统管理相关模型
 | 
					  │      │          ├─ model      # 系统管理相关模型
 | 
				
			||||||
  │      │          │  ├─ entity      # 系统管理相关实体对象
 | 
					  │      │          │  ├─ entity      # 系统管理相关实体对象
 | 
				
			||||||
 | 
					  │      │          │  ├─ query       # 系统管理相关查询条件
 | 
				
			||||||
  │      │          │  ├─ request     # 系统管理相关请求对象
 | 
					  │      │          │  ├─ request     # 系统管理相关请求对象
 | 
				
			||||||
  │      │          │  └─ vo          # 系统管理相关 VO(View Object)
 | 
					  │      │          │  └─ vo          # 系统管理相关 VO(View Object)
 | 
				
			||||||
  │      │          └─ service    # 系统管理相关业务接口及实现类
 | 
					  │      │          └─ service    # 系统管理相关业务接口及实现类
 | 
				
			||||||
@@ -268,6 +269,7 @@ continew-admin
 | 
				
			|||||||
    │  │  │  │  └─ system           # 系统日志
 | 
					    │  │  │  │  └─ system           # 系统日志
 | 
				
			||||||
    │  │  │  └─ online           # 在线用户
 | 
					    │  │  │  └─ online           # 在线用户
 | 
				
			||||||
    │  │  └─ system           # 系统管理模块
 | 
					    │  │  └─ system           # 系统管理模块
 | 
				
			||||||
 | 
					    │  │    ├─ dept             # 部门管理
 | 
				
			||||||
    │  │    └─ user             # 用户模块
 | 
					    │  │    └─ user             # 用户模块
 | 
				
			||||||
    │  │      └─ center           # 个人中心
 | 
					    │  │      └─ center           # 个人中心
 | 
				
			||||||
    │  ├─ App.vue           # 视图入口
 | 
					    │  ├─ App.vue           # 视图入口
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,9 +70,9 @@ public class LoginUser implements Serializable {
 | 
				
			|||||||
    private String avatar;
 | 
					    private String avatar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 备注
 | 
					     * 描述
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private String notes;
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 最后一次修改密码的时间
 | 
					     * 最后一次修改密码的时间
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@ public class LoginLogQuery implements Serializable {
 | 
				
			|||||||
     * 登录状态(1成功 2失败)
 | 
					     * 登录状态(1成功 2失败)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Schema(description = "登录状态(1成功 2失败)")
 | 
					    @Schema(description = "登录状态(1成功 2失败)")
 | 
				
			||||||
    @Query(type = Query.Type.EQUAL)
 | 
					    @Query
 | 
				
			||||||
    private Integer status;
 | 
					    private Integer status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,7 +62,7 @@ public class OperationLogQuery implements Serializable {
 | 
				
			|||||||
     * 操作状态(1成功 2失败)
 | 
					     * 操作状态(1成功 2失败)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Schema(description = "操作状态(1成功 2失败)")
 | 
					    @Schema(description = "操作状态(1成功 2失败)")
 | 
				
			||||||
    @Query(type = Type.EQUAL)
 | 
					    @Query
 | 
				
			||||||
    private Integer status;
 | 
					    private Integer status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,10 +87,10 @@ public class UserInfoVO implements Serializable {
 | 
				
			|||||||
    private String avatar;
 | 
					    private String avatar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 备注
 | 
					     * 描述
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Schema(description = "备注")
 | 
					    @Schema(description = "描述")
 | 
				
			||||||
    private String notes;
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 最后一次修改密码的时间
 | 
					     * 最后一次修改密码的时间
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.system.mapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.entity.SysDept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门 Mapper
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 17:56
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface DeptMapper extends BaseMapper<SysDept> {}
 | 
				
			||||||
@@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.system.model.entity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.annotation.TableId;
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.annotation.TableName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.model.entity.BaseEntity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门实体
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 13:50
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					@TableName("sys_dept")
 | 
				
			||||||
 | 
					public class SysDept extends BaseEntity {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门 ID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @TableId
 | 
				
			||||||
 | 
					    private Long deptId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门名称
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String deptName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 上级部门 ID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private Long parentId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门排序
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private Integer deptSort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 描述
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 状态(1启用 2禁用)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private DisEnableStatusEnum status;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -40,7 +40,7 @@ public class SysUser extends BaseEntity {
 | 
				
			|||||||
    private static final long serialVersionUID = 1L;
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 用户ID
 | 
					     * 用户 ID
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @TableId
 | 
					    @TableId
 | 
				
			||||||
    private Long userId;
 | 
					    private Long userId;
 | 
				
			||||||
@@ -81,9 +81,9 @@ public class SysUser extends BaseEntity {
 | 
				
			|||||||
    private String avatar;
 | 
					    private String avatar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 备注
 | 
					     * 描述
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private String notes;
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 状态(1启用 2禁用)
 | 
					     * 状态(1启用 2禁用)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.system.model.query;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.Serializable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springdoc.api.annotations.ParameterObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.annotation.Query;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门查询条件
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 17:52
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					@ParameterObject
 | 
				
			||||||
 | 
					@Schema(description = "部门查询条件")
 | 
				
			||||||
 | 
					public class DeptQuery implements Serializable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门名称
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "部门名称")
 | 
				
			||||||
 | 
					    @Query(type = Query.Type.INNER_LIKE)
 | 
				
			||||||
 | 
					    private String deptName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 状态(1启用 2禁用)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "状态(1启用 2禁用)")
 | 
				
			||||||
 | 
					    @Query
 | 
				
			||||||
 | 
					    private Integer status;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,104 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.system.model.vo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.Serializable;
 | 
				
			||||||
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import lombok.experimental.Accessors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonIgnore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门信息
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 13:53
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					@Accessors(chain = true)
 | 
				
			||||||
 | 
					@Schema(description = "部门信息")
 | 
				
			||||||
 | 
					public class DeptVO implements Serializable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门 ID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "部门 ID")
 | 
				
			||||||
 | 
					    private Long deptId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门名称
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "部门名称")
 | 
				
			||||||
 | 
					    private String deptName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 上级部门 ID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "上级部门 ID")
 | 
				
			||||||
 | 
					    private Long parentId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 部门排序
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "部门排序")
 | 
				
			||||||
 | 
					    private Integer deptSort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 描述
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "描述")
 | 
				
			||||||
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 状态(1启用 2禁用)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "状态(1启用 2禁用)")
 | 
				
			||||||
 | 
					    private DisEnableStatusEnum status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改人
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @JsonIgnore
 | 
				
			||||||
 | 
					    private Long updateUser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改人昵称
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "修改人昵称")
 | 
				
			||||||
 | 
					    private String updateUserString;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改时间
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "修改时间")
 | 
				
			||||||
 | 
					    private LocalDateTime updateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 子部门列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Schema(description = "子部门列表")
 | 
				
			||||||
 | 
					    private List<DeptVO> children;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.system.service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.query.DeptQuery;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.vo.DeptVO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门业务接口
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 17:54
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface DeptService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询列表
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param query
 | 
				
			||||||
 | 
					     *            查询条件
 | 
				
			||||||
 | 
					     * @return 列表数据
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<DeptVO> list(DeptQuery query);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,137 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.system.service.impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Objects;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.RequiredArgsConstructor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import cn.hutool.core.bean.BeanUtil;
 | 
				
			||||||
 | 
					import cn.hutool.core.collection.CollUtil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.util.ExceptionUtils;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.util.helper.QueryHelper;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.mapper.DeptMapper;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.entity.SysDept;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.query.DeptQuery;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.vo.DeptVO;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.service.DeptService;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.service.UserService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门业务实现类
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 17:55
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
 | 
					public class DeptServiceImpl implements DeptService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final DeptMapper deptMapper;
 | 
				
			||||||
 | 
					    private final UserService userService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<DeptVO> list(DeptQuery query) {
 | 
				
			||||||
 | 
					        QueryWrapper<SysDept> queryWrapper = QueryHelper.build(query);
 | 
				
			||||||
 | 
					        queryWrapper.lambda().orderByAsc(SysDept::getParentId).orderByAsc(SysDept::getDeptSort)
 | 
				
			||||||
 | 
					            .orderByDesc(SysDept::getUpdateTime);
 | 
				
			||||||
 | 
					        List<SysDept> list = deptMapper.selectList(queryWrapper);
 | 
				
			||||||
 | 
					        List<DeptVO> voList = BeanUtil.copyToList(list, DeptVO.class);
 | 
				
			||||||
 | 
					        voList.forEach(this::fill);
 | 
				
			||||||
 | 
					        return buildTree(voList);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 填充数据
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param vo
 | 
				
			||||||
 | 
					     *            VO
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void fill(DeptVO vo) {
 | 
				
			||||||
 | 
					        Long updateUser = vo.getUpdateUser();
 | 
				
			||||||
 | 
					        if (updateUser == null) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        vo.setUpdateUserString(ExceptionUtils.exToNull(() -> userService.getById(vo.getUpdateUser())).getNickname());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 构建树
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param list
 | 
				
			||||||
 | 
					     *            原始列表数据
 | 
				
			||||||
 | 
					     * @return 树列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private List<DeptVO> buildTree(List<DeptVO> list) {
 | 
				
			||||||
 | 
					        if (CollUtil.isEmpty(list)) {
 | 
				
			||||||
 | 
					            return new ArrayList<>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 去重
 | 
				
			||||||
 | 
					        List<DeptVO> deDuplicationDeptList = deDuplication(list);
 | 
				
			||||||
 | 
					        return deDuplicationDeptList.stream().map(d -> d.setChildren(this.getChildren(d, list)))
 | 
				
			||||||
 | 
					            .collect(Collectors.toList());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 数据去重(去除重复子部门列表)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param list
 | 
				
			||||||
 | 
					     *            部门列表
 | 
				
			||||||
 | 
					     * @return 去重后部门列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private List<DeptVO> deDuplication(List<DeptVO> list) {
 | 
				
			||||||
 | 
					        List<DeptVO> deptList = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (DeptVO outerDept : list) {
 | 
				
			||||||
 | 
					            boolean flag = true;
 | 
				
			||||||
 | 
					            for (DeptVO innerDept : list) {
 | 
				
			||||||
 | 
					                // 忽略重复子列表
 | 
				
			||||||
 | 
					                if (innerDept.getDeptId().equals(outerDept.getParentId())) {
 | 
				
			||||||
 | 
					                    flag = false;
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (flag) {
 | 
				
			||||||
 | 
					                deptList.add(outerDept);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return deptList;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定部门的子部门列表
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param dept
 | 
				
			||||||
 | 
					     *            指定部门
 | 
				
			||||||
 | 
					     * @param list
 | 
				
			||||||
 | 
					     *            部门列表
 | 
				
			||||||
 | 
					     * @return 子部门列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private List<DeptVO> getChildren(DeptVO dept, List<DeptVO> list) {
 | 
				
			||||||
 | 
					        return list.stream().filter(d -> Objects.equals(d.getParentId(), dept.getDeptId()))
 | 
				
			||||||
 | 
					            .map(d -> d.setChildren(this.getChildren(d, list))).collect(Collectors.toList());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								continew-admin-ui/components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								continew-admin-ui/components.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -24,6 +24,7 @@ declare module '@vue/runtime-core' {
 | 
				
			|||||||
    ACol: typeof import('@arco-design/web-vue')['Col']
 | 
					    ACol: typeof import('@arco-design/web-vue')['Col']
 | 
				
			||||||
    AConfigProvider: typeof import('@arco-design/web-vue')['ConfigProvider']
 | 
					    AConfigProvider: typeof import('@arco-design/web-vue')['ConfigProvider']
 | 
				
			||||||
    ADescriptions: typeof import('@arco-design/web-vue')['Descriptions']
 | 
					    ADescriptions: typeof import('@arco-design/web-vue')['Descriptions']
 | 
				
			||||||
 | 
					    ADescriptionsItem: typeof import('@arco-design/web-vue')['DescriptionsItem']
 | 
				
			||||||
    ADivider: typeof import('@arco-design/web-vue')['Divider']
 | 
					    ADivider: typeof import('@arco-design/web-vue')['Divider']
 | 
				
			||||||
    ADoption: typeof import('@arco-design/web-vue')['Doption']
 | 
					    ADoption: typeof import('@arco-design/web-vue')['Doption']
 | 
				
			||||||
    ADrawer: typeof import('@arco-design/web-vue')['Drawer']
 | 
					    ADrawer: typeof import('@arco-design/web-vue')['Drawer']
 | 
				
			||||||
@@ -46,6 +47,7 @@ declare module '@vue/runtime-core' {
 | 
				
			|||||||
    AListItemMeta: typeof import('@arco-design/web-vue')['ListItemMeta']
 | 
					    AListItemMeta: typeof import('@arco-design/web-vue')['ListItemMeta']
 | 
				
			||||||
    AMenu: typeof import('@arco-design/web-vue')['Menu']
 | 
					    AMenu: typeof import('@arco-design/web-vue')['Menu']
 | 
				
			||||||
    AMenuItem: typeof import('@arco-design/web-vue')['MenuItem']
 | 
					    AMenuItem: typeof import('@arco-design/web-vue')['MenuItem']
 | 
				
			||||||
 | 
					    AModal: typeof import('@arco-design/web-vue')['Modal']
 | 
				
			||||||
    AOption: typeof import('@arco-design/web-vue')['Option']
 | 
					    AOption: typeof import('@arco-design/web-vue')['Option']
 | 
				
			||||||
    APopover: typeof import('@arco-design/web-vue')['Popover']
 | 
					    APopover: typeof import('@arco-design/web-vue')['Popover']
 | 
				
			||||||
    ARadio: typeof import('@arco-design/web-vue')['Radio']
 | 
					    ARadio: typeof import('@arco-design/web-vue')['Radio']
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ export interface LoginLogListRes {
 | 
				
			|||||||
  list: LoginLogRecord[];
 | 
					  list: LoginLogRecord[];
 | 
				
			||||||
  total: number;
 | 
					  total: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
export function queryLoginLogList(params: LoginLogParams) {
 | 
					export function getLoginLogList(params: LoginLogParams) {
 | 
				
			||||||
  return axios.get<LoginLogListRes>('/monitor/log/login', {
 | 
					  return axios.get<LoginLogListRes>('/monitor/log/login', {
 | 
				
			||||||
    params,
 | 
					    params,
 | 
				
			||||||
    paramsSerializer: (obj) => {
 | 
					    paramsSerializer: (obj) => {
 | 
				
			||||||
@@ -66,7 +66,7 @@ export interface OperationLogListRes {
 | 
				
			|||||||
  list: OperationLogRecord[];
 | 
					  list: OperationLogRecord[];
 | 
				
			||||||
  total: number;
 | 
					  total: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
export function queryOperationLogList(params: OperationLogParams) {
 | 
					export function getOperationLogList(params: OperationLogParams) {
 | 
				
			||||||
  return axios.get<OperationLogListRes>('/monitor/log/operation', {
 | 
					  return axios.get<OperationLogListRes>('/monitor/log/operation', {
 | 
				
			||||||
    params,
 | 
					    params,
 | 
				
			||||||
    paramsSerializer: (obj) => {
 | 
					    paramsSerializer: (obj) => {
 | 
				
			||||||
@@ -85,7 +85,7 @@ export interface SystemLogListRes {
 | 
				
			|||||||
  list: SystemLogRecord[];
 | 
					  list: SystemLogRecord[];
 | 
				
			||||||
  total: number;
 | 
					  total: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
export function querySystemLogList(params: SystemLogParams) {
 | 
					export function getSystemLogList(params: SystemLogParams) {
 | 
				
			||||||
  return axios.get<SystemLogListRes>('/monitor/log/system', {
 | 
					  return axios.get<SystemLogListRes>('/monitor/log/system', {
 | 
				
			||||||
    params,
 | 
					    params,
 | 
				
			||||||
    paramsSerializer: (obj) => {
 | 
					    paramsSerializer: (obj) => {
 | 
				
			||||||
@@ -94,6 +94,6 @@ export function querySystemLogList(params: SystemLogParams) {
 | 
				
			|||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function querySystemLogDetail(logId: string) {
 | 
					export function getSystemLogDetail(logId: string) {
 | 
				
			||||||
  return axios.get<SystemLogDetailRecord>(`/monitor/log/system/${logId}`);
 | 
					  return axios.get<SystemLogDetailRecord>(`/monitor/log/system/${logId}`);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -21,7 +21,7 @@ export interface OnlineUserListRes {
 | 
				
			|||||||
  total: number;
 | 
					  total: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function queryOnlineUserList(params: OnlineUserParams) {
 | 
					export function getOnlineUserList(params: OnlineUserParams) {
 | 
				
			||||||
  return axios.get<OnlineUserListRes>('/monitor/online/user', {
 | 
					  return axios.get<OnlineUserListRes>('/monitor/online/user', {
 | 
				
			||||||
    params,
 | 
					    params,
 | 
				
			||||||
    paramsSerializer: (obj) => {
 | 
					    paramsSerializer: (obj) => {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								continew-admin-ui/src/api/system/dept.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								continew-admin-ui/src/api/system/dept.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					import axios from 'axios';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import qs from 'query-string';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface DeptRecord {
 | 
				
			||||||
 | 
					  deptId: string;
 | 
				
			||||||
 | 
					  deptName: string;
 | 
				
			||||||
 | 
					  parentId: string;
 | 
				
			||||||
 | 
					  deptSort: number;
 | 
				
			||||||
 | 
					  description: string;
 | 
				
			||||||
 | 
					  status: number;
 | 
				
			||||||
 | 
					  updateUserString: string;
 | 
				
			||||||
 | 
					  updateTime: string;
 | 
				
			||||||
 | 
					  children: Array<DeptRecord>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface DeptParams extends Partial<DeptRecord> {
 | 
				
			||||||
 | 
					  page: number;
 | 
				
			||||||
 | 
					  size: number;
 | 
				
			||||||
 | 
					  sort: Array<string>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function getDeptList(params: DeptParams) {
 | 
				
			||||||
 | 
					  return axios.get<DeptRecord[]>('/system/dept', {
 | 
				
			||||||
 | 
					    params,
 | 
				
			||||||
 | 
					    paramsSerializer: (obj) => {
 | 
				
			||||||
 | 
					      return qs.stringify(obj);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -8,6 +8,8 @@ import localeMonitor from '@/views/dashboard/monitor/locale/en-US';
 | 
				
			|||||||
import localeDataAnalysis from '@/views/visualization/data-analysis/locale/en-US';
 | 
					import localeDataAnalysis from '@/views/visualization/data-analysis/locale/en-US';
 | 
				
			||||||
import localeMultiDAnalysis from '@/views/visualization/multi-dimension-data-analysis/locale/en-US';
 | 
					import localeMultiDAnalysis from '@/views/visualization/multi-dimension-data-analysis/locale/en-US';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import localeDept from '@/views/system/dept/locale/en-US';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import localeOnlineUser from '@/views/monitor/online/locale/en-US';
 | 
					import localeOnlineUser from '@/views/monitor/online/locale/en-US';
 | 
				
			||||||
import localeLoginLog from '@/views/monitor/log/login/locale/en-US';
 | 
					import localeLoginLog from '@/views/monitor/log/login/locale/en-US';
 | 
				
			||||||
import localeOperationLog from '@/views/monitor/log/operation/locale/en-US';
 | 
					import localeOperationLog from '@/views/monitor/log/operation/locale/en-US';
 | 
				
			||||||
@@ -39,6 +41,7 @@ export default {
 | 
				
			|||||||
  'menu.server.workplace': 'Workplace-Server',
 | 
					  'menu.server.workplace': 'Workplace-Server',
 | 
				
			||||||
  'menu.server.monitor': 'Monitor-Server',
 | 
					  'menu.server.monitor': 'Monitor-Server',
 | 
				
			||||||
  'menu.visualization': 'Data Visualization',
 | 
					  'menu.visualization': 'Data Visualization',
 | 
				
			||||||
 | 
					  'menu.system': 'System management',
 | 
				
			||||||
  'menu.monitor': 'Monitor',
 | 
					  'menu.monitor': 'Monitor',
 | 
				
			||||||
  'menu.list': 'List',
 | 
					  'menu.list': 'List',
 | 
				
			||||||
  'menu.form': 'Form',
 | 
					  'menu.form': 'Form',
 | 
				
			||||||
@@ -58,6 +61,8 @@ export default {
 | 
				
			|||||||
  ...localeDataAnalysis,
 | 
					  ...localeDataAnalysis,
 | 
				
			||||||
  ...localeMultiDAnalysis,
 | 
					  ...localeMultiDAnalysis,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ...localeDept,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ...localeOnlineUser,
 | 
					  ...localeOnlineUser,
 | 
				
			||||||
  ...localeLoginLog,
 | 
					  ...localeLoginLog,
 | 
				
			||||||
  ...localeOperationLog,
 | 
					  ...localeOperationLog,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,8 @@ import localeMonitor from '@/views/dashboard/monitor/locale/zh-CN';
 | 
				
			|||||||
import localeDataAnalysis from '@/views/visualization/data-analysis/locale/zh-CN';
 | 
					import localeDataAnalysis from '@/views/visualization/data-analysis/locale/zh-CN';
 | 
				
			||||||
import localeMultiDAnalysis from '@/views/visualization/multi-dimension-data-analysis/locale/zh-CN';
 | 
					import localeMultiDAnalysis from '@/views/visualization/multi-dimension-data-analysis/locale/zh-CN';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import localeDept from '@/views/system/dept/locale/zh-CN';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import localeOnlineUser from '@/views/monitor/online/locale/zh-CN';
 | 
					import localeOnlineUser from '@/views/monitor/online/locale/zh-CN';
 | 
				
			||||||
import localeLoginLog from '@/views/monitor/log/login/locale/zh-CN';
 | 
					import localeLoginLog from '@/views/monitor/log/login/locale/zh-CN';
 | 
				
			||||||
import localeOperationLog from '@/views/monitor/log/operation/locale/zh-CN';
 | 
					import localeOperationLog from '@/views/monitor/log/operation/locale/zh-CN';
 | 
				
			||||||
@@ -39,6 +41,7 @@ export default {
 | 
				
			|||||||
  'menu.server.workplace': '工作台-服务端',
 | 
					  'menu.server.workplace': '工作台-服务端',
 | 
				
			||||||
  'menu.server.monitor': '实时监控-服务端',
 | 
					  'menu.server.monitor': '实时监控-服务端',
 | 
				
			||||||
  'menu.visualization': '数据可视化',
 | 
					  'menu.visualization': '数据可视化',
 | 
				
			||||||
 | 
					  'menu.system': '系统管理',
 | 
				
			||||||
  'menu.monitor': '系统监控',
 | 
					  'menu.monitor': '系统监控',
 | 
				
			||||||
  'menu.list': '列表页',
 | 
					  'menu.list': '列表页',
 | 
				
			||||||
  'menu.form': '表单页',
 | 
					  'menu.form': '表单页',
 | 
				
			||||||
@@ -58,6 +61,8 @@ export default {
 | 
				
			|||||||
  ...localeDataAnalysis,
 | 
					  ...localeDataAnalysis,
 | 
				
			||||||
  ...localeMultiDAnalysis,
 | 
					  ...localeMultiDAnalysis,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ...localeDept,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ...localeOnlineUser,
 | 
					  ...localeOnlineUser,
 | 
				
			||||||
  ...localeLoginLog,
 | 
					  ...localeLoginLog,
 | 
				
			||||||
  ...localeOperationLog,
 | 
					  ...localeOperationLog,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ const EXCEPTION: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.exception',
 | 
					    locale: 'menu.exception',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    icon: 'icon-exclamation-circle',
 | 
					    icon: 'icon-exclamation-circle',
 | 
				
			||||||
    order: 7,
 | 
					    order: 8,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ const FORM: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.form',
 | 
					    locale: 'menu.form',
 | 
				
			||||||
    icon: 'icon-settings',
 | 
					    icon: 'icon-settings',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    order: 4,
 | 
					    order: 5,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ const LIST: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.list',
 | 
					    locale: 'menu.list',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    icon: 'icon-list',
 | 
					    icon: 'icon-list',
 | 
				
			||||||
    order: 3,
 | 
					    order: 4,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ const Monitor: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.monitor',
 | 
					    locale: 'menu.monitor',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    icon: 'icon-computer',
 | 
					    icon: 'icon-computer',
 | 
				
			||||||
    order: 2,
 | 
					    order: 3,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ const PROFILE: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.profile',
 | 
					    locale: 'menu.profile',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    icon: 'icon-file',
 | 
					    icon: 'icon-file',
 | 
				
			||||||
    order: 5,
 | 
					    order: 6,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ const RESULT: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.result',
 | 
					    locale: 'menu.result',
 | 
				
			||||||
    icon: 'icon-check-circle',
 | 
					    icon: 'icon-check-circle',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    order: 6,
 | 
					    order: 7,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								continew-admin-ui/src/router/routes/modules/system.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								continew-admin-ui/src/router/routes/modules/system.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					import { DEFAULT_LAYOUT } from '../base';
 | 
				
			||||||
 | 
					import { AppRouteRecordRaw } from '../types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const System: AppRouteRecordRaw = {
 | 
				
			||||||
 | 
					  path: '/system',
 | 
				
			||||||
 | 
					  name: 'system',
 | 
				
			||||||
 | 
					  component: DEFAULT_LAYOUT,
 | 
				
			||||||
 | 
					  meta: {
 | 
				
			||||||
 | 
					    locale: 'menu.system',
 | 
				
			||||||
 | 
					    requiresAuth: true,
 | 
				
			||||||
 | 
					    icon: 'icon-settings',
 | 
				
			||||||
 | 
					    order: 2,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  children: [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      path: '/system/dept',
 | 
				
			||||||
 | 
					      name: 'Dept',
 | 
				
			||||||
 | 
					      component: () => import('@/views/system/dept/index.vue'),
 | 
				
			||||||
 | 
					      meta: {
 | 
				
			||||||
 | 
					        locale: 'menu.system.dept.list',
 | 
				
			||||||
 | 
					        requiresAuth: true,
 | 
				
			||||||
 | 
					        roles: ['*'],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default System;
 | 
				
			||||||
@@ -9,7 +9,7 @@ const USER: AppRouteRecordRaw = {
 | 
				
			|||||||
    locale: 'menu.user',
 | 
					    locale: 'menu.user',
 | 
				
			||||||
    icon: 'icon-user',
 | 
					    icon: 'icon-user',
 | 
				
			||||||
    requiresAuth: true,
 | 
					    requiresAuth: true,
 | 
				
			||||||
    order: 8,
 | 
					    order: 9,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  children: [
 | 
					  children: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ const useLoginStore = defineStore('user', {
 | 
				
			|||||||
    phone: undefined,
 | 
					    phone: undefined,
 | 
				
			||||||
    email: '',
 | 
					    email: '',
 | 
				
			||||||
    avatar: undefined,
 | 
					    avatar: undefined,
 | 
				
			||||||
    notes: undefined,
 | 
					    description: undefined,
 | 
				
			||||||
    pwdResetTime: undefined,
 | 
					    pwdResetTime: undefined,
 | 
				
			||||||
    registrationDate: undefined,
 | 
					    registrationDate: undefined,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ export interface UserState {
 | 
				
			|||||||
  phone?: string;
 | 
					  phone?: string;
 | 
				
			||||||
  email: string;
 | 
					  email: string;
 | 
				
			||||||
  avatar?: string;
 | 
					  avatar?: string;
 | 
				
			||||||
  notes?: string;
 | 
					  description?: string;
 | 
				
			||||||
  pwdResetTime?: string;
 | 
					  pwdResetTime?: string;
 | 
				
			||||||
  registrationDate?: string;
 | 
					  registrationDate?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@
 | 
				
			|||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
  import { computed, ref, reactive } from 'vue';
 | 
					  import { computed, ref, reactive } from 'vue';
 | 
				
			||||||
  import useLoading from '@/hooks/loading';
 | 
					  import useLoading from '@/hooks/loading';
 | 
				
			||||||
  import { queryLoginLogList, LoginLogRecord, LoginLogParams } from '@/api/monitor/log';
 | 
					  import { getLoginLogList, LoginLogRecord, LoginLogParams } from '@/api/monitor/log';
 | 
				
			||||||
  import { Pagination } from '@/types/global';
 | 
					  import { Pagination } from '@/types/global';
 | 
				
			||||||
  import { PaginationProps } from '@arco-design/web-vue';
 | 
					  import { PaginationProps } from '@arco-design/web-vue';
 | 
				
			||||||
  import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
 | 
					  import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
 | 
				
			||||||
@@ -171,7 +171,7 @@
 | 
				
			|||||||
  ) => {
 | 
					  ) => {
 | 
				
			||||||
    setLoading(true);
 | 
					    setLoading(true);
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const { data } = await queryLoginLogList(params);
 | 
					      const { data } = await getLoginLogList(params);
 | 
				
			||||||
      renderData.value = data.list;
 | 
					      renderData.value = data.list;
 | 
				
			||||||
      pagination.current = params.page;
 | 
					      pagination.current = params.page;
 | 
				
			||||||
      pagination.total = data.total;
 | 
					      pagination.total = data.total;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,7 +80,7 @@
 | 
				
			|||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
  import { computed, ref, reactive } from 'vue';
 | 
					  import { computed, ref, reactive } from 'vue';
 | 
				
			||||||
  import useLoading from '@/hooks/loading';
 | 
					  import useLoading from '@/hooks/loading';
 | 
				
			||||||
  import { queryOperationLogList, OperationLogRecord, OperationLogParams } from '@/api/monitor/log';
 | 
					  import { getOperationLogList, OperationLogRecord, OperationLogParams } from '@/api/monitor/log';
 | 
				
			||||||
  import { Pagination } from '@/types/global';
 | 
					  import { Pagination } from '@/types/global';
 | 
				
			||||||
  import { PaginationProps } from '@arco-design/web-vue';
 | 
					  import { PaginationProps } from '@arco-design/web-vue';
 | 
				
			||||||
  import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
 | 
					  import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
 | 
				
			||||||
@@ -181,7 +181,7 @@
 | 
				
			|||||||
  ) => {
 | 
					  ) => {
 | 
				
			||||||
    setLoading(true);
 | 
					    setLoading(true);
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const { data } = await queryOperationLogList(params);
 | 
					      const { data } = await getOperationLogList(params);
 | 
				
			||||||
      renderData.value = data.list;
 | 
					      renderData.value = data.list;
 | 
				
			||||||
      pagination.current = params.page;
 | 
					      pagination.current = params.page;
 | 
				
			||||||
      pagination.total = data.total;
 | 
					      pagination.total = data.total;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -227,9 +227,9 @@
 | 
				
			|||||||
  import { computed, ref, reactive } from 'vue';
 | 
					  import { computed, ref, reactive } from 'vue';
 | 
				
			||||||
  import useLoading from '@/hooks/loading';
 | 
					  import useLoading from '@/hooks/loading';
 | 
				
			||||||
  import {
 | 
					  import {
 | 
				
			||||||
    querySystemLogDetail,
 | 
					    getSystemLogDetail,
 | 
				
			||||||
    SystemLogDetailRecord,
 | 
					    SystemLogDetailRecord,
 | 
				
			||||||
    querySystemLogList,
 | 
					    getSystemLogList,
 | 
				
			||||||
    SystemLogRecord,
 | 
					    SystemLogRecord,
 | 
				
			||||||
    SystemLogParams,
 | 
					    SystemLogParams,
 | 
				
			||||||
  } from '@/api/monitor/log';
 | 
					  } from '@/api/monitor/log';
 | 
				
			||||||
@@ -352,7 +352,7 @@
 | 
				
			|||||||
  ) => {
 | 
					  ) => {
 | 
				
			||||||
    setLoading(true);
 | 
					    setLoading(true);
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const { data } = await querySystemLogList(params);
 | 
					      const { data } = await getSystemLogList(params);
 | 
				
			||||||
      renderData.value = data.list;
 | 
					      renderData.value = data.list;
 | 
				
			||||||
      pagination.current = params.page;
 | 
					      pagination.current = params.page;
 | 
				
			||||||
      pagination.total = data.total;
 | 
					      pagination.total = data.total;
 | 
				
			||||||
@@ -373,7 +373,7 @@
 | 
				
			|||||||
    visible.value = true;
 | 
					    visible.value = true;
 | 
				
			||||||
    detailLoading.value = true;
 | 
					    detailLoading.value = true;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const { data } = await querySystemLogDetail(logId);
 | 
					      const { data } = await getSystemLogDetail(logId);
 | 
				
			||||||
      renderDetailData.value = data;
 | 
					      renderDetailData.value = data;
 | 
				
			||||||
    } finally {
 | 
					    } finally {
 | 
				
			||||||
      detailLoading.value = false;
 | 
					      detailLoading.value = false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@
 | 
				
			|||||||
  import { computed, ref, reactive } from 'vue';
 | 
					  import { computed, ref, reactive } from 'vue';
 | 
				
			||||||
  import useLoading from '@/hooks/loading';
 | 
					  import useLoading from '@/hooks/loading';
 | 
				
			||||||
  import { Message } from '@arco-design/web-vue';
 | 
					  import { Message } from '@arco-design/web-vue';
 | 
				
			||||||
  import { queryOnlineUserList, OnlineUserRecord, OnlineUserParams, kickout } from '@/api/monitor/online';
 | 
					  import { getOnlineUserList, OnlineUserRecord, OnlineUserParams, kickout } from '@/api/monitor/online';
 | 
				
			||||||
  import { Pagination } from '@/types/global';
 | 
					  import { Pagination } from '@/types/global';
 | 
				
			||||||
  import { PaginationProps } from '@arco-design/web-vue';
 | 
					  import { PaginationProps } from '@arco-design/web-vue';
 | 
				
			||||||
  import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
 | 
					  import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
 | 
				
			||||||
@@ -83,7 +83,6 @@
 | 
				
			|||||||
  const queryFormRef = ref<FormInstance>();
 | 
					  const queryFormRef = ref<FormInstance>();
 | 
				
			||||||
  const queryFormData = ref({
 | 
					  const queryFormData = ref({
 | 
				
			||||||
    nickname: '',
 | 
					    nickname: '',
 | 
				
			||||||
    status: undefined,
 | 
					 | 
				
			||||||
    loginTime: [],
 | 
					    loginTime: [],
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -159,7 +158,7 @@
 | 
				
			|||||||
  ) => {
 | 
					  ) => {
 | 
				
			||||||
    setLoading(true);
 | 
					    setLoading(true);
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const { data } = await queryOnlineUserList(params);
 | 
					      const { data } = await getOnlineUserList(params);
 | 
				
			||||||
      renderData.value = data.list;
 | 
					      renderData.value = data.list;
 | 
				
			||||||
      pagination.current = params.page;
 | 
					      pagination.current = params.page;
 | 
				
			||||||
      pagination.total = data.total;
 | 
					      pagination.total = data.total;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										182
									
								
								continew-admin-ui/src/views/system/dept/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								continew-admin-ui/src/views/system/dept/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="container">
 | 
				
			||||||
 | 
					    <Breadcrumb :items="['menu.system', 'menu.system.dept.list']" />
 | 
				
			||||||
 | 
					    <a-card class="general-card">
 | 
				
			||||||
 | 
					      <a-row :gutter="20">
 | 
				
			||||||
 | 
					        <a-col>
 | 
				
			||||||
 | 
					          <!-- 工具栏 -->
 | 
				
			||||||
 | 
					          <div class="head-container">
 | 
				
			||||||
 | 
					            <a-form ref="queryFormRef" :model="queryFormData" layout="inline">
 | 
				
			||||||
 | 
					              <a-form-item field="deptName" hide-label>
 | 
				
			||||||
 | 
					                <a-input
 | 
				
			||||||
 | 
					                  v-model="queryFormData.deptName"
 | 
				
			||||||
 | 
					                  placeholder="输入部门名称搜索"
 | 
				
			||||||
 | 
					                  allow-clear
 | 
				
			||||||
 | 
					                  style="width: 150px;"
 | 
				
			||||||
 | 
					                  @press-enter="toQuery"
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					              </a-form-item>
 | 
				
			||||||
 | 
					              <a-form-item field="status" hide-label>
 | 
				
			||||||
 | 
					                <a-select
 | 
				
			||||||
 | 
					                  v-model="queryFormData.status"
 | 
				
			||||||
 | 
					                  :options="statusOptions"
 | 
				
			||||||
 | 
					                  placeholder="状态搜索"
 | 
				
			||||||
 | 
					                  allow-clear
 | 
				
			||||||
 | 
					                  style="width: 150px;"
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
 | 
					              </a-form-item>
 | 
				
			||||||
 | 
					              <a-button type="primary" @click="toQuery">
 | 
				
			||||||
 | 
					                <template #icon>
 | 
				
			||||||
 | 
					                  <icon-search />
 | 
				
			||||||
 | 
					                </template>
 | 
				
			||||||
 | 
					                查询
 | 
				
			||||||
 | 
					              </a-button>
 | 
				
			||||||
 | 
					              <a-button @click="resetQuery">
 | 
				
			||||||
 | 
					                <template #icon>
 | 
				
			||||||
 | 
					                  <icon-refresh />
 | 
				
			||||||
 | 
					                </template>
 | 
				
			||||||
 | 
					                重置
 | 
				
			||||||
 | 
					              </a-button>
 | 
				
			||||||
 | 
					            </a-form>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <!-- 表格渲染 -->
 | 
				
			||||||
 | 
					          <a-table
 | 
				
			||||||
 | 
					            :columns="columns"
 | 
				
			||||||
 | 
					            :data="renderData"
 | 
				
			||||||
 | 
					            :pagination="false"
 | 
				
			||||||
 | 
					            :default-expand-all-rows="true"
 | 
				
			||||||
 | 
					            :hide-expand-button-on-empty="true"
 | 
				
			||||||
 | 
					            ref="tableRef"
 | 
				
			||||||
 | 
					            row-key="deptId"
 | 
				
			||||||
 | 
					            :bordered="false"
 | 
				
			||||||
 | 
					            :stripe="true"
 | 
				
			||||||
 | 
					            :loading="loading"
 | 
				
			||||||
 | 
					            size="large"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <template #status="{ record }">
 | 
				
			||||||
 | 
					              <a-switch v-model="record.status" :checked-value="1" :unchecked-value="2" />
 | 
				
			||||||
 | 
					            </template>
 | 
				
			||||||
 | 
					          </a-table>
 | 
				
			||||||
 | 
					        </a-col>
 | 
				
			||||||
 | 
					      </a-row>
 | 
				
			||||||
 | 
					    </a-card>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts" setup>
 | 
				
			||||||
 | 
					  import { computed, ref } from 'vue';
 | 
				
			||||||
 | 
					  import useLoading from '@/hooks/loading';
 | 
				
			||||||
 | 
					  import { Message, TableInstance } from '@arco-design/web-vue';
 | 
				
			||||||
 | 
					  import { getDeptList, DeptRecord, DeptParams } from '@/api/system/dept';
 | 
				
			||||||
 | 
					  import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
 | 
				
			||||||
 | 
					  import { FormInstance } from '@arco-design/web-vue/es/form';
 | 
				
			||||||
 | 
					  import { SelectOptionData } from '@arco-design/web-vue/es/select/interface';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const { loading, setLoading } = useLoading(true);
 | 
				
			||||||
 | 
					  const tableRef = ref<TableInstance>();
 | 
				
			||||||
 | 
					  const queryFormRef = ref<FormInstance>();
 | 
				
			||||||
 | 
					  const queryFormData = ref({
 | 
				
			||||||
 | 
					    deptName: '',
 | 
				
			||||||
 | 
					    status: undefined,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  const statusOptions = computed<SelectOptionData[]>(() => [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      label: '启用',
 | 
				
			||||||
 | 
					      value: 1,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      label: '禁用',
 | 
				
			||||||
 | 
					      value: 2,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 查询
 | 
				
			||||||
 | 
					  const toQuery = () => {
 | 
				
			||||||
 | 
					    fetchData({
 | 
				
			||||||
 | 
					      ...queryFormData.value,
 | 
				
			||||||
 | 
					    } as unknown as DeptParams);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 重置
 | 
				
			||||||
 | 
					  const resetQuery = async () => {
 | 
				
			||||||
 | 
					    await queryFormRef.value?.resetFields();
 | 
				
			||||||
 | 
					    await fetchData();
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const renderData = ref<DeptRecord[]>([]);
 | 
				
			||||||
 | 
					  const columns = computed<TableColumnData[]>(() => [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      title: '部门名称',
 | 
				
			||||||
 | 
					      dataIndex: 'deptName',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      title: '部门排序',
 | 
				
			||||||
 | 
					      dataIndex: 'deptSort',
 | 
				
			||||||
 | 
					      align: 'center',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      title: '状态',
 | 
				
			||||||
 | 
					      dataIndex: 'status',
 | 
				
			||||||
 | 
					      slotName: 'status',
 | 
				
			||||||
 | 
					      align: 'center',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      title: '描述',
 | 
				
			||||||
 | 
					      dataIndex: 'description',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      title: '修改人',
 | 
				
			||||||
 | 
					      dataIndex: 'updateUserString',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      title: '修改时间',
 | 
				
			||||||
 | 
					      dataIndex: 'updateTime',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 分页查询列表
 | 
				
			||||||
 | 
					  const fetchData = async (
 | 
				
			||||||
 | 
					    params: DeptParams = { page: 1, size: 10, sort: ['parentId,asc', 'deptSort,asc', 'createTime,desc'] }
 | 
				
			||||||
 | 
					  ) => {
 | 
				
			||||||
 | 
					    setLoading(true);
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const { data } = await getDeptList(params);
 | 
				
			||||||
 | 
					      renderData.value = data;
 | 
				
			||||||
 | 
					    } finally {
 | 
				
			||||||
 | 
					      setLoading(false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    setTimeout(function() {
 | 
				
			||||||
 | 
					      tableRef.value?.expandAll();
 | 
				
			||||||
 | 
					    }, 0);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  fetchData();
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					  export default {
 | 
				
			||||||
 | 
					    name: 'Dept',
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="less">
 | 
				
			||||||
 | 
					  .container {
 | 
				
			||||||
 | 
					    padding: 0 20px 20px 20px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .general-card {
 | 
				
			||||||
 | 
					    padding-top: 25px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .head-container {
 | 
				
			||||||
 | 
					    margin-bottom: 15px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  :deep(.arco-table-th) {
 | 
				
			||||||
 | 
					    &:last-child {
 | 
				
			||||||
 | 
					      .arco-table-th-item-title {
 | 
				
			||||||
 | 
					        margin-left: 16px;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										3
									
								
								continew-admin-ui/src/views/system/dept/locale/en-US.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								continew-admin-ui/src/views/system/dept/locale/en-US.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  'menu.system.dept.list': 'Department management',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										3
									
								
								continew-admin-ui/src/views/system/dept/locale/zh-CN.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								continew-admin-ui/src/views/system/dept/locale/zh-CN.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  'menu.system.dept.list': '部门管理',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -46,7 +46,7 @@
 | 
				
			|||||||
  import { computed, ref, reactive } from 'vue';
 | 
					  import { computed, ref, reactive } from 'vue';
 | 
				
			||||||
  import useLoading from '@/hooks/loading';
 | 
					  import useLoading from '@/hooks/loading';
 | 
				
			||||||
  import { useLoginStore } from '@/store';
 | 
					  import { useLoginStore } from '@/store';
 | 
				
			||||||
  import { queryOperationLogList, OperationLogRecord, OperationLogParams } from '@/api/monitor/log';
 | 
					  import { getOperationLogList, OperationLogRecord, OperationLogParams } from '@/api/monitor/log';
 | 
				
			||||||
  import { Pagination } from '@/types/global';
 | 
					  import { Pagination } from '@/types/global';
 | 
				
			||||||
  import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
 | 
					  import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
 | 
				
			||||||
  import { PaginationProps } from "@arco-design/web-vue";
 | 
					  import { PaginationProps } from "@arco-design/web-vue";
 | 
				
			||||||
@@ -109,7 +109,7 @@
 | 
				
			|||||||
  ) => {
 | 
					  ) => {
 | 
				
			||||||
    setLoading(true);
 | 
					    setLoading(true);
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const { data } = await queryOperationLogList(params);
 | 
					      const { data } = await getOperationLogList(params);
 | 
				
			||||||
      renderData.value = data.list;
 | 
					      renderData.value = data.list;
 | 
				
			||||||
      pagination.current = params.page;
 | 
					      pagination.current = params.page;
 | 
				
			||||||
      pagination.total = data.total;
 | 
					      pagination.total = data.total;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -171,7 +171,7 @@
 | 
				
			|||||||
            captchaBtnNameKey.value = t('userCenter.securitySettings.updateEmail.form.reSendCaptcha');
 | 
					            captchaBtnNameKey.value = t('userCenter.securitySettings.updateEmail.form.reSendCaptcha');
 | 
				
			||||||
            captchaDisable.value = false;
 | 
					            captchaDisable.value = false;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }, 1000)
 | 
					        }, 1000);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
      resetCaptcha();
 | 
					      resetCaptcha();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package top.charles7c.cnadmin.webapi.controller.system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.RequiredArgsConstructor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.swagger.v3.oas.annotations.Operation;
 | 
				
			||||||
 | 
					import io.swagger.v3.oas.annotations.tags.Tag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.http.MediaType;
 | 
				
			||||||
 | 
					import org.springframework.validation.annotation.Validated;
 | 
				
			||||||
 | 
					import org.springframework.web.bind.annotation.GetMapping;
 | 
				
			||||||
 | 
					import org.springframework.web.bind.annotation.RequestMapping;
 | 
				
			||||||
 | 
					import org.springframework.web.bind.annotation.RestController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.common.model.vo.R;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.query.DeptQuery;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.model.vo.DeptVO;
 | 
				
			||||||
 | 
					import top.charles7c.cnadmin.system.service.DeptService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 部门管理 API
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author Charles7c
 | 
				
			||||||
 | 
					 * @since 2023/1/22 17:50
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Tag(name = "部门管理 API")
 | 
				
			||||||
 | 
					@Validated
 | 
				
			||||||
 | 
					@RestController
 | 
				
			||||||
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
 | 
					@RequestMapping(value = "/system/dept", produces = MediaType.APPLICATION_JSON_VALUE)
 | 
				
			||||||
 | 
					public class DeptController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final DeptService deptService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Operation(summary = "查询部门列表")
 | 
				
			||||||
 | 
					    @GetMapping
 | 
				
			||||||
 | 
					    public R<List<DeptVO>> list(@Validated DeptQuery query) {
 | 
				
			||||||
 | 
					        List<DeptVO> list = deptService.list(query);
 | 
				
			||||||
 | 
					        return R.ok(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,6 +1,16 @@
 | 
				
			|||||||
-- liquibase formatted sql
 | 
					-- liquibase formatted sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- changeset Charles7c:1
 | 
					-- changeset Charles7c:1
 | 
				
			||||||
-- 初始化默认用户:admin/123456;test/123456
 | 
					-- 初始化默认部门
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (1, 'Xxx科技有限公司', 0, 1, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (2, '天津总部', 1, 1, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (3, '研发部', 2, 1, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (4, 'UI部', 2, 2, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (5, '测试部', 2, 3, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (6, '运维部', 2, 4, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (7, '研发一组', 3, 1, NULL, 1, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					INSERT IGNORE INTO `sys_dept` VALUES (8, '研发二组', 3, 2, NULL, 2, 1, NOW(), 1, NOW());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- 初始化默认用户:admin/admin123;test/123456
 | 
				
			||||||
INSERT IGNORE INTO `sys_user` VALUES (1, 'admin', '超级管理员', '9802815bcc5baae7feb1ae0d0566baf2', 1, '18888888888', 'charles7c@126.com', NULL, NULL, 1, NOW(), 1, NOW(), 1, NOW());
 | 
					INSERT IGNORE INTO `sys_user` VALUES (1, 'admin', '超级管理员', '9802815bcc5baae7feb1ae0d0566baf2', 1, '18888888888', 'charles7c@126.com', NULL, NULL, 1, NOW(), 1, NOW(), 1, NOW());
 | 
				
			||||||
INSERT IGNORE INTO `sys_user` VALUES (2, 'test', '测试员', '8e114197e1b33783a00542ad67e80516', 0, NULL, NULL, NULL, NULL, 2, NOW(), 1, NOW(), 1, NOW());
 | 
					INSERT IGNORE INTO `sys_user` VALUES (2, 'test', '测试员', '8e114197e1b33783a00542ad67e80516', 0, NULL, NULL, NULL, NULL, 2, NOW(), 1, NOW(), 1, NOW());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,23 @@
 | 
				
			|||||||
-- liquibase formatted sql
 | 
					-- liquibase formatted sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- changeset Charles7c:1
 | 
					-- changeset Charles7c:1
 | 
				
			||||||
 | 
					CREATE TABLE IF NOT EXISTS `sys_dept`  (
 | 
				
			||||||
 | 
					    `dept_id` bigint(20) unsigned AUTO_INCREMENT COMMENT '部门ID',
 | 
				
			||||||
 | 
					    `dept_name` varchar(255) NOT NULL COMMENT '部门名称',
 | 
				
			||||||
 | 
					    `parent_id` bigint(20) unsigned DEFAULT 0 COMMENT '上级部门ID',
 | 
				
			||||||
 | 
					    `dept_sort` int(11) unsigned DEFAULT 999 COMMENT '部门排序',
 | 
				
			||||||
 | 
					    `description` varchar(512) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
 | 
					    `status` tinyint(1) unsigned DEFAULT 1 COMMENT '状态(1启用 2禁用)',
 | 
				
			||||||
 | 
					    `create_user` bigint(20) unsigned NOT NULL COMMENT '创建人',
 | 
				
			||||||
 | 
					    `create_time` datetime NOT NULL COMMENT '创建时间',
 | 
				
			||||||
 | 
					    `update_user` bigint(20) unsigned NOT NULL COMMENT '修改人',
 | 
				
			||||||
 | 
					    `update_time` datetime NOT NULL COMMENT '修改时间',
 | 
				
			||||||
 | 
					    PRIMARY KEY (`dept_id`) USING BTREE,
 | 
				
			||||||
 | 
					    INDEX `idx_parent_id`(`parent_id`) USING BTREE,
 | 
				
			||||||
 | 
					    INDEX `idx_create_user`(`create_user`) USING BTREE,
 | 
				
			||||||
 | 
					    INDEX `idx_update_user`(`update_user`) USING BTREE
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE IF NOT EXISTS `sys_user`  (
 | 
					CREATE TABLE IF NOT EXISTS `sys_user`  (
 | 
				
			||||||
    `user_id` bigint(20) unsigned AUTO_INCREMENT COMMENT '用户ID',
 | 
					    `user_id` bigint(20) unsigned AUTO_INCREMENT COMMENT '用户ID',
 | 
				
			||||||
    `username` varchar(255) NOT NULL COMMENT '用户名',
 | 
					    `username` varchar(255) NOT NULL COMMENT '用户名',
 | 
				
			||||||
@@ -10,7 +27,7 @@ CREATE TABLE IF NOT EXISTS `sys_user`  (
 | 
				
			|||||||
    `phone` varchar(255) DEFAULT NULL COMMENT '手机号码',
 | 
					    `phone` varchar(255) DEFAULT NULL COMMENT '手机号码',
 | 
				
			||||||
    `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
 | 
					    `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
 | 
				
			||||||
    `avatar` varchar(255) DEFAULT NULL COMMENT '头像地址',
 | 
					    `avatar` varchar(255) DEFAULT NULL COMMENT '头像地址',
 | 
				
			||||||
    `notes` varchar(512) DEFAULT NULL COMMENT '备注',
 | 
					    `description` varchar(512) DEFAULT NULL COMMENT '描述',
 | 
				
			||||||
    `status` tinyint(1) unsigned DEFAULT 1 COMMENT '状态(1启用 2禁用)',
 | 
					    `status` tinyint(1) unsigned DEFAULT 1 COMMENT '状态(1启用 2禁用)',
 | 
				
			||||||
    `pwd_reset_time` datetime DEFAULT NULL COMMENT '最后一次修改密码的时间',
 | 
					    `pwd_reset_time` datetime DEFAULT NULL COMMENT '最后一次修改密码的时间',
 | 
				
			||||||
    `create_user` bigint(20) unsigned NOT NULL COMMENT '创建人',
 | 
					    `create_user` bigint(20) unsigned NOT NULL COMMENT '创建人',
 | 
				
			||||||
@@ -20,8 +37,8 @@ CREATE TABLE IF NOT EXISTS `sys_user`  (
 | 
				
			|||||||
    PRIMARY KEY (`user_id`) USING BTREE,
 | 
					    PRIMARY KEY (`user_id`) USING BTREE,
 | 
				
			||||||
    UNIQUE INDEX `uk_username`(`username`) USING BTREE,
 | 
					    UNIQUE INDEX `uk_username`(`username`) USING BTREE,
 | 
				
			||||||
    UNIQUE INDEX `uk_email`(`email`) USING BTREE,
 | 
					    UNIQUE INDEX `uk_email`(`email`) USING BTREE,
 | 
				
			||||||
    INDEX `idx_createUser`(`create_user`) USING BTREE,
 | 
					    INDEX `idx_create_user`(`create_user`) USING BTREE,
 | 
				
			||||||
    INDEX `idx_updateUser`(`update_user`) USING BTREE
 | 
					    INDEX `idx_update_user`(`update_user`) USING BTREE
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
 | 
					) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE IF NOT EXISTS `sys_log` (
 | 
					CREATE TABLE IF NOT EXISTS `sys_log` (
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user