feat(新增): 角色相关内容CURD和部分代码生成器修改

This commit is contained in:
Bunny 2024-10-03 15:52:02 +08:00
parent 8c0d72c3ba
commit 5dec36899d
57 changed files with 441 additions and 209 deletions

View File

@ -1,76 +0,0 @@
package cn.bunny.common.generator;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collections;
public class NewCodeGet {
// 数据连接
public static final String sqlHost = "jdbc:mysql://192.168.3.98:3304/auth_admin?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
// 作者名称
public static final String author = "Bunny";
// 公共路径
public static final String outputDir = "D:\\MyFolder\\auth-admin\\auth-server-java\\service";
// public static final String outputDir = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service";
// 实体类名称
public static final String entity = "Bunny";
public static void main(String[] args) {
Generation("sys_router");
}
/**
* 根据表名生成相应结构代码
*
* @param tableName 表名
*/
public static void Generation(String... tableName) {
// TODO 修改数据库路径账户密码
FastAutoGenerator.create(sqlHost, "root", "02120212")
.globalConfig(builder -> {
// 添加作者名称
builder.author(author)
// 启用swagger
.enableSwagger()
// 指定输出目录
.outputDir(outputDir + "/src/main/java");
})
.packageConfig(builder -> builder.entity(entity)// 实体类包名
// 父包名如果为空将下面子包名必须写全部 否则就只需写子包名
.parent("cn.bunny.services")
.controller("controller")// 控制层包名
.mapper("mapper")// mapper层包名
.service("service")// service层包名
.serviceImpl("service.impl")// service实现类包名
// 自定义mapper.xml文件输出目录
.pathInfo(Collections.singletonMap(OutputFile.xml, outputDir + "/src/main/resources/mapper")))
.strategyConfig(builder -> {
// 设置要生成的表名
builder.addInclude(tableName)
.addTablePrefix("sys_")
.entityBuilder()
.enableLombok()
.enableChainModel()
.naming(NamingStrategy.underline_to_camel)// 数据表映射实体命名策略默认下划线转驼峰underline_to_camel
.columnNaming(NamingStrategy.underline_to_camel)// 表字段映射实体属性命名规则默认null不指定按照naming执行
.idType(IdType.ASSIGN_ID)// 添加全局主键类型
.formatFileName("%s")// 格式化实体名称%s取消首字母I,
.mapperBuilder()
.mapperAnnotation(Mapper.class)// 开启mapper注解
.enableBaseResultMap()// 启用xml文件中的BaseResultMap 生成
.enableBaseColumnList()// 启用xml文件中的BaseColumnList
.formatMapperFileName("%sMapper")// 格式化Dao类名称
.formatXmlFileName("%sMapper")// 格式化xml文件名称
.serviceBuilder()
.formatServiceFileName("%sService")// 格式化 service 接口文件名称
.formatServiceImplFileName("%sServiceImpl")// 格式化 service 接口文件名称
.controllerBuilder()
.enableRestStyle();
})
.execute();
}
}

View File

@ -71,12 +71,6 @@ public class AdminCodeGenerator {
.controllerBuilder()
.enableRestStyle();
})
// .injectionConfig(consumer -> {
// Map<String, String> customFile = new HashMap<>();
// // 配置DTO需要的话但是需要有能配置Dto的模板引擎比如freemarker但是这里我们用的VelocityEngine因此不多作介绍
// customFile.put(outputDir, "/src/main/resources/templates/entityDTO.java.ftl");
// consumer.customFile(customFile);
// })
.execute();
}
}

View File

