فهرست منبع

feature: add simple user module

ggbocoder 2 سال پیش
والد
کامیت
05b0786287

+ 14 - 0
db/user.sql

@@ -0,0 +1,14 @@
+
+CREATE TABLE users (
+                       user_id INT PRIMARY KEY AUTO_INCREMENT,
+                       username VARCHAR(50) NOT NULL UNIQUE,
+                       password VARCHAR(100) NOT NULL,
+                       email VARCHAR(100) NOT NULL UNIQUE,
+                       full_name VARCHAR(100),
+                       date_of_birth DATE,
+                       gender CHAR(1),
+                       phone_number VARCHAR(20),
+                       registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                       is_active BOOLEAN DEFAULT true,
+                       role VARCHAR(20) DEFAULT 'USER'
+);

+ 12 - 0
pom.xml

@@ -39,6 +39,18 @@
             <version>2.3.1</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.23</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 42 - 0
src/main/java/cn/seecoder/fdroidrepository/Controller/UserController.java

@@ -0,0 +1,42 @@
+package cn.seecoder.fdroidrepository.Controller;
+
+
+
+import cn.seecoder.fdroidrepository.DataObject.User;
+import cn.seecoder.fdroidrepository.Service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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;
+
+// UserController.java
+@RestController
+@RequestMapping("/api/users")
+public class UserController {
+    @Autowired
+    private UserService userService;
+
+    @PostMapping("/register")
+    public ResponseEntity<String> register(@RequestBody User user) {
+        if (!userService.isUsernameUnique(user.getUsername())) {
+            return new ResponseEntity<>("Username is already taken", HttpStatus.BAD_REQUEST);
+        }
+
+        userService.save(user);
+        return new ResponseEntity<>("User registered successfully", HttpStatus.OK);
+    }
+
+    @PostMapping("/login")
+    public ResponseEntity<String> login(@RequestBody User user) {
+        User existingUser = userService.findByUsername(user.getUsername());
+
+        if (existingUser == null || !existingUser.getPassword().equals(user.getPassword())) {
+            return new ResponseEntity<>("Invalid username or password", HttpStatus.UNAUTHORIZED);
+        }
+
+        return new ResponseEntity<>("Login successful", HttpStatus.OK);
+    }
+}

+ 107 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/User.java

@@ -0,0 +1,107 @@
+package cn.seecoder.fdroidrepository.DataObject;
+
+import java.util.Date;
+
+public class User {
+    private Long userId;
+    private String username;
+    private String password;
+    private String email;
+    private String fullName;
+    private Date dateOfBirth;
+    private String gender;
+    private String phoneNumber;
+    private Date registrationDate;
+    private boolean active;
+    private String role;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    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 getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getFullName() {
+        return fullName;
+    }
+
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
+
+    public Date getDateOfBirth() {
+        return dateOfBirth;
+    }
+
+    public void setDateOfBirth(Date dateOfBirth) {
+        this.dateOfBirth = dateOfBirth;
+    }
+
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public boolean isActive() {
+        return active;
+    }
+
+    public void setActive(boolean active) {
+        this.active = active;
+    }
+
+    public Date getRegistrationDate() {
+        return registrationDate;
+    }
+
+    public void setRegistrationDate(Date registrationDate) {
+        this.registrationDate = registrationDate;
+    }
+
+
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+}

+ 11 - 0
src/main/java/cn/seecoder/fdroidrepository/Mapper/UserMapper.java

@@ -0,0 +1,11 @@
+package cn.seecoder.fdroidrepository.Mapper;
+
+import cn.seecoder.fdroidrepository.DataObject.User;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface UserMapper {
+    User findByUsername(String username);
+
+    void save(User user);
+}

+ 29 - 0
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/UserServiceImpl.java

@@ -0,0 +1,29 @@
+package cn.seecoder.fdroidrepository.Service.ServiceImpl;
+
+import cn.seecoder.fdroidrepository.DataObject.User;
+import cn.seecoder.fdroidrepository.Mapper.UserMapper;
+import cn.seecoder.fdroidrepository.Service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceImpl implements UserService {
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public User findByUsername(String username) {
+        return userMapper.findByUsername(username);
+    }
+
+    @Override
+    public void save(User user) {
+        userMapper.save(user);
+    }
+
+    @Override
+    public boolean isUsernameUnique(String username) {
+        User existingUser = findByUsername(username);
+        return existingUser == null;
+    }
+}

+ 13 - 0
src/main/java/cn/seecoder/fdroidrepository/Service/UserService.java

@@ -0,0 +1,13 @@
+package cn.seecoder.fdroidrepository.Service;
+
+import cn.seecoder.fdroidrepository.DataObject.User;
+import org.springframework.stereotype.Service;
+
+
+public interface UserService {
+    User findByUsername(String username);
+
+    void save(User user);
+
+    boolean isUsernameUnique(String username);
+}

+ 10 - 0
src/main/java/cn/seecoder/fdroidrepository/config/MyBatisConfig.java

@@ -0,0 +1,10 @@
+package cn.seecoder.fdroidrepository.config;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@MapperScan("cn.seecoder.fdroidrepository.Mapper")
+public class MyBatisConfig {
+
+}

+ 8 - 0
src/main/resources/application.properties

@@ -1 +1,9 @@
 
+# 数据库连接配置
+spring.datasource.url=jdbc:mysql://localhost:3306/fdroid
+spring.datasource.username=root
+spring.datasource.password=root
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+
+# MyBatis配置
+mybatis.mapper-locations=classpath:mapper/*.xml

+ 31 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,31 @@
+<?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="cn.seecoder.fdroidrepository.Mapper.UserMapper">
+
+    <!-- 定义ResultMap,用于映射数据库列到Java对象的属性 -->
+    <resultMap id="BaseResultMap" type="cn.seecoder.fdroidrepository.DataObject.User">
+        <id property="userId" column="user_id" />
+        <result property="username" column="username" />
+        <result property="password" column="password" />
+        <result property="email" column="email" />
+        <result property="fullName" column="full_name" />
+        <result property="dateOfBirth" column="date_of_birth" />
+        <result property="gender" column="gender" />
+        <result property="phoneNumber" column="phone_number" />
+        <result property="registrationDate" column="registration_date" />
+        <result property="active" column="is_active" />
+        <result property="role" column="role" />
+    </resultMap>
+
+    <!-- 根据用户名查询用户 -->
+    <select id="findByUsername" resultMap="BaseResultMap">
+        SELECT * FROM users WHERE username = #{username}
+    </select>
+
+    <!-- 插入用户信息 -->
+    <insert id="save" parameterType="cn.seecoder.fdroidrepository.DataObject.User">
+        INSERT INTO users (username, password, email, full_name, date_of_birth, gender, phone_number, registration_date, is_active, role)
+        VALUES (#{username}, #{password}, #{email}, #{fullName}, #{dateOfBirth}, #{gender}, #{phoneNumber}, #{registrationDate}, #{active}, #{role})
+    </insert>
+
+</mapper>