diff --git a/docker/sql/db.sql b/docker/sql/db.sql
index be8d559..948ade6 100644
--- a/docker/sql/db.sql
+++ b/docker/sql/db.sql
@@ -1,8 +1,8 @@
-- 确保启用 uuid-ossp 扩展(用于生成 UUID)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
--- 创建 users 表
-CREATE TABLE users
+-- 创建 account 表
+CREATE TABLE account
(
id CHAR(36) PRIMARY KEY DEFAULT uuid_generate_v4()::varchar,
username VARCHAR(255) NOT NULL UNIQUE,
@@ -22,9 +22,9 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
--- 创建触发器:在 users 表 UPDATE 时自动调用
-CREATE TRIGGER trigger_update_users_updated_at
+-- 创建触发器:在 account 表 UPDATE 时自动调用
+CREATE TRIGGER trigger_update_account_updated_at
BEFORE UPDATE
- ON users
+ ON account
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 4ef3f5f..663188a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,11 @@
org.springframework.boot
spring-boot-starter-web
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.8.14
+
@@ -41,6 +46,13 @@
sa-token-spring-boot3-starter
1.44.0
+
+
+ cn.dev33
+ sa-token-jwt
+ 1.44.0
+
+
diff --git a/src/main/java/com/xapg/energystoragesafety/EnergyStorageSafetyApplication.java b/src/main/java/com/xapg/energystoragesafety/EnergyStorageSafetyApplication.java
index ae26975..5f47598 100644
--- a/src/main/java/com/xapg/energystoragesafety/EnergyStorageSafetyApplication.java
+++ b/src/main/java/com/xapg/energystoragesafety/EnergyStorageSafetyApplication.java
@@ -1,7 +1,5 @@
package com.xapg.energystoragesafety;
-import com.mybatisflex.core.keygen.KeyGeneratorFactory;
-import com.xapg.energystoragesafety.config.UUIDKeyGenerator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -9,11 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.xapg.energystoragesafety.mapper")
public class EnergyStorageSafetyApplication {
- static {
- KeyGeneratorFactory.register("myUUID", new UUIDKeyGenerator());
- }
-
- public static void main(String[] args) {
+ public static void main(String[] args) {
SpringApplication.run(EnergyStorageSafetyApplication.class, args);
}
}
diff --git a/src/main/java/com/xapg/energystoragesafety/config/BusinessException.java b/src/main/java/com/xapg/energystoragesafety/config/BusinessException.java
new file mode 100644
index 0000000..e330a93
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/config/BusinessException.java
@@ -0,0 +1,18 @@
+package com.xapg.energystoragesafety.config;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 自定义业务异常
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BusinessException extends RuntimeException {
+ private int code;
+
+ public BusinessException(int code, String message) {
+ super(message);
+ this.code = code;
+ }
+}
diff --git a/src/main/java/com/xapg/energystoragesafety/config/GlobalExceptionHandler.java b/src/main/java/com/xapg/energystoragesafety/config/GlobalExceptionHandler.java
new file mode 100644
index 0000000..4069249
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/config/GlobalExceptionHandler.java
@@ -0,0 +1,40 @@
+package com.xapg.energystoragesafety.config;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import com.xapg.energystoragesafety.dto.CommonResult;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理类
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+ // 捕获自定义业务异常
+ @ExceptionHandler(BusinessException.class)
+ public CommonResult> handleBusinessException(BusinessException e) {
+ return CommonResult.error(e.getCode(), e.getMessage());
+ }
+
+ // 捕获 SaCheckLogin 登录鉴权
+ @ExceptionHandler(NotLoginException.class)
+ public CommonResult> handleNotLoginException(NotLoginException e) {
+ return CommonResult.error(401, "用户未登录");
+ }
+
+ // 捕获空指针等运行时异常
+ @ExceptionHandler(NullPointerException.class)
+ public CommonResult> handleNullPointerException(NullPointerException e) {
+ // 实际项目中应记录日志
+ return CommonResult.error(500, "服务器内部错误(NPE)");
+ }
+
+ // 捕获所有未处理的异常(兜底)
+ @ExceptionHandler(Exception.class)
+ public CommonResult> handleGenericException(Exception e) {
+ // TODO: 记录日志(使用 Slf4j)
+ e.printStackTrace(); // 仅示例,生产环境用 logger
+ return CommonResult.error(500, "服务器内部错误,请联系管理员");
+ }
+}
+
diff --git a/src/main/java/com/xapg/energystoragesafety/config/SaTokenConfigure.java b/src/main/java/com/xapg/energystoragesafety/config/SaTokenConfigure.java
new file mode 100644
index 0000000..da25a7b
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/config/SaTokenConfigure.java
@@ -0,0 +1,25 @@
+package com.xapg.energystoragesafety.config;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.jwt.StpLogicJwtForStateless;
+import cn.dev33.satoken.stp.StpLogic;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+ // Sa-Token 整合 jwt (Stateless 无状态模式)
+ @Bean
+ public StpLogic getStpLogicJwt() {
+ return new StpLogicJwtForStateless();
+ }
+
+ // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+ registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/xapg/energystoragesafety/config/UUIDKeyGenerator.java b/src/main/java/com/xapg/energystoragesafety/config/UUIDKeyGenerator.java
deleted file mode 100644
index d003d7b..0000000
--- a/src/main/java/com/xapg/energystoragesafety/config/UUIDKeyGenerator.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.xapg.energystoragesafety.config;
-
-import com.mybatisflex.core.keygen.IKeyGenerator;
-
-import java.util.UUID;
-
-public class UUIDKeyGenerator implements IKeyGenerator {
- @Override
- public Object generate(Object entity, String keyColumn) {
- String id = UUID.randomUUID().toString();
- System.out.println("asedasd: " + id);
- return id;
- }
-}
diff --git a/src/main/java/com/xapg/energystoragesafety/controller/AccountController.java b/src/main/java/com/xapg/energystoragesafety/controller/AccountController.java
new file mode 100644
index 0000000..305b78c
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/controller/AccountController.java
@@ -0,0 +1,50 @@
+package com.xapg.energystoragesafety.controller;
+
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.dev33.satoken.util.SaResult;
+import com.xapg.energystoragesafety.dto.CommonResult;
+import com.xapg.energystoragesafety.dto.account.request.LoginRequest;
+import com.xapg.energystoragesafety.entity.Account;
+import com.xapg.energystoragesafety.services.AccountService;
+import cn.dev33.satoken.stp.StpUtil;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/account")
+@Tag(name = "用户管理", description = "用户相关操作")
+public class AccountController {
+ private final AccountService accountService;
+
+ public AccountController(AccountService accountService) {
+ this.accountService = accountService;
+ }
+
+ @Operation(summary = "用户登录", description = "用户登录,返回JWT")
+ @PostMapping("/login")
+ public CommonResult login(@RequestBody LoginRequest loginRequest) {
+ // 登录失败,由拦截器拦截
+ accountService.login(loginRequest.getUsername(), loginRequest.getPassword());
+ return CommonResult.success(StpUtil.getTokenValue());
+ }
+
+ @PostMapping("/register")
+ public int register(@RequestBody Account account) {
+ return accountService.insertUser(account);
+ }
+
+ @PostMapping("/update")
+ public int update(@RequestBody Account account) {
+ return accountService.updateByUserName(account);
+ }
+
+ @SaCheckLogin
+ @PostMapping("/logout")
+ public void logout() {
+ StpUtil.logout();
+ }
+}
diff --git a/src/main/java/com/xapg/energystoragesafety/dto/CommonResult.java b/src/main/java/com/xapg/energystoragesafety/dto/CommonResult.java
new file mode 100644
index 0000000..8fff387
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/dto/CommonResult.java
@@ -0,0 +1,30 @@
+package com.xapg.energystoragesafety.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CommonResult {
+ private Integer code;
+ private String message;
+ private T data;
+ private Long timestamp; // 单位:毫秒
+
+ public CommonResult(Integer code, String message, T data) {
+ this.code = code;
+ this.message = message;
+ this.data = data;
+ this.timestamp = System.currentTimeMillis(); // 自动设置当前时间戳
+ }
+
+ // 成功响应
+ public static CommonResult success(T data) {
+ return new CommonResult<>(200, "success", data);
+ }
+
+ // 失败响应
+ public static CommonResult error(int code, String message) {
+ return new CommonResult<>(code, message, null);
+ }
+}
diff --git a/src/main/java/com/xapg/energystoragesafety/dto/account/request/LoginRequest.java b/src/main/java/com/xapg/energystoragesafety/dto/account/request/LoginRequest.java
new file mode 100644
index 0000000..0413e98
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/dto/account/request/LoginRequest.java
@@ -0,0 +1,9 @@
+package com.xapg.energystoragesafety.dto.account.request;
+
+import lombok.Data;
+
+@Data
+public class LoginRequest {
+ private String username;
+ private String password;
+}
diff --git a/src/main/java/com/xapg/energystoragesafety/entity/Account.java b/src/main/java/com/xapg/energystoragesafety/entity/Account.java
index 75872b4..7f8e2f9 100644
--- a/src/main/java/com/xapg/energystoragesafety/entity/Account.java
+++ b/src/main/java/com/xapg/energystoragesafety/entity/Account.java
@@ -1,18 +1,23 @@
package com.xapg.energystoragesafety.entity;
-import com.mybatisflex.annotation.Id;
-import com.mybatisflex.annotation.KeyType;
-import com.mybatisflex.annotation.Table;
+import com.mybatisflex.annotation.*;
+import com.mybatisflex.core.keygen.KeyGenerators;
+import com.mybatisflex.core.mask.Masks;
import lombok.Data;
-import java.sql.Date;
+import java.sql.Timestamp;
@Data
@Table("account")
public class Account {
- @Id(keyType = KeyType.Auto)
- private Long id;
- private String userName;
- private Integer age;
- private Date birthday;
+ @Id(keyType = KeyType.Generator, value = KeyGenerators.uuid)
+ private String id;
+ private String username;
+ @ColumnMask(Masks.PASSWORD)
+ private String password;
+ private String nickname;
+ @Column(onInsertValue = "CURRENT_TIMESTAMP")
+ private Timestamp createdAt;
+ @Column(onInsertValue = "CURRENT_TIMESTAMP", onUpdateValue = "CURRENT_TIMESTAMP")
+ private Timestamp updatedAt;
}
diff --git a/src/main/java/com/xapg/energystoragesafety/entity/Users.java b/src/main/java/com/xapg/energystoragesafety/entity/Users.java
deleted file mode 100644
index 0849c09..0000000
--- a/src/main/java/com/xapg/energystoragesafety/entity/Users.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.xapg.energystoragesafety.entity;
-
-import com.mybatisflex.annotation.*;
-import com.mybatisflex.core.mask.Masks;
-import lombok.Data;
-
-import java.sql.Timestamp;
-
-@Data
-@Table("users")
-public class Users {
- @Id(keyType = KeyType.Generator, value = "myUUID")
- private String id;
- private String username;
- @ColumnMask(Masks.PASSWORD)
- private String password;
- private String nickname;
- @Column(onInsertValue = "CURRENT_TIMESTAMP")
- private Timestamp createdAt;
- @Column(onInsertValue = "CURRENT_TIMESTAMP", onUpdateValue = "CURRENT_TIMESTAMP")
- private Timestamp updatedAt;
-}
diff --git a/src/main/java/com/xapg/energystoragesafety/mapper/UsersMapper.java b/src/main/java/com/xapg/energystoragesafety/mapper/UsersMapper.java
deleted file mode 100644
index d483344..0000000
--- a/src/main/java/com/xapg/energystoragesafety/mapper/UsersMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.xapg.energystoragesafety.mapper;
-
-import com.mybatisflex.core.BaseMapper;
-import com.xapg.energystoragesafety.entity.Users;
-
-public interface UsersMapper extends BaseMapper {
-}
diff --git a/src/main/java/com/xapg/energystoragesafety/services/AccountService.java b/src/main/java/com/xapg/energystoragesafety/services/AccountService.java
new file mode 100644
index 0000000..f624319
--- /dev/null
+++ b/src/main/java/com/xapg/energystoragesafety/services/AccountService.java
@@ -0,0 +1,81 @@
+package com.xapg.energystoragesafety.services;
+
+import cn.dev33.satoken.secure.BCrypt;
+import cn.dev33.satoken.stp.StpUtil;
+import com.mybatisflex.core.mask.MaskManager;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.xapg.energystoragesafety.config.BusinessException;
+import com.xapg.energystoragesafety.entity.Account;
+import com.xapg.energystoragesafety.mapper.AccountMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import static com.xapg.energystoragesafety.entity.table.AccountTableDef.ACCOUNT;
+
+@Service
+public class AccountService {
+ private final AccountMapper accountMapper;
+
+ public AccountService(AccountMapper accountMapper) {
+ this.accountMapper = accountMapper;
+ }
+
+ // 根据用户名查询用户
+ public Account selectByUsername(String username) {
+ if (username == null || username.trim().isEmpty()) {
+ return null;
+ }
+ QueryWrapper query = QueryWrapper.create()
+ .select()
+ .from(ACCOUNT)
+ .where(ACCOUNT.USERNAME.eq(username));
+ return accountMapper.selectOneByQuery(query);
+ }
+
+ // 新增用户
+ public int insertUser(Account account) {
+ if (account == null || account.getUsername() == null || account.getUsername().trim().isEmpty()) {
+ throw new IllegalArgumentException("用户名不能为空");
+ }
+ Account exist = this.selectByUsername(account.getUsername());
+ if (exist != null) {
+ throw new RuntimeException("用户名已存在");
+ }
+ // 默认密码加密
+ account.setPassword(BCrypt.hashpw(account.getPassword(), BCrypt.gensalt()));
+ return accountMapper.insert(account);
+ }
+
+ // 更新用户信息(不允许修改用户名,密码)
+ public int updateByUserName(Account account) {
+ if (account == null || account.getUsername() == null || account.getUsername().trim().isEmpty()) {
+ throw new IllegalArgumentException("用户名不能为空");
+ }
+ Account old = this.selectByUsername(account.getUsername());
+ if (old == null) {
+ throw new RuntimeException("用户不存在");
+ }
+ // 保持原用户名
+ account.setUsername(null);
+ account.setPassword(null);
+ return accountMapper.update(account);
+ }
+
+ // 用户登录校验
+ public void login(String username, String password) {
+ // 密码校验,取消脱敏处理
+ MaskManager.execWithoutMask(() -> {
+ Account account = this.selectByUsername(username);
+ // 找不到用户,用户名错误
+ if (account == null) {
+ throw new BusinessException(401, "用户名或密码错误");
+ }
+ // 密码错误
+ if (!BCrypt.checkpw(password, account.getPassword())) {
+ throw new BusinessException(401, "用户名或密码错误");
+ }
+ StpUtil.login(username);
+ });
+ }
+}
diff --git a/src/main/java/com/xapg/energystoragesafety/services/UsersService.java b/src/main/java/com/xapg/energystoragesafety/services/UsersService.java
deleted file mode 100644
index d444759..0000000
--- a/src/main/java/com/xapg/energystoragesafety/services/UsersService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.xapg.energystoragesafety.services;
-
-import cn.dev33.satoken.secure.BCrypt;
-import com.mybatisflex.core.mask.MaskManager;
-import com.mybatisflex.core.query.QueryWrapper;
-import com.xapg.energystoragesafety.entity.Users;
-import com.xapg.energystoragesafety.mapper.UsersMapper;
-import org.springframework.stereotype.Service;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import static com.xapg.energystoragesafety.entity.table.UsersTableDef.USERS;
-
-@Service
-public class UsersService {
- private final UsersMapper usersMapper;
-
- public UsersService(UsersMapper usersMapper) {
- this.usersMapper = usersMapper;
- }
-
- // 根据用户名查询用户
- public Users selectByUsername(String username) {
- if (username == null || username.trim().isEmpty()) {
- return null;
- }
- QueryWrapper query = QueryWrapper.create()
- .select()
- .from(USERS)
- .where(USERS.USERNAME.eq(username));
- return usersMapper.selectOneByQuery(query);
- }
-
- // 新增用户
- public int insertUser(Users user) {
- if (user == null || user.getUsername() == null || user.getUsername().trim().isEmpty()) {
- throw new IllegalArgumentException("用户名不能为空");
- }
- Users exist = this.selectByUsername(user.getUsername());
- if (exist != null) {
- throw new RuntimeException("用户名已存在");
- }
- // 默认密码加密
- user.setPassword(BCrypt.hashpw(user.getPassword(), BCrypt.gensalt()));
- return usersMapper.insert(user);
- }
-
- // 更新用户信息(不允许修改用户名,密码)
- public int updateByUserName(Users user) {
- if (user == null || user.getUsername() == null || user.getUsername().trim().isEmpty()) {
- throw new IllegalArgumentException("用户名不能为空");
- }
- Users old = this.selectByUsername(user.getUsername());
- if (old == null) {
- throw new RuntimeException("用户不存在");
- }
- // 保持原用户名
- user.setUsername(null);
- user.setPassword(null);
- return usersMapper.update(user);
- }
-
- // 用户登录校验
- public Boolean login(String username, String password) {
- AtomicReference isLogin = new AtomicReference<>(Boolean.FALSE);
- // 密码校验,取消脱敏处理
- MaskManager.execWithoutMask(() -> {
- Users user = this.selectByUsername(username);
- // 找不到用户,用户名错误
- if (user == null) {
- throw new RuntimeException("用户名或密码错误");
- }
- // 密码错误
- if (!BCrypt.checkpw(password, user.getPassword())) {
- throw new RuntimeException("用户名或密码错误");
- }
- isLogin.set(Boolean.TRUE);
- });
- return isLogin.get();
- }
-}
diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml
index efc5fde..86f16bc 100644
--- a/src/main/resources/application.yaml
+++ b/src/main/resources/application.yaml
@@ -2,18 +2,26 @@ spring:
application:
name: energy-storage-safety
+springdoc:
+ swagger-ui:
+ path: /docs
+
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
+ # jwt秘钥
+ jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
+ # 指定 token 提交时的前缀
+ token-prefix: Bearer
# token 名称(同时也是 cookie 名称)
- token-name: energy-storage-safety
+ token-name: Authorization
+ # 校验 Header 内容,必须设置为true
+ is-read-header: true
# token 有效期(单位:秒) 默认30天,-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
- # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
- is-share: false
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: uuid
# 是否输出操作日志
diff --git a/src/test/java/com/xapg/energystoragesafety/UsersTest.java b/src/test/java/com/xapg/energystoragesafety/UsersTest.java
deleted file mode 100644
index e213591..0000000
--- a/src/test/java/com/xapg/energystoragesafety/UsersTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.xapg.energystoragesafety;
-
-import com.mybatisflex.core.query.QueryWrapper;
-import com.xapg.energystoragesafety.entity.Users;
-import com.xapg.energystoragesafety.mapper.UsersMapper;
-import com.xapg.energystoragesafety.services.UsersService;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import static com.xapg.energystoragesafety.entity.table.UsersTableDef.USERS;
-
-@SpringBootTest
-public class UsersTest {
- @Autowired
- private UsersMapper usersMapper;
-
- @Autowired
- private UsersService usersService;
-
- @Test
- public void insertTest() {
- QueryWrapper query = QueryWrapper.create().where("username = 'focus1'").from(USERS);
- usersMapper.deleteByQuery(query);
-
- Users users = new Users();
- users.setUsername("focus1");
- users.setPassword("plain_password");
- users.setNickname("focus1");
- usersService.insertUser(users);
- }
-
- @Test
- public void selectTest() {
- // 根据用户名搜索
- System.out.println(usersService.selectByUsername("focus1"));
- }
-
- @Test
- public void updateUser() {
- Users users = usersService.selectByUsername("focus1");
- users.setNickname("北溪入江流123");
- usersService.updateByUserName(users);
- }
-
- @Test
- public void loginTest() {
- System.out.println(usersService.login("focus1", "plain_password"));
- }
-}
diff --git a/src/test/java/com/xapg/energystoragesafety/sql_test/AccountTest.java b/src/test/java/com/xapg/energystoragesafety/sql_test/AccountTest.java
new file mode 100644
index 0000000..87826d8
--- /dev/null
+++ b/src/test/java/com/xapg/energystoragesafety/sql_test/AccountTest.java
@@ -0,0 +1,50 @@
+package com.xapg.energystoragesafety.sql_test;
+
+import com.mybatisflex.core.query.QueryWrapper;
+import com.xapg.energystoragesafety.entity.Account;
+import com.xapg.energystoragesafety.mapper.AccountMapper;
+import com.xapg.energystoragesafety.services.AccountService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static com.xapg.energystoragesafety.entity.table.AccountTableDef.ACCOUNT;
+
+@SpringBootTest
+public class AccountTest {
+ @Autowired
+ private AccountMapper accountMapper;
+
+ @Autowired
+ private AccountService accountService;
+
+ @Test
+ public void insertTest() {
+ QueryWrapper query = QueryWrapper.create().where("username = 'focus1'").from(ACCOUNT);
+ accountMapper.deleteByQuery(query);
+
+ Account account = new Account();
+ account.setUsername("focus1");
+ account.setPassword("plain_password");
+ account.setNickname("focus1");
+ accountService.insertUser(account);
+ }
+
+ @Test
+ public void selectTest() {
+ // 根据用户名搜索
+ System.out.println(accountService.selectByUsername("focus1"));
+ }
+
+ @Test
+ public void updateUser() {
+ Account account = accountService.selectByUsername("focus1");
+ account.setNickname("北溪入江流123");
+ accountService.updateByUserName(account);
+ }
+
+ @Test
+ public void loginTest() {
+
+ }
+}