吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 662|回复: 17
收起左侧

[Java 原创] Java搭建聊天论坛1.0

  [复制链接]
helloLem0n 发表于 2025-3-15 10:42
  闲来无事,决定搭建一个简单的聊天论坛。
  需要的技术栈:spring boot,redis,mysql
  这篇1.0展示的是登录流程,更多功能会在后续开发,欢迎大家一起来讨论Java知识。
  
MySQL脚本
  
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
show databases ;
#创建数据库
create database chat;
use chat;
 
#创建用户表
create table user(
    id int primary key auto_increment comment '唯一id',
    name char(5) comment '用户id',
    passwd varchar(10) comment '密码',
    code int comment '状态 1-正常 2-锁定'
);
 
#新增用户
insert into user (name, passwd, code) VALUES
                ('xiaoz','123456789',1),
                ('xiaox','123456789',2);


依赖项
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.4</version>
        </dependency>
 
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.22</version>
        </dependency>


application.yml配置
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
spring:
  data:
    redis:
      database: 0
      password: "123456"
      host: "127.0.0.1"
      port: 6379
  datasource:
    username: "root"
    password: "123456789"
    driver-class-name: com.mysql.cj.jdbc.Driver


control接口
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.xiaoz.Control;
 
import com.xiaoz.Dto.DtoUser;
import com.xiaoz.Dto.MyResponse;
 
public interface JkUserManger {
    /**
     * 注册新用户
     * [url=home.php?mod=space&uid=952169]@Param[/url] dtoUser 包含用户注册信息的对象
     * [url=home.php?mod=space&uid=155549]@Return[/url] 返回操作结果的响应对象
     */
    MyResponse enroll(DtoUser dtoUser);
 
    /**
     * 用户登录
     * @param dtoUser 包含用户登录信息的对象
     * @return 返回包含token或错误信息的响应对象
     */
    MyResponse login(DtoUser dtoUser);
 
    /**
     * 修改用户密码
     * @param dtoUser 包含用户信息和新密码的对象
     * @return 返回操作结果的响应对象
     */
    MyResponse revisePasswd(DtoUser dtoUser);
 
    /**
     * 查询用户信息
     * @param dtoUser 用于查询条件的用户信息对象
     * @return 返回包含查询结果或错误信息的响应对象
     */
    MyResponse queryUser(DtoUser dtoUser);
 
    /**
     * 封禁或解封用户
     * @param dtoUser 包含用户信息和操作类型(封禁/解封)的对象
     * @return 返回操作结果的响应对象
     */
    MyResponse isBanned(DtoUser dtoUser);
}


control实现
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.xiaoz.Control.impl;
 
import com.xiaoz.Control.JkUserManger;
import com.xiaoz.Dto.DtoUser;
import com.xiaoz.Dto.MyResponse;
import com.xiaoz.Serve.ServerUser;
import org.apache.ibatis.annotations.Update;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
 
@RestController
@RequestMapping("/user")
public class ConstrolUserManger implements JkUserManger {
    @Autowired
    private ServerUser serverUser;
 
    @Override
    @PostMapping("/enroll")
    public MyResponse enroll(DtoUser dtoUser) {
        return serverUser.enroll(dtoUser);
    }
 
    @Override
    @PostMapping("/login")
    public MyResponse login(DtoUser dtoUser) {
        return serverUser.login(dtoUser);
    }
 
    @Override
    @PutMapping("/revisePasswd")
    public MyResponse revisePasswd(DtoUser dtoUser) {
        return serverUser.revisePasswd(dtoUser);
    }
 
    @Override
    @GetMapping("/adim/query")
    public MyResponse queryUser(DtoUser dtoUser) {
        return serverUser.queruser(dtoUser);
    }
 
    @Override
    @PutMapping("adim/isBanned")
    public MyResponse isBanned(DtoUser dtoUser) {
        return serverUser.isBanned(dtoUser);
    }
}


server实现
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.xiaoz.Serve;
 
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.UUID;
import com.xiaoz.Dao.DaoUser;
import com.xiaoz.Dto.Const;
import com.xiaoz.Dto.DtoUser;
import com.xiaoz.Dto.HttpResponseCode;
import com.xiaoz.Dto.MyResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
 
import java.util.List;
import java.util.Map;
 
@Service
public class ServerUser {
    @Autowired
    private DaoUser daoUser;
 
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;
 
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
 
