Skip to content

修改包名

更换模块名称

shell
ruoyi-system --> ljing-system
ruoyi-quartz --> ljing-quartz
ruoyi-generator --> ljing-generator
ruoyi-framework --> ljing-framework
ruoyi-common --> ljing-common
ruoyi-admin --> ljing-admin
ruoyi --> ljing

更换pom.xml中的名称

shell
com.ruoyi --> net.ljing
ruoyi --> ljing

更换所有的包名

shell
com.ruoyi.system --> net.ljing.system
com.ruoyi.quartz --> net.ljing.quartz
com.ruoyi.generator --> net.ljing.generator
com.ruoyi.framework --> net.ljing.framework
com.ruoyi.common --> net.ljing.common
com.ruoyi.web  --> net.ljing.admin
com.ruoyi  --> net.ljing

替换名称

shell
RuoYiConfig  --> LjingConfig
RuoYiApplication --> LjingApplication
RuoYiServletInitializer --> LjingServletInitializer
application-druid.yml --> application-dev.yml 
com.ruoyi --> net.ljing
ruoyi --> ljing
若依 --> 琳景

新增模块

  • 新增ljing-czb模块,并在主pom添加模块信息
shell
<module>ljing-czb</module>

<dependency>
    <groupId>net.ljing</groupId>
    <artifactId>ljing-czb</artifactId>
    <version>${ljing.version}</version>
</dependency>
  • ljing-admin引入ljing-czb
shell
<dependency>
    <groupId>net.ljing</groupId>
    <artifactId>ljing-czb</artifactId>
</dependency>
  • 在新增模块的pom.xml中添加依赖
shell
<dependency>
    <groupId>net.ljing</groupId>
    <artifactId>ljing-common</artifactId>
</dependency>
<dependency>
    <groupId>net.ljing</groupId>
    <artifactId>ljing-system</artifactId>
</dependency>
<dependency>
    <groupId>net.ljing</groupId>
    <artifactId>ljing-framework</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
</dependency>
<dependency>
    <groupId>cn.hutool.v7</groupId>
    <artifactId>hutool-all</artifactId>
    <version>7.0.0-M1</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
  • LoginUser.java中增加代码
java
/**
 * 存储登录的额外信息
 */
private final Map<String, Object> loginMap = new HashMap<>();

public Map<String, Object> getLoginMap() {
    return loginMap;
}
  • 新增 controller/CzbController.java
shell
@RestController
@RequestMapping("/czb")
public class WebController extends BaseController {

    @Anonymous  //无需验证权限
    @RequestMapping("/ping")
    public Object ping() {
        return success("pong");
    }
}
  • 新增 config/CustomException.java
shell
@Slf4j
@Getter
public class CustomException extends RuntimeException {

    private final int code;
    private final Object data;

    public CustomException(String message) {
        this(message, null);
    }

    public CustomException(String message, Object data) {
        super(message);
        this.code = HttpStatus.INTERNAL_SERVER_ERROR.value();
        this.data = data;
        log.error("{code:{},msg:{},data:{}}", code, message, data);
    }
}
  • 新增 config/BaseService.java
shell
public interface BaseService {

    TokenService TOKEN_SERVICE = SpringUtils.getBean(TokenService.class);

    /**
     * 获取用户缓存信息
     */
    default LoginUser getLoginUser() {
        return SecurityUtils.getLoginUser();
    }

    /**
     * 获取登录用户id
     */
    default Long getUserId() {
        return getLoginUser().getUserId();
    }


    default void checkEmpty(Object obj, String errMsg) {
        if (ObjUtil.isEmpty(obj)) {
            throw new CustomException(errMsg);
        }
    }

    default LoginUser setLoginMap(String key, String value) {
        LoginUser loginUser = getLoginUser();
        loginUser.getLoginMap().put(key, value);
        TOKEN_SERVICE.refreshToken(loginUser);
        return loginUser;
    }

    default void throwException(String message) {
        throw new CustomException(message);
    }

    /**
     * 忽略属性
     */
    default String[] ignoreProps(String... ignoreProps) {
        return ArrayUtil.append(ignoreProps, "createTime", "createBy", "delFlag");
    }
}

使用jpa

  • 添加jpa依赖
shell
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  • application.yml添加jpa配置
shell
# jpa配置
spring:
  jpa:
    show-sql: true
    open-in-view: true
    hibernate:
      ddl-auto: update
  • 新增 config/jpa/JpaBaseEntity.java
java
@Getter
@Setter
@MappedSuperclass
@EntityListeners(JpaAuditingListener.class)
public class JpaBaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonIgnore
    @Column(updatable = false)
    @Comment("创建人")
    private Long createBy;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(columnDefinition = "datetime COMMENT '创建时间'")
    private Date createTime;

    @JsonIgnore
    @Column(length = 1, columnDefinition = "char(1) default 0")
    @Comment("删除标识,0代表存在 2代表删除")
    private String delFlag;

    @JsonIgnore
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Column(columnDefinition = "datetime COMMENT '修改时间'")
    private Date updateTime;

    @JsonIgnore
    @Comment("修改人")
    private Long updateBy;
}
  • 新增 config/jpa/JpaDelBak.java
java
@Getter
@Setter
@Entity
@Table(name = "jpa_del_bak")
@Comment("jpa删除备份表")
@DynamicInsert
@DynamicUpdate
@NoArgsConstructor
public class JpaDelBak extends JpaBaseEntity {

    public JpaDelBak(String tName, String cName, String dataJson) {
        this.tName = tName;
        this.cName = cName;
        this.dataJson = dataJson;
    }

    @Column(length = 100)
    @Comment("表名")
    @JsonProperty("tName")
    private String tName;

