升级微服务项目

This commit is contained in:
2026-03-02 16:07:08 +08:00
parent 9f5d9f73a0
commit 2df6ee04bc
13 changed files with 474 additions and 73 deletions

35
user-service/pom.xml Normal file
View File

@@ -0,0 +1,35 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.mayiming</groupId>
<artifactId>javamemories-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>user-service</artifactId>
<packaging>jar</packaging>
<name>user-service</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 核心Spring Boot Web 依赖(版本由父工程继承) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试依赖:适配 Spring Boot 3 的 JUnit 5替换老旧的 JUnit 3.8.1 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,17 @@
package cn.mayiming;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello world!
*
*/
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}

View File

@@ -0,0 +1,26 @@
package cn.mayiming.Controller.Redis;
public class RedisParam {
private String key;
private String value;
// 必须加无参构造器JSON解析需要
public RedisParam() {}
// GET/SET方法必须加否则JSON解析不到值
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@@ -0,0 +1,22 @@
package cn.mayiming.Controller.Redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
public class Redistest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@PostMapping("/redis/put")
public String put(@RequestBody RedisParam param) {
String key = param.getKey();
stringRedisTemplate.opsForValue().set(key, "123", 10, TimeUnit.MINUTES);
String redisValue = stringRedisTemplate.opsForValue().get(key);
return "Redis写入成功key=" + key + "value=" + redisValue;
}
}

View File

@@ -0,0 +1,22 @@
package cn.mayiming.Controller.UserCon;
public class UserBody {
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String username;
public String password;
}

View File

@@ -0,0 +1,46 @@
package cn.mayiming.Controller.UserCon;
import cn.mayiming.Mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@PostMapping("/login")
public Map<String, Object> login(@RequestBody UserBody user) {
Map<String, Object> result = new HashMap<>();
try {
String dbPassword = userMapper.getPasswordByUsername(user.getUsername());
String username = user.getUsername();
String password = user.getPassword();
// 3. 编写 SQL 查询数据库中的用户密码
// 用 ? 占位符,防止 SQL 注入(必须!)
// 4. 验证密码(实际项目要加密对比,这里简单演示)
if (password != null && password.equals(dbPassword)) {
result.put("code", 200);
result.put("msg", "登录成功");
result.put("data", username);
} else {
result.put("code", 400);
result.put("msg", "密码错误");
}
} catch (Exception e) {
// 捕获“用户不存在”等异常
result.put("code", 404);
result.put("msg", "用户名不存在或登录失败");
result.put("error", e.getMessage());
}
return result;
}
}

View File

@@ -0,0 +1,81 @@
package cn.mayiming.Mapper;
import cn.mayiming.Controller.UserCon.UserBody;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserMapper {
@Select("SELECT password FROM user WHERE username = #{username}")
String getPasswordByUsername(String username);
/**
* 根据ID查询用户单条查询
* @param id 用户ID
* @return 完整用户信息
*/
@Select("SELECT id, username, password, nickname, create_time AS createTime FROM user WHERE id = #{id}")
UserBody getUserById(Long id);
/**
* 根据用户名查询完整用户信息(登录/校验用)
* @param username 用户名
* @return 完整用户信息
*/
@Select("SELECT id, username, password, nickname, create_time AS createTime FROM user WHERE username = #{username}")
UserBody getUserByUsername(String username);
/**
* 查询所有用户(分页建议用 MyBatis-Plus这里先实现全量
* @return 用户列表
*/
@Select("SELECT id, username, password, nickname, create_time AS createTime FROM user")
List<UserBody> listAllUsers();
// ==================== 增 ====================
/**
* 新增用户自增ID
* @param user 用户实体
* @return 影响行数1=成功0=失败)
*/
@Insert("INSERT INTO user (username, password, nickname, create_time) VALUES (#{username}, #{password}, #{nickname}, #{createTime})")
@Options(useGeneratedKeys = true, keyProperty = "id") // 自动返回自增的ID到user对象的id字段
int insertUser(UserBody user);
// ==================== 改 ====================
/**
* 根据ID修改用户昵称
* @param id 用户ID
* @param nickname 新昵称
* @return 影响行数
*/
@Update("UPDATE user SET nickname = #{nickname} WHERE id = #{id}")
int updateNicknameById(@Param("id") Long id, @Param("nickname") String nickname);
/**
* 根据用户名修改密码
* @param username 用户名
* @param newPassword 新密码
* @return 影响行数
*/
@Update("UPDATE user SET password = #{newPassword} WHERE username = #{username}")
int updatePasswordByUsername(@Param("username") String username, @Param("newPassword") String password);
// ==================== 删 ====================
/**
* 根据ID删除用户
* @param id 用户ID
* @return 影响行数
*/
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteUserById(Long id);
/**
* 根据用户名删除用户
* @param username 用户名
* @return 影响行数
*/
@Delete("DELETE FROM user WHERE username = #{username}")
int deleteUserByUsername(String username);
}

View File

@@ -0,0 +1,24 @@
server:
port: 9091
spring:
data:
redis:
port: 6379
password: ""
database: 0
timeout: 10000
datasource:
# 连接 URL关键test_db 是你要连接的数据库名,需提前创建)
url: jdbc:mysql://rm-f8z6oc5a03331500p8o.mysql.rds.aliyuncs.com:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
# 数据库用户名
username: root
# 数据库密码(替换为你的 MySQL 密码)
password: Root123456
# 驱动类名MySQL 8.x 用这个5.x 改为 com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
# 连接池配置(可选,提升性能)
hikari:
maximum-pool-size: 10 # 最大连接数
minimum-idle: 2 # 最小空闲连接数
idle-timeout: 60000 # 空闲连接超时时间(毫秒)
connection-timeout: 30000 # 连接超时时间(毫秒)

View File

@@ -0,0 +1,38 @@
package cn.mayiming;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}