    // 注册
    public MyResponse enroll(DtoUser dtoUser) {
        // bcrypt 加密
        String encodedPassword = bCryptPasswordEncoder.encode(dtoUser.getPasswd());
        // 替换原本的密码
        dtoUser.setPasswd(encodedPassword);
        //设置状态
        dtoUser.setCode(Const.USER_NORMAL);//默认正常
        //写入数据库保存
        daoUser.addUser(dtoUser);
        return new MyResponse(HttpResponseCode.ACCEPTED,"注册成功");
    }
 
    // 登录
    public MyResponse login(DtoUser user){
        List<DtoUser> query = daoUser.query(user);
        if (query.size() != 1){
            return new MyResponse(HttpResponseCode.BAD_REQUEST,"无效的用户消息");
        }
        //核对密码
        //校验是否被锁定
        if (Const.USER_LOCK.equals(query.getFirst().getCode()) || bCryptPasswordEncoder.matches(user.getPasswd(),query.getFirst().getPasswd())){
            return new MyResponse(HttpResponseCode.BAD_REQUEST,"用户被锁定中");
        }
        //生成uuid作为token
        String token = UUID.randomUUID().toString();
        //存储到redis
        redisTemplate.opsForHash().putAll(Const.USER_REDIS_KEY+token, BeanUtil.beanToMap(query.getFirst()));
        //返回令牌
        return new MyResponse(HttpResponseCode.OK,token);
    }
    // 修改密码
    public MyResponse revisePasswd(DtoUser user){
        //先到redis校验用户令牌,确认是本人操作
        Map<Object, Object> entries = redisTemplate.opsForHash().entries(Const.USER_REDIS_KEY + user.getToken());
        //检测reids是否有值
        if (entries.isEmpty()){
            return new MyResponse(HttpResponseCode.FORBIDDEN,"无效的令牌");
        }
        DtoUser dtoUser = new DtoUser();
        //将集合转为对象
        BeanUtil.fillBeanWithMap(entries, dtoUser, true);
        //修改数据库数据
        daoUser.reviseUser(user);
        //将redis的值删除
        redisTemplate.delete(Const.USER_REDIS_KEY+user.getToken());
        //返回修改成功消息
        return new MyResponse(HttpResponseCode.OK,"修改完毕,请重新登录");
    }
 
    // 查询
    public MyResponse queruser(DtoUser user){
        return new MyResponse(HttpResponseCode.OK,daoUser.query(user));
    }
    // 封禁or解封
    public MyResponse isBanned(DtoUser user){
        //判断是否存在,或是否精确
        List<DtoUser> query = daoUser.query(user);
        if (query.size() > 1){
            return new MyResponse(HttpResponseCode.BAD_REQUEST,"请提供详细的用户");
        } else if (query.isEmpty()) {
            return new  MyResponse(HttpResponseCode.BAD_REQUEST,"无该用户");
        }
        if (user.getCode() == null){
            return new MyResponse(HttpResponseCode.BAD_REQUEST,"请选择是否封禁");
        }
        //封禁用户
        daoUser.isBanned(user);
        return new MyResponse(HttpResponseCode.OK,"封禁完毕");
    }
}


map映射
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package com.xiaoz.Map;
 
import com.xiaoz.Dto.DtoUser;
import org.apache.ibatis.annotations.Mapper;
 
import java.util.List;
 
@Mapper
public interface MapUser {
    //注册
    void enroll(DtoUser dtoUser);
    //查询
    List<DtoUser> query(DtoUser user);
    //修改密码
    void revise(DtoUser dtoUser);
    //封禁或者封禁
    void isBanned(DtoUser dtoUser);
}


dao持久层
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.xiaoz.Dao;
 
import com.xiaoz.Dto.DtoUser;
import com.xiaoz.Map.MapUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
 
import java.util.List;
 
@Controller
public class DaoUser {
    @Autowired
    private MapUser mapUser;
    //增加用户
    public void addUser(DtoUser user){
        mapUser.enroll(user);
    }
    //改密码
    public void reviseUser(DtoUser user){
        mapUser.revise(user);
    }
    //设置状态(是否封禁)
    public void isBanned(DtoUser user){
        mapUser.isBanned(user);
    }
    //查询用户
    public List<DtoUser> query(DtoUser user){
        return mapUser.query(user);
    }
}


常量表
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
package com.xiaoz.Dto;
 
public class Const {
    //用户被锁定
    public static Integer USER_LOCK = 2;
    //用户正常状态
    public static Integer USER_NORMAL = 1;
    //用户保存在redis的键
    public static String USER_REDIS_KEY = "users_ession:";
}


用户dto
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
package com.xiaoz.Dto;
 
import lombok.Data;
 