    @Column
    @Comment("数据实体类名")
    @JsonProperty("cName")
    private String cName;

    @Column(length = 65535)
    @Comment("数据json")
    private String dataJson;
}
  • 新增 config/jpa/JpaBaseRepository.java
java
public interface JpaBaseRepository<T extends JpaBaseEntity> extends JpaRepository<T, Long> {
}
  • 新增 config/jpa/JpaDelBakRepository.java
java
public interface JpaDelBakRepository extends JpaBaseRepository<JpaDelBak> {
}
  • 新增 config/jpa/JpaAuditingListener.java
java
public class JpaAuditingListener {
    //查询时
    @PostLoad
    private void postLoad(JpaBaseEntity entity) {
    }

    //添加创建时间和创建人
    @PrePersist
    private void prePersist(JpaBaseEntity entity) {
        //创建时间为空,添加创建时间
        if (null == entity.getCreateTime()) {
            entity.setCreateTime(new Date());
        }
        if (null == entity.getCreateBy()) {
            entity.setCreateBy(getLoginId());
        }
    }

    //新增之后
    @PostPersist
    private void postPersist(JpaBaseEntity entity) {
    }

    //备份删除数据
    @PreRemove
    private void preRemove(JpaBaseEntity entity) {
        Class<?> clazz = entity.getClass();
        String clazzName = clazz.getName();
        String tableName = AnnotationUtil.getAnnotation(clazz, Table.class).name();
        JpaDelBakRepository repository = SpringUtil.getBean(JpaDelBakRepository.class);
        JpaDelBak delBak = new JpaDelBak(tableName, clazzName, JSONUtil.toJsonStr(entity));
        delBak.setCreateBy(getLoginId());
        ThreadUtil.execAsync(() -> repository.save(delBak));
    }

    //删除之后
    @PostRemove
    private void postRemove(JpaBaseEntity entity) {

    }

    //添加修改时间和修改人
    @PreUpdate
    private void preUpdate(JpaBaseEntity entity) {
        if (null == entity.getUpdateTime()) {
            entity.setUpdateTime(new Date());
        }
        if (null != entity.getUpdateBy()) {
            entity.setUpdateBy(getLoginId());
        }
    }

    //修改之后
    @PostUpdate
    private void postUpdate(Object obj) {
    }

    //获取登录ID
    private Long getLoginId() {
        try {
            return SecurityUtils.getUserId();
        } catch (Exception e) {
            return null;
        }
    }
}
  • 新增 config/jpa/JpaBaseService.java
java
public interface JpaBaseService<T extends JpaBaseEntity> extends BaseService {

    /**
     * 获取当前Jpa对象,需要实现类处理
     */
    JpaBaseRepository<T> getRepository();

    /**
     * 保存或更新
     */
    default T save(T entity) {
        return getRepository().save(entity);
    }


    default T saveAndFlush(T entity) {
        return getRepository().saveAndFlush(entity);
    }

    /**
     * 异步保存或更新
     */
    default void asyncSave(T entity) {
        ThreadUtil.execAsync(() -> save(entity));
    }

    /**
     * 根据ID获取,无数据抛异常
     */
    default T findById(Long id) {
        T entity = getRepository().findById(id).orElseThrow(() -> new CustomException("数据不存在"));
        if (!StrUtil.equals(entity.getDelFlag(), "0")) {
            throw new CustomException("数据已删除");
        }
        return entity;
    }

    default T get(Long id) {
        return getRepository().findById(id).orElse(null);
    }

    /**
     * 根据ID集合查询
     *
     * @param ids id集合
     */
    default List<T> findByIds(List<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return ListUtil.empty();
        }
        List<T> all = getRepository().findAllById(ids);
        return all.stream().filter(entity -> StrUtil.equals(entity.getDelFlag(), "0")).toList();
    }

    /**
     * 查询所有
     */
    default List<T> findAll() {
        return getRepository().findAll();
    }

    default List<T> findAll(Sort sort) {
        return getRepository().findAll(sort);
    }

    default Page<T> findAll(Pageable pageable) {
        return getRepository().findAll(pageable);
    }

    /**
     * 批量保存
     *
     * @param beans 批量保存列表
     */
    default void saveAll(List<T> beans) {
        if (CollUtil.isNotEmpty(beans)) {
            getRepository().saveAll(beans);
        }
    }

    /**
     * 保存所有并刷新
     *
     * @param beans 批量保存列表
     */
    default void saveAllAndFlush(List<T> beans) {
        if (CollUtil.isNotEmpty(beans)) {
            getRepository().saveAllAndFlush(beans);
        }
    }

    /**
     * 删除
     */
    default void del(Long id) {
        T entity = findById(id);
        if (StrUtil.equals(entity.getDelFlag(), "0")) {
            entity.setDelFlag("2");
            save(entity);
        }
    }
}

常用配置

  • mybatis-config.xml配置文件打开驼峰转换
  • 常用java类
shell
Constants				        //通用常量信息
SysLoginController			    //登录接口
SecurityConfig					//安全框架配置
TokenService					//token相关,前缀:Bearer 
JwtAuthenticationTokenFilter    //token过滤器 验证token有效性
SecurityUtils					//安全框架工具类
ApplicationConfig 			    //配置mapper扫描
  • 修改数据库字段
sql
# 修改用户表字段长度
ALTER TABLE sys_user MODIFY user_name VARCHAR(30) default null COMMENT '用户名';
ALTER TABLE sys_user MODIFY nick_name VARCHAR(30) default null COMMENT '昵称';

# 关闭登录验证码
update sys_config set config_value='false' WHERE config_key='sys.account.captchaEnabled';