Appearance
修改包名
- 下载springboot3版本:https://gitee.com/y_project/RuoYi-Vue/tree/springboot3
- 替换包名文档:https://doc.ruoyi.vip/ruoyi/other/faq.html
- 先运行sql文件,删除不必要的模块和文件,不要运行项目,
更换模块名称
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';