@ -3,9 +3,11 @@ package cn.bunny.common.generator.generator;
import cn.bunny.common.generator.entity.BaseField;
import cn.bunny.common.generator.entity.BaseResultMap;
import cn.bunny.common.generator.utils.GeneratorCodeUtils;
import cn.bunny.dao.dto.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.menuIcon.MenuIconDto;
import cn.bunny.dao.entity.system.MenuIcon;
import cn.bunny.dao.dto.system.role.RoleAddDto;
import cn.bunny.dao.dto.system.role.RoleDto;
import cn.bunny.dao.dto.system.role.RoleUpdateDto;
import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.vo.system.rolePower.RoleVo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.common.base.CaseFormat;
import io.swagger.v3.oas.annotations.media.Schema;
@ -40,7 +42,7 @@ public class WebGeneratorCode {
// 生成vue路径
public static String vuePath = commonPath + "\\views\\system\\";
// 生成仓库路径
public static String storePath = commonPath + "\\store\\modules";
public static String storePath = commonPath + "\\store\\system\\";
// 后端controller
public static String controllerPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\controller\\";
public static String servicePath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\java\\cn\\bunny\\services\\service\\";
@ -49,11 +51,11 @@ public class WebGeneratorCode {
public static String resourceMapperPath = "D:\\Project\\web\\PC\\auth\\auth-server-java\\service\\src\\main\\resources\\mapper\\";
public static void main(String[] args) throws Exception {
Class<MenuIcon> originalClass = MenuIcon.class;
Class<MenuIconDto> dtoClass = MenuIconDto.class;
Class<MenuIconAddDto> addDtoClass = MenuIconAddDto.class;
// Class<MenuIconUpdateDto> updateDtoClass = MenuIconUpdateDto.class;
// Class<MenuIconVo> voClass = MenuIconVo.class;
Class<?> originalClass = Role.class;
Class<?> dtoClass = RoleDto.class;
Class<?> addDtoClass = RoleAddDto.class;
Class<?> updateDtoClass = RoleUpdateDto.class;
Class<?> voClass = RoleVo.class;
// 设置velocity资源加载器
Properties prop = new Properties();
@ -136,7 +138,7 @@ public class WebGeneratorCode {
/**
* 生成后端内容
*/
public static void generatorServerCode(Class<MenuIcon> originalClass, Class<MenuIconDto> dtoClass, VelocityContext context) {
public static void generatorServerCode(Class<?> originalClass, Class<?> dtoClass, VelocityContext context) {
Field[] superFields = originalClass.getSuperclass().getDeclaredFields();
Field[] declaredFields = originalClass.getDeclaredFields();
Field[] mergedArray = new Field[superFields.length + declaredFields.length];
@ -186,6 +188,7 @@ public class WebGeneratorCode {
*/
public static void writeFiles(String lowercaseName, String lowerHyphen, String originalName, VelocityContext context) throws IOException {
context.put("apiPath", GeneratorCodeUtils.ReplacePathHandle(apiPath) + lowercaseName);
context.put("storePath", GeneratorCodeUtils.ReplacePathHandle(storePath) + lowercaseName + ".ts");
context.put("typesPath", GeneratorCodeUtils.ReplacePathHandle(vuePath) + lowercaseName + "/utils/types");
context.put("hookPath", GeneratorCodeUtils.ReplacePathHandle(vuePath) + lowercaseName + "/utils/hooks");
context.put("columnsPath", GeneratorCodeUtils.ReplacePathHandle(vuePath) + lowercaseName + "/utils/columns");

View File

@ -2,28 +2,28 @@ import { http } from '@/api/service/request';
import type { BaseResult, ResultTable } from '@/api/service/types';
/**
* ${classDescription}---获取多语言列表
* ${classDescription}---获取${classDescription}列表
*/
export const fetchGet${originalName}List = (data: any) => {
return http.request<BaseResult<ResultTable>>('get', `${lowercaseName}/get${originalName}List/${data.currentPage}/${data.pageSize}`, { params: data });
};
/**
* ${classDescription}---添加多语言
* ${classDescription}---添加${classDescription}
*/
export const fetchAdd${originalName} = (data: any) => {
return http.request<BaseResult<object>>('post', '${lowercaseName}/add${originalName}', { data });
};
/**
* ${classDescription}---更新多语言
* ${classDescription}---更新${classDescription}
*/
export const fetchUpdate${originalName} = (data: any) => {
return http.request<BaseResult<object>>('put', '${lowercaseName}/update${originalName}', { data });
};
/**
* ${classDescription}---删除多语言
* ${classDescription}---删除${classDescription}
*/
export const fetchDelete${originalName} = (data: any) => {
return http.request<BaseResult<object>>('delete', '${lowercaseName}/delete${originalName}', { data });

View File

@ -1,10 +1,9 @@
<script lang="ts" setup>
import { ref } from 'vue';
import { FormInstance } from 'element-plus';
import { rules } from '${hookPath}';
import { rules } from '${columnsPath}';
import { FormProps } from '${typesPath}';
import { frameSureOptions } from '@/enums';
import Segmented from '@/components/ReSegmented';
import { $t } from '@/plugins/i18n';
const props = withDefaults(defineProps<FormProps>(), {

View File

@ -1,7 +1,7 @@
import { deviceDetection } from '@pureadmin/utils';
import { addDialog } from '@/components/BaseDialog/index';
import ${originalName}Dialog from '${dialogPath}';
import { use${originalName}Store } from '@/store/modules/${lowercaseName}';
import { use${originalName}Store } from '${storePath}';
import { h, ref } from 'vue';
import { messageBox } from '@/utils/message';
import type { FormItemProps } from '${typesPath}';
@ -20,11 +20,11 @@ export async function onSearch() {
}
/**
* * 添加${${classTitle}}
* * 添加${classTitle}
*/
export function onAdd() {
addDialog({
title: `$leftBrace $t("add")} $leftBrace$t("${lowercaseName}")}`,
title: `$leftBrace $t("add_new")}$leftBrace$t("${lowercaseName}")}`,
width: '30%',
props: {
formInline: {
@ -58,7 +58,7 @@ export function onAdd() {
*/
export function onUpdate(row: any) {
addDialog({
title: `$leftBrace$t("modify")} $leftBrace$t("${lowercaseName}")}`,
title: `$leftBrace$t("modify")}$leftBrace$t("${lowercaseName}")}`,
width: '30%',
props: {
formInline: {

View File

@ -2,7 +2,6 @@
import { onMounted, ref } from 'vue';
import { columns } from '${columnsPath}';
import PureTableBar from '@/components/TableBar/src/bar';
import { useRenderIcon } from '@/components/ReIcon/src/hooks';
import AddFill from '@iconify-icons/ri/add-circle-line';
import PureTable from '@pureadmin/table';
import { onAdd, onDelete, onSearch, onUpdate } from '${hookPath}';
@ -11,7 +10,8 @@
import Refresh from '@iconify-icons/ep/refresh';
import { selectUserinfo } from '@/components/Table/Userinfo/columns';
import { $t } from '@/plugins/i18n';
import { use${originalName}Store } from '@/store/modules/${lowercaseName}';
import { use${originalName}Store } from '${storePath}';
import { useRenderIcon } from '@/components/CommonIcon/src/hooks';
const tableRef = ref();
const formRef = ref();
@ -33,7 +33,7 @@
<el-form ref="formRef" :inline="true" :model="${lowercaseName}Store.form" class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px] overflow-auto">
#foreach($item in $formList)
<el-form-item :label="$t('${lowercaseName}_${item.name}')" prop="${item.name}">
<el-input v-model="${lowercaseName}Store.form.${item.name}" :placeholder="`$leftBrace$t('input')} $leftBrace$t('${item.name}')}`" class="!w-[180px]" clearable />
<el-input v-model="${lowercaseName}Store.form.${item.name}" :placeholder="`$leftBrace$t('input')}$leftBrace$t('${lowercaseName}_${item.name}')}`" class="!w-[180px]" clearable />
</el-form-item>
#end
<el-form-item>

View File

@ -2,6 +2,7 @@ import { defineStore } from 'pinia';
import { fetchAdd${originalName}, fetchDelete${originalName}, fetchGet${originalName}List, fetchUpdate${originalName} } from '${apiPath}';
import { pageSizes } from '@/enums/baseConstant';
import { storeMessage } from '@/utils/message';
import { storePagination } from '@/store/useStorePagination';
/**
* ${classTitle} Store
@ -35,21 +36,18 @@ export const use${originalName}Store = defineStore('${lowercaseName}Store', {
* * 获取${classTitle}
*/
async get${originalName}List() {
const data = { ...this.pagination, ...this.form };
// 整理请求参数
const data = { ...this.pagination, ...this.form };
delete data.pageSizes;
delete data.total;
delete data.background;
// 获取${classTitle}列表
const result = await fetchGet${originalName}List(data);
if (result.code === 200) {
this.datalist = result.data.list;
this.pagination.currentPage = result.data.pageNo;
this.pagination.pageSize = result.data.pageSize;
this.pagination.total = result.data.total;
return true;
}
return false;
// 公共页面函数hook
const pagination = storePagination.bind(this);
return pagination(result);
},
/**

View File

@ -1,10 +1,10 @@
package cn.bunny.common.service.context;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.user.LoginVo;
public class BaseContext {
private static final ThreadLocal<Long> userId = new ThreadLocal<>();
private static final ThreadLocal<String> username = new ThreadLocal<String>();
private static final ThreadLocal<String> username = new ThreadLocal<>();
private static final ThreadLocal<LoginVo> loginVo = new ThreadLocal<>();
// 用户id相关

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.email;
package cn.bunny.dao.dto.system.email;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.email;
package cn.bunny.dao.dto.system.email;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.menuIcon;
package cn.bunny.dao.dto.system.menuIcon;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.menuIcon;
package cn.bunny.dao.dto.system.menuIcon;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.menuIcon;
package cn.bunny.dao.dto.system.menuIcon;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -0,0 +1,27 @@
package cn.bunny.dao.dto.system.role;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RoleAddDto对象", title = "角色", description = "角色管理")
public class RoleAddDto {
@Schema(name = "roleCode", title = "角色代码")
@NotBlank(message = "roleCode 不能为空")
private String roleCode;
@Schema(name = "description", title = "描述")
@NotBlank(message = "description 不能为空")
private String description;
}

View File

@ -0,0 +1,23 @@
package cn.bunny.dao.dto.system.role;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RoleDto对象", title = "角色", description = "角色管理")
public class RoleDto {
@Schema(name = "roleCode", title = "角色代码")
private String roleCode;
@Schema(name = "description", title = "描述")
private String description;
}

View File

@ -0,0 +1,30 @@
package cn.bunny.dao.dto.system.role;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RoleUpdateDto对象", title = "角色", description = "角色管理")
public class RoleUpdateDto {
@Schema(name = "id", title = "主键")
@NotNull(message = "id不能为空")
private Long id;
@Schema(name = "roleCode", title = "角色代码")
@NotBlank(message = "roleCode 不能为空")
private String roleCode;
@Schema(name = "description", title = "描述")
@NotBlank(message = "description 不能为空")
private String description;
}

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.router;
package cn.bunny.dao.dto.system.router;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.router;
package cn.bunny.dao.dto.system.router;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.router;
package cn.bunny.dao.dto.system.router;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.user;
package cn.bunny.dao.dto.system.user;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.dto.user;
package cn.bunny.dao.dto.system.user;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;

View File

@ -21,3 +21,4 @@ public class Role extends BaseEntity {
private String description;
}

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.email;
package cn.bunny.dao.vo.system.email;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.menuIcon;
package cn.bunny.dao.vo.system.menuIcon;
import cn.bunny.dao.vo.BaseVo;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@ -0,0 +1,21 @@
package cn.bunny.dao.vo.system.rolePower;
import cn.bunny.dao.vo.BaseVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RoleVo对象", title = "角色", description = "角色管理")
public class RoleVo extends BaseVo {
@Schema(name = "roleCode", title = "角色代码")
private String roleCode;
@Schema(name = "description", title = "描述")
private String description;
}

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.router;
package cn.bunny.dao.vo.system.router;
import cn.bunny.dao.vo.BaseVo;
import com.alibaba.fastjson2.annotation.JSONField;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.router;
package cn.bunny.dao.vo.system.router;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.router;
package cn.bunny.dao.vo.system.router;
import com.alibaba.fastjson2.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.user;
package cn.bunny.dao.vo.system.user;
import cn.bunny.dao.vo.BaseVo;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.user;
package cn.bunny.dao.vo.system.user;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.user;
package cn.bunny.dao.vo.system.user;
import cn.bunny.dao.vo.BaseVo;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@ -1,4 +1,4 @@
package cn.bunny.dao.vo.user;
package cn.bunny.dao.vo.system.user;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;

View File

@ -1,13 +1,13 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.entity.system.MenuIcon;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.menuIcon.MenuIconVo;
import cn.bunny.dao.vo.system.menuIcon.MenuIconVo;
import cn.bunny.services.service.MenuIconService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;

View File

@ -1,18 +1,72 @@
package cn.bunny.services.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.bunny.dao.dto.system.role.RoleAddDto;
import cn.bunny.dao.dto.system.role.RoleDto;
import cn.bunny.dao.dto.system.role.RoleUpdateDto;
import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.system.rolePower.RoleVo;
import cn.bunny.services.service.RoleService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import java.util.List;
/**
* <p>
* 前端控制器
* 角色表 前端控制器
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-10-03 14:26:24
*/
@Tag(name = "角色", description = "角色相关接口")
@RestController
@RequestMapping("/role")
@RequestMapping("admin/role")
public class RoleController {
@Autowired
private RoleService roleService;
@Operation(summary = "分页查询角色", description = "分页查询角色")
@GetMapping("getRoleList/{page}/{limit}")
public Mono<Result<PageResult<RoleVo>>> getRoleList(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
RoleDto dto) {
Page<Role> pageParams = new Page<>(page, limit);
PageResult<RoleVo> pageResult = roleService.getRoleList(pageParams, dto);
return Mono.just(Result.success(pageResult));
}
@Operation(summary = "添加角色", description = "添加角色")
@PostMapping("addRole")
public Mono<Result<String>> addRole(@Valid @RequestBody RoleAddDto dto) {
roleService.addRole(dto);
return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS));
}
@Operation(summary = "更新角色", description = "更新角色")
@PutMapping("updateRole")
public Mono<Result<String>> updateRole(@Valid @RequestBody RoleUpdateDto dto) {
roleService.updateRole(dto);
return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS));
}
@Operation(summary = "删除角色", description = "删除角色")
@DeleteMapping("deleteRole")
public Mono<Result<String>> deleteRole(@RequestBody List<Long> ids) {
roleService.deleteRole(ids);
return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS));
}
}

View File

@ -1,14 +1,14 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.router.RouterAddDto;
import cn.bunny.dao.dto.router.RouterManageDto;
import cn.bunny.dao.dto.router.RouterUpdateDto;
import cn.bunny.dao.dto.system.router.RouterAddDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterUpdateDto;
import cn.bunny.dao.entity.system.Router;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.router.RouterManageVo;
import cn.bunny.dao.vo.router.UserRouterVo;
import cn.bunny.dao.vo.system.router.RouterManageVo;
import cn.bunny.dao.vo.system.router.UserRouterVo;
import cn.bunny.services.service.RouterService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;

View File

@ -1,10 +1,10 @@
package cn.bunny.services.controller;
import cn.bunny.dao.dto.user.RefreshTokenDto;
import cn.bunny.dao.dto.system.user.RefreshTokenDto;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.user.RefreshTokenVo;
import cn.bunny.dao.vo.user.UserVo;
import cn.bunny.dao.vo.system.user.RefreshTokenVo;
import cn.bunny.dao.vo.system.user.UserVo;
import cn.bunny.services.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -1,8 +1,8 @@
package cn.bunny.services.factory;
import cn.bunny.dao.vo.common.TreeSelectVo;
import cn.bunny.dao.vo.router.RouterManageVo;
import cn.bunny.dao.vo.router.UserRouterVo;
import cn.bunny.dao.vo.system.router.RouterManageVo;
import cn.bunny.dao.vo.system.router.UserRouterVo;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;

View File

@ -9,7 +9,7 @@ import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.constant.LocalDateTimeConstant;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.constant.UserConstant;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import cn.bunny.services.mapper.PowerMapper;
import cn.bunny.services.mapper.RoleMapper;
import org.springframework.beans.BeanUtils;

View File

@ -1,6 +1,6 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.dto.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconDto;
import cn.bunny.dao.entity.system.MenuIcon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@ -1,23 +1,43 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.dto.system.role.RoleDto;
import cn.bunny.dao.entity.system.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* <p>
* Mapper 接口
* 角色 Mapper 接口
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-10-03 14:26:24
*/
@Mapper
public interface RoleMapper extends BaseMapper<Role> {
/**
* * 分页查询角色内容
*
* @param pageParams 角色分页参数
* @param dto 角色查询表单
* @return 角色分页结果
*/
IPage<Role> selectListByPage(@Param("page") Page<Role> pageParams, @Param("dto") RoleDto dto);
/**
* 物理删除角色
*
* @param ids 删除 id 列表
*/
void deleteBatchIdsWithPhysics(List<Long> ids);
/**
* * 根据用户id查询当前用户所有角色
*

View File

@ -1,7 +1,7 @@
package cn.bunny.services.mapper;
import cn.bunny.dao.dto.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.entity.system.Router;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@ -95,7 +95,8 @@ public class WebSecurityConfig {
"/", "/ws/**",
"/*/*/noAuth/**", "/*/noAuth/**", "/noAuth/**",
"/media.ico", "/favicon.ico", "*.html", "/webjars/**",
"/swagger-resources/**", "/v3/**", "/swagger-ui/**"
"/swagger-resources/**", "/v3/**", "/swagger-ui/**",
"/*/i18n/getI18n"
};
return web -> web.ignoring().requestMatchers(annotations);
}

View File

@ -7,7 +7,7 @@ import cn.bunny.common.service.utils.ResponseUtil;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import com.alibaba.fastjson2.JSON;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;

View File

@ -1,7 +1,7 @@
package cn.bunny.services.security.filter;
import cn.bunny.common.service.context.BaseContext;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;

View File

@ -1,11 +1,11 @@
package cn.bunny.services.security.filter;
import cn.bunny.dao.dto.user.LoginDto;
import cn.bunny.dao.dto.system.user.LoginDto;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.result.Result;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import cn.bunny.services.security.handelr.SecurityAuthenticationFailureHandler;
import cn.bunny.services.security.handelr.SecurityAuthenticationSuccessHandler;
import cn.bunny.services.security.service.CustomUserDetailsService;

View File

@ -1,7 +1,7 @@
package cn.bunny.services.security.service;
import cn.bunny.dao.dto.user.LoginDto;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.dto.system.user.LoginDto;
import cn.bunny.dao.vo.system.user.LoginVo;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

View File

@ -1,11 +1,11 @@
package cn.bunny.services.security.service.iml;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.user.LoginDto;
import cn.bunny.dao.dto.system.user.LoginDto;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import cn.bunny.services.factory.UserFactory;
import cn.bunny.services.mapper.RoleMapper;
import cn.bunny.services.mapper.UserMapper;

View File

@ -1,11 +1,11 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.entity.system.MenuIcon;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.menuIcon.MenuIconVo;
import cn.bunny.dao.vo.system.menuIcon.MenuIconVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;

View File

@ -1,16 +1,52 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.system.role.RoleAddDto;
import cn.bunny.dao.dto.system.role.RoleDto;
import cn.bunny.dao.dto.system.role.RoleUpdateDto;
import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.system.rolePower.RoleVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;
import java.util.List;
/**
* <p>
* 服务类
* 角色 服务类
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-10-03 14:26:24
*/
public interface RoleService extends IService<Role> {
/**
* * 获取角色列表
*
* @return 角色返回列表
*/
PageResult<RoleVo> getRoleList(Page<Role> pageParams, RoleDto dto);
/**
* * 添加角色
*
* @param dto 添加表单
*/
void addRole(@Valid RoleAddDto dto);
/**
* * 更新角色
*
* @param dto 更新表单
*/
void updateRole(@Valid RoleUpdateDto dto);
/**
* * 删除|批量删除角色类型
*
* @param ids 删除id列表
*/
void deleteRole(List<Long> ids);
}

View File

@ -1,12 +1,12 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.router.RouterAddDto;
import cn.bunny.dao.dto.router.RouterManageDto;
import cn.bunny.dao.dto.router.RouterUpdateDto;
import cn.bunny.dao.dto.system.router.RouterAddDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterUpdateDto;
import cn.bunny.dao.entity.system.Router;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.router.RouterManageVo;
import cn.bunny.dao.vo.router.UserRouterVo;
import cn.bunny.dao.vo.system.router.RouterManageVo;
import cn.bunny.dao.vo.system.router.UserRouterVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;

View File

@ -1,9 +1,9 @@
package cn.bunny.services.service;
import cn.bunny.dao.dto.user.RefreshTokenDto;
import cn.bunny.dao.dto.system.user.RefreshTokenDto;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.vo.user.RefreshTokenVo;
import cn.bunny.dao.vo.user.UserVo;
import cn.bunny.dao.vo.system.user.RefreshTokenVo;
import cn.bunny.dao.vo.system.user.UserVo;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jetbrains.annotations.NotNull;

View File

@ -1,11 +1,11 @@
package cn.bunny.services.service.impl;
import cn.bunny.dao.dto.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconAddDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconDto;
import cn.bunny.dao.dto.system.menuIcon.MenuIconUpdateDto;
import cn.bunny.dao.entity.system.MenuIcon;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.menuIcon.MenuIconVo;
import cn.bunny.dao.vo.system.menuIcon.MenuIconVo;
import cn.bunny.services.mapper.MenuIconMapper;
import cn.bunny.services.service.MenuIconService;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@ -1,20 +1,92 @@
package cn.bunny.services.service.impl;
import cn.bunny.dao.dto.system.role.RoleAddDto;
import cn.bunny.dao.dto.system.role.RoleDto;
import cn.bunny.dao.dto.system.role.RoleUpdateDto;
import cn.bunny.dao.entity.system.Role;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.vo.system.rolePower.RoleVo;
import cn.bunny.services.mapper.RoleMapper;
import cn.bunny.services.service.RoleService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.validation.Valid;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 服务实现类
* 角色 服务实现类
* </p>
*
* @author Bunny
* @since 2024-09-26
* @since 2024-10-03 14:26:24
*/
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
/**
* * 角色 服务实现类
*
* @param pageParams 角色分页查询page对象
* @param dto 角色分页查询对象
* @return 查询分页角色返回对象
*/
@Override
public PageResult<RoleVo> getRoleList(Page<Role> pageParams, RoleDto dto) {
// 分页查询菜单图标
IPage<Role> page = baseMapper.selectListByPage(pageParams, dto);
List<RoleVo> voList = page.getRecords().stream().map(Role -> {
RoleVo RoleVo = new RoleVo();
BeanUtils.copyProperties(Role, RoleVo);
return RoleVo;
}).toList();
return PageResult.<RoleVo>builder()
.list(voList)
.pageNo(page.getCurrent())
.pageSize(page.getSize())
.total(page.getTotal())
.build();
}
/**
* 添加角色
*
* @param dto 角色添加
*/
@Override
public void addRole(@Valid RoleAddDto dto) {
// 保存数据
Role role = new Role();
BeanUtils.copyProperties(dto, role);
save(role);
}
/**
* 更新角色
*
* @param dto 角色更新
*/
@Override
public void updateRole(@Valid RoleUpdateDto dto) {
// 更新内容
Role role = new Role();
BeanUtils.copyProperties(dto, role);
updateById(role);
}
/**
* 删除|批量删除角色
*
* @param ids 删除id列表
*/
@Override
public void deleteRole(List<Long> ids) {
baseMapper.deleteBatchIdsWithPhysics(ids);
}
}

View File

@ -2,17 +2,17 @@ package cn.bunny.services.service.impl;
import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.dao.dto.router.RouterAddDto;
import cn.bunny.dao.dto.router.RouterManageDto;
import cn.bunny.dao.dto.router.RouterUpdateDto;
import cn.bunny.dao.dto.system.router.RouterAddDto;
import cn.bunny.dao.dto.system.router.RouterManageDto;
import cn.bunny.dao.dto.system.router.RouterUpdateDto;
import cn.bunny.dao.entity.system.Router;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.result.PageResult;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.router.RouterManageVo;
import cn.bunny.dao.vo.router.RouterMeta;
import cn.bunny.dao.vo.router.UserRouterVo;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.system.router.RouterManageVo;
import cn.bunny.dao.vo.system.router.RouterMeta;
import cn.bunny.dao.vo.system.router.UserRouterVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import cn.bunny.services.factory.RouterServiceFactory;
import cn.bunny.services.mapper.RouterMapper;
import cn.bunny.services.service.RouterService;

View File

@ -4,15 +4,15 @@ import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.common.service.utils.minio.MinioUtil;
import cn.bunny.dao.dto.user.RefreshTokenDto;
import cn.bunny.dao.dto.system.user.RefreshTokenDto;
import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.entity.system.EmailUsers;
import cn.bunny.dao.pojo.common.EmailSendInit;
import cn.bunny.dao.pojo.constant.RedisUserConstant;
import cn.bunny.dao.pojo.result.ResultCodeEnum;
import cn.bunny.dao.vo.user.LoginVo;
import cn.bunny.dao.vo.user.RefreshTokenVo;
import cn.bunny.dao.vo.user.UserVo;
import cn.bunny.dao.vo.system.user.LoginVo;
import cn.bunny.dao.vo.system.user.RefreshTokenVo;
import cn.bunny.dao.vo.system.user.UserVo;
import cn.bunny.services.factory.EmailFactory;
import cn.bunny.services.factory.UserFactory;
import cn.bunny.services.mapper.EmailUsersMapper;
@ -80,7 +80,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
*/
@NotNull
@Override
public RefreshTokenVo refreshToken(RefreshTokenDto dto) {
public RefreshTokenVo refreshToken(@NotNull RefreshTokenDto dto) {
Long userId = JwtHelper.getUserId(dto.getRefreshToken());
AdminUser adminUser = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId));
@ -113,6 +113,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
public UserVo getUserinfoById(Long id) {
if (id == null) throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY);
AdminUser user = getById(id);
if (user == null) throw new BunnyException(ResultCodeEnum.DATA_NOT_EXIST);
String avatar = user.getAvatar();
UserVo userVo = new UserVo();

View File

@ -5,20 +5,46 @@
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.dao.entity.system.Role">
<id column="id" property="id"/>
<result column="role_code" property="roleCode"/>
<result column="description" property="description"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="create_user" property="createUser"/>
<result column="update_user" property="updateUser"/>
<result column="is_deleted" property="isDeleted"/>
<id column="create_time" property="createTime"/>
<id column="update_time" property="updateTime"/>
<id column="create_user" property="createUser"/>
<id column="update_user" property="updateUser"/>
<id column="is_deleted" property="isDeleted"/>
<id column="role_code" property="roleCode"/>
<id column="description" property="description"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, role_code, description, create_time, update_time, create_user, update_user, is_deleted
id, create_time, update_time, create_user, update_user, is_deleted, role_code, description
</sql>
<!-- 分页查询角色内容 -->
<select id="selectListByPage" resultType="cn.bunny.dao.entity.system.Role">
select
<include refid="Base_Column_List"/>
from sys_role
<where>
<if test="dto.roleCode != null and dto.roleCode != ''">
role_code like CONCAT('%',#{dto.roleCode},'%')
</if>
<if test="dto.description != null and dto.description != ''">
description like CONCAT('%',#{dto.description},'%')
</if>
</where>
order by update_time
</select>
<!-- 物理删除角色 -->
<delete id="deleteBatchIdsWithPhysics">
delete
from sys_role
where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
<!-- 根据用户id查询当前用户所有角色 -->
<select id="selectListByUserId" resultType="cn.bunny.dao.entity.system.Role">
SELECT r.*