Refactor user account management by replacing User entity with UserAccount, updating UserController and UserService for CRUD operations, and modifying MyBatis mappers accordingly.

This commit is contained in:
zyh
2025-08-24 17:42:47 +08:00
parent 4cfd19195f
commit f37159e1fc
36 changed files with 327 additions and 330 deletions

View File

@@ -1,48 +1,83 @@
package com.gameplatform.server.controller;
import com.gameplatform.server.model.User;
import com.gameplatform.server.service.UserService;
import com.gameplatform.server.model.dto.account.AccountCreateRequest;
import com.gameplatform.server.model.dto.account.AccountResponse;
import com.gameplatform.server.model.dto.account.AccountUpdateRequest;
import com.gameplatform.server.model.dto.common.PageResult;
import com.gameplatform.server.service.account.AccountService;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
* 用户接口控制器 - 基于UserAccount实体
* 提供用户账户的基本CRUD操作
*/
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public class UserController {
private final AccountService accountService;
public UserController(UserService userService) {
this.userService = userService;
public UserController(AccountService accountService) {
this.accountService = accountService;
}
/**
* 根据ID获取用户账户信息
*/
@GetMapping("/{id}")
public Mono<User> getById(@PathVariable Long id) {
return userService.getById(id);
public Mono<AccountResponse> getById(@PathVariable Long id) {
return accountService.get(id);
}
/**
* 分页查询用户列表
*/
@GetMapping
public Flux<User> listAll() {
return userService.listAll();
public Mono<PageResult<AccountResponse>> list(
@RequestParam(value = "userType", required = false) String userType,
@RequestParam(value = "status", required = false) String status,
@RequestParam(value = "role", required = false) String role,
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "size", defaultValue = "20") Integer size
) {
return accountService.list(userType, status, role, keyword, page, size);
}
/**
* 创建新用户账户
*/
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Mono<User> create(@Valid @RequestBody User user) {
return userService.create(user);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public Mono<Void> delete(@PathVariable Long id) {
return userService.deleteById(id)
.filter(Boolean::booleanValue)
.then();
public Mono<AccountResponse> create(@Valid @RequestBody AccountCreateRequest request) {
return accountService.create(request);
}
/**
* 更新用户账户信息
*/
@PutMapping("/{id}")
public Mono<User> update(@PathVariable Long id, @Valid @RequestBody User user) {
return userService.update(id, user);
public Mono<AccountResponse> update(@PathVariable Long id, @Valid @RequestBody AccountUpdateRequest request) {
return accountService.update(id, request);
}
}
/**
* 启用用户账户
*/
@PostMapping("/{id}/enable")
@ResponseStatus(HttpStatus.NO_CONTENT)
public Mono<Void> enable(@PathVariable Long id) {
return accountService.setStatus(id, "ENABLED").then();
}
/**
* 禁用用户账户
*/
@PostMapping("/{id}/disable")
@ResponseStatus(HttpStatus.NO_CONTENT)
public Mono<Void> disable(@PathVariable Long id) {
return accountService.setStatus(id, "DISABLED").then();
}
}

View File

@@ -1,18 +0,0 @@
package com.gameplatform.server.mapper;
import com.gameplatform.server.model.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
User findById(@Param("id") Long id);
List<User> findAll();
int insert(User user);
int deleteById(@Param("id") Long id);
int update(User user);
}

View File

@@ -1,51 +0,0 @@
package com.gameplatform.server.model;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import java.time.LocalDateTime;
public class User {
private Long id;
@NotBlank
private String username;
@Email
private String email;
private LocalDateTime createdAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
}

View File

@@ -2,7 +2,7 @@ package com.gameplatform.server.security;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -3,7 +3,7 @@ package com.gameplatform.server.security;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

View File

@@ -1,54 +1,92 @@
package com.gameplatform.server.service;
import com.gameplatform.server.mapper.UserMapper;
import com.gameplatform.server.model.User;
import com.gameplatform.server.mapper.account.UserAccountMapper;
import com.gameplatform.server.model.dto.account.AccountResponse;
import com.gameplatform.server.model.dto.common.PageResult;
import com.gameplatform.server.model.entity.account.UserAccount;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.util.Objects;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户服务类 - 基于UserAccount实体
* 提供用户账户相关的业务逻辑
*/
@Service
public class UserService {
private final UserMapper userMapper;
private final UserAccountMapper userAccountMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
public UserService(UserAccountMapper userAccountMapper) {
this.userAccountMapper = userAccountMapper;
}
public Mono<User> getById(Long id) {
return Mono.fromCallable(() -> userMapper.findById(id))
/**
* 根据ID获取用户账户
*/
public Mono<AccountResponse> getById(Long id) {
return Mono.fromCallable(() -> userAccountMapper.findById(id))
.subscribeOn(Schedulers.boundedElastic())
.filter(Objects::nonNull)
.map(this::toAccountResponse);
}
/**
* 根据用户名获取用户账户
*/
public Mono<UserAccount> getByUsername(String username) {
return Mono.fromCallable(() -> userAccountMapper.findByUsername(username))
.subscribeOn(Schedulers.boundedElastic())
.filter(Objects::nonNull);
}
public Flux<User> listAll() {
return Mono.fromCallable(userMapper::findAll)
.subscribeOn(Schedulers.boundedElastic())
.flatMapMany(Flux::fromIterable);
}
public Mono<User> create(User user) {
/**
* 分页查询用户列表
*/
public Mono<PageResult<AccountResponse>> list(String userType, String status, String role, String keyword,
Integer page, Integer size) {
int p = (page == null || page < 1) ? 1 : page;
int s = (size == null || size < 1 || size > 200) ? 20 : size;
int offset = (p - 1) * s;
return Mono.fromCallable(() -> {
userMapper.insert(user);
return user;
long total = userAccountMapper.countByFilter(userType, status, role, keyword);
List<UserAccount> list = userAccountMapper.listByFilter(userType, status, role, keyword, s, offset);
List<AccountResponse> items = list.stream()
.map(this::toAccountResponse)
.collect(Collectors.toList());
return new PageResult<>(items, total, p, s);
})
.subscribeOn(Schedulers.boundedElastic());
}
public Mono<Boolean> deleteById(Long id) {
return Mono.fromCallable(() -> userMapper.deleteById(id) > 0)
/**
* 检查用户名是否存在
*/
public Mono<Boolean> existsByUsername(String username) {
return Mono.fromCallable(() -> userAccountMapper.findByUsername(username) != null)
.subscribeOn(Schedulers.boundedElastic());
}
public Mono<User> update(Long id, User user) {
return Mono.fromCallable(() -> {
user.setId(id);
int n = userMapper.update(user);
return n;
})
.subscribeOn(Schedulers.boundedElastic())
.flatMap(n -> n > 0 ? getById(id) : Mono.empty());
/**
* 将UserAccount实体转换为AccountResponse DTO
*/
private AccountResponse toAccountResponse(UserAccount account) {
if (account == null) return null;
AccountResponse response = new AccountResponse();
response.setId(account.getId());
response.setUserType(account.getUserType());
response.setUsername(account.getUsername());
response.setDisplayName(account.getDisplayName());
response.setRole(account.getRole());
response.setStatus(account.getStatus());
response.setPointsBalance(account.getPointsBalance());
response.setCreatedAt(account.getCreatedAt());
response.setUpdatedAt(account.getUpdatedAt());
return response;
}
}

View File

@@ -1,46 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gameplatform.server.mapper.UserMapper">
<resultMap id="UserResultMap" type="com.gameplatform.server.model.User">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="email" column="email" />
<result property="createdAt" column="created_at" />
</resultMap>
<sql id="Base_Column_List">
id, username, email, created_at
</sql>
<select id="findById" parameterType="long" resultMap="UserResultMap">
SELECT <include refid="Base_Column_List"/>
FROM users
WHERE id = #{id}
</select>
<select id="findAll" resultMap="UserResultMap">
SELECT <include refid="Base_Column_List"/>
FROM users
ORDER BY id DESC
</select>
<insert id="insert" parameterType="com.gameplatform.server.model.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username, email, created_at)
VALUES (#{username}, #{email}, NOW())
</insert>
<delete id="deleteById" parameterType="long">
DELETE FROM users WHERE id = #{id}
</delete>
<update id="update" parameterType="com.gameplatform.server.model.User">
UPDATE users
SET username = #{username},
email = #{email}
WHERE id = #{id}
</update>
</mapper>