Quellcode durchsuchen

Merge branch 'westt/login' of rongrunxiang/OnlineJudge into master

rongrunxiang vor 2 Jahren
Ursprung
Commit
5d2cccec4f

+ 28 - 4
pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.1.2</version>
+        <version>2.2.2.RELEASE</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>com.example</groupId>
@@ -14,14 +14,13 @@
     <name>OnlineJudge</name>
     <description>OnlineJudge</description>
     <properties>
-        <java.version>17</java.version>
+        <java.version>8</java.version>
     </properties>
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-devtools</artifactId>
@@ -38,8 +37,33 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <version>8.0.31</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.2.16</version>
+        </dependency>
+        <!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.35.0.RC</version>
+        </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>

+ 2 - 0
src/main/java/com/example/onlinejudge/OnlineJudgeApplication.java

@@ -1,5 +1,6 @@
 package com.example.onlinejudge;
 
+import cn.dev33.satoken.SaManager;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@@ -8,6 +9,7 @@ public class OnlineJudgeApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(OnlineJudgeApplication.class, args);
+        System.out.println("启动成功 token:" + SaManager.getConfig());
     }
 
 }

+ 21 - 0
src/main/java/com/example/onlinejudge/bean/User.java

@@ -0,0 +1,21 @@
+package com.example.onlinejudge.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * 用户bean
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class User {
+    private Integer id;
+    private String username;
+    private String password;
+    private Timestamp registerTime;
+}

+ 29 - 0
src/main/java/com/example/onlinejudge/config/SaTokenConfigure.java

@@ -0,0 +1,29 @@
+package com.example.onlinejudge.config;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
+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 {
+    /**
+     * 添加拦截器
+     * @param registry
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new SaInterceptor( handle -> {
+                // 指定一条 match 规则
+                SaRouter
+                        .match("/**")
+                        .notMatch("/api/login/**")
+                        .check(r -> StpUtil.checkLogin());
+        })).addPathPatterns("/**");
+    }
+}

+ 61 - 0
src/main/java/com/example/onlinejudge/controller/UserController.java

@@ -0,0 +1,61 @@
+package com.example.onlinejudge.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.util.SaResult;
+import com.example.onlinejudge.bean.User;
+import com.example.onlinejudge.mapper.UserMapper;
+import com.example.onlinejudge.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 用户Controller层
+ */
+@Controller
+public class UserController {
+    @Autowired
+    private UserService userService;
+
+    /**
+     * 登录
+     *
+     * @param username 用户名
+     * @param password 用户密码
+     * @return 用户bean
+     */
+    @RequestMapping("/api/login/{username}/{password}")
+    @ResponseBody
+    public SaResult login(@PathVariable("username") String username,
+                          @PathVariable("password") String password) {
+        return userService.login(username, password);
+    }
+
+    /**
+     * 测试是否登录
+     *
+     * @return 字符串
+     */
+    @RequestMapping("/api/isLogin")
+    @ResponseBody
+    public String isLogin() {
+        return "当前会话是否登录:" + StpUtil.isLogin();
+    }
+
+    /**
+     * 测试注销
+     *
+     * @return
+     */
+    @RequestMapping("/api/logout")
+    @ResponseBody
+    public SaResult logout() {
+        StpUtil.logout();
+        return SaResult
+                .ok()
+                .set("error_message", "success");
+    }
+
+}

+ 20 - 0
src/main/java/com/example/onlinejudge/controller/exception/GlobalExceptionHandler.java

@@ -0,0 +1,20 @@
+package com.example.onlinejudge.controller.exception;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.util.SaResult;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局拦截异常
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    @ExceptionHandler(NotLoginException.class)
+    public SaResult handlerException(NotLoginException e) {
+        e.printStackTrace();
+        return SaResult
+                .error(e.getMessage())
+                .set("error_message", "failed");
+    }
+}

+ 11 - 0
src/main/java/com/example/onlinejudge/mapper/UserMapper.java

@@ -0,0 +1,11 @@
+package com.example.onlinejudge.mapper;
+
+import com.example.onlinejudge.bean.User;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface UserMapper {
+    User selectUserById(Integer id);
+    User selectUserByUsernameAndPassword(String username, String password);
+}

+ 8 - 0
src/main/java/com/example/onlinejudge/service/UserService.java

@@ -0,0 +1,8 @@
+package com.example.onlinejudge.service;
+
+import cn.dev33.satoken.util.SaResult;
+
+public interface UserService {
+    SaResult login(String username, String password);
+    String register(String username, String password, String confirmedPassword);
+}

+ 41 - 0
src/main/java/com/example/onlinejudge/service/impl/UserServiceImpl.java

@@ -0,0 +1,41 @@
+package com.example.onlinejudge.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.util.SaResult;
+import com.example.onlinejudge.bean.User;
+import com.example.onlinejudge.mapper.UserMapper;
+import com.example.onlinejudge.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 实现用户服务
+ */
+@Service
+public class UserServiceImpl implements UserService {
+    @Autowired
+    private UserMapper userMapper;
+
+    /**
+     * 用户登录服务
+     * @param username 用户名
+     * @param password 密码
+     * @return 登录结果
+     */
+    @Override
+    public SaResult login(String username, String password) {
+        User user = userMapper.selectUserByUsernameAndPassword(username, password);
+        if (user != null) {
+            StpUtil.login(user.getId());
+            return SaResult.ok("success").set("error_message", "success");
+        }
+        return SaResult.ok("failed").set("error_message", "用户名或密码错误");
+    }
+
+    @Override
+    public String register(String username, String password, String confirmedPassword) {
+        return null;
+    }
+}

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

@@ -1 +0,0 @@
-

+ 33 - 0
src/main/resources/application.yml

@@ -0,0 +1,33 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      driver-class-name: com.mysql.cj.jdbc.Driver
+      url: jdbc:mysql://localhost:3306/testjdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimeZone=UTC
+      username: root
+      password: colin123
+      max-wait: 3000
+      initial-size: 10
+      max-active: 200
+
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  configuration:
+#    开启驼峰映射
+    map-underscore-to-camel-case: true
+
+sa-token:
+  # token 名称(同时也是 cookie 名称)
+  token-name: satoken
+  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
+  timeout: 2592000
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1
+  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
+  is-share: true
+  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
+  token-style: uuid
+  # 是否输出操作日志
+  is-log: true

+ 12 - 0
src/main/resources/mapper/userMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.example.onlinejudge.mapper.UserMapper">
+    <select id="selectUserById" resultType="com.example.onlinejudge.bean.User">
+        SELECT * FROM t_user WHERE id = #{id}
+    </select>
+    <select id="selectUserByUsernameAndPassword" resultType="com.example.onlinejudge.bean.User">
+        SELECT * FROM t_user WHERE username = #{param1} and password = #{param2}
+    </select>
+</mapper>