@Data
public class DtoUser {
    private Integer id; //id
    private String name;//用户名
    private String passwd;//密码
    private Integer code;//状态
    private String token;//登录使用的令牌
}


响应码
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.xiaoz.Dto;
 
public enum HttpResponseCode {
    // 成功响应
    OK(200, "请求成功"),
    CREATED(201, "已创建"),
    ACCEPTED(202, "已接受"),
    NO_CONTENT(204, "无内容"),
 
    // 客户端错误响应
    BAD_REQUEST(400, "错误的请求"),
    UNAUTHORIZED(401, "未授权"),
    FORBIDDEN(403, "禁止访问"),
    NOT_FOUND(404, "未找到"),
    METHOD_NOT_ALLOWED(405, "方法不允许"),
    REQUEST_TIMEOUT(408, "请求超时"),
    CONFLICT(409, "冲突"),
    GONE(410, "已消失"),
 
    // 服务器错误响应
    INTERNAL_SERVER_ERROR(500, "内部服务器错误"),
    NOT_IMPLEMENTED(501, "尚未实施"),
    SERVICE_UNAVAILABLE(503, "服务不可用"),
    GATEWAY_TIMEOUT(504, "网关超时");
 
    private final int code;
    private final String description;
 
    HttpResponseCode(int code, String description) {
        this.code = code;
        this.description = description;
    }
 
    public int getCode() {
        return code;
    }
 
    public String getDescription() {
        return description;
    }
 
    @Override
    public String toString() {
        return code + ": " + description;
    }
}


自定义响应

对象
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package com.xiaoz.Dto;
 
public class MyResponse {
    private Integer code;//响应码
    private String msg;//提示消息
    private Object data;//响应体
 
    private MyResponse(){};
 
    public MyResponse(HttpResponseCode responseCode,Object data){
        this.code = responseCode.getCode();
        this.msg = responseCode.getDescription();
        this.data = data;
    }
}


mybatis文件
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?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.xiaoz.Map.MapUser">
<!--    注册-->
    <insert id="enroll" parameterType="com.xiaoz.Dto.DtoUser" useGeneratedKeys="true" keyProperty="id">
        insert into user (name, passwd, code) values
                        (#{name},#{passwd},#{code})
    </insert>
<!--    //查询-->
    <select id="query" parameterType="com.xiaoz.Dto.DtoUser" resultType="com.xiaoz.Dto.DtoUser">
        select *from user
        <where>
            <choose>
                <when test="id != null and name != null">
                    id = #{id} and name = #{name}
                </when>
                <when test="name != null and id =null">
                    name = #{name}
                </when>
                <when test="id != null and name == null"></when>
            </choose>
        </where>
    </select>
<!--    //修改密码-->
    <update id="revise" parameterType="com.xiaoz.Dto.DtoUser">
        update user set passwd = #{passwd}
        <where>
            <if test=" id != null ">
                and id = #{id}
            </if>
        </where>
    </update>
<!--    //封禁或解封-->
    <update id="isBanned" parameterType="com.xiaoz.Dto.DtoUser">
        update user set code = #{code}
        <where>
            id = #{id}
        </where>
    </update>
</mapper>


redis配置类
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package com.xiaoz.Config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
@Configuration
public class RedisConfig {
 
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        return  template;
    };
}


拦截器配置类
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.xiaoz.Config;
 
import com.xiaoz.Interceptor.UserMangerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 ConfigInterceptor implements WebMvcConfigurer {
    @Autowired
    private UserMangerInterceptor userMangerInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        WebMvcConfigurer.super.addInterceptors(registry);
        registry.addInterceptor(userMangerInterceptor)
                .addPathPatterns("/user/adim/**");
    }
}


盐加密对象配置类
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
package com.xiaoz.Config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
@Configuration
public class BCryptConfig {
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

免费评分

参与人数 2威望 +1 吾爱币 +10 热心值 +2 收起 理由
苏紫方璇 + 1 + 10 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cy325 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

UIIC 发表于 2025-3-15 14:48
代码里面的xiaoz我看见过,曾经用过他的程序,挺好的
WhiteLee1st 发表于 2025-3-15 19:38
my666666 发表于 2025-3-15 12:55
cy325 发表于 2025-3-15 13:27
瞅瞅瞅瞅
iSummer999 发表于 2025-3-15 15:15
请问几年工作经验
edwardjimmy 发表于 2025-3-15 16:06
学习学习
woyouhuilaile 发表于 2025-3-15 17:05
太强了~~~
dqsh01 发表于 2025-3-15 21:39
不错  学习了
rootbot007 发表于 2025-3-16 19:13
太厉害了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-15 19:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表