diff --git a/code/backend/pom.xml b/code/backend/pom.xml index 1ea3f8b..ade399e 100644 --- a/code/backend/pom.xml +++ b/code/backend/pom.xml @@ -68,6 +68,18 @@ mybatis-plus-boot-starter 3.5.3.1 + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.1 + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.1.0 + diff --git a/code/backend/src/main/java/org/example/Main.java b/code/backend/src/main/java/org/example/Main.java index 3b73abc..f74642e 100644 --- a/code/backend/src/main/java/org/example/Main.java +++ b/code/backend/src/main/java/org/example/Main.java @@ -1,8 +1,14 @@ package org.example; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; @MapperScan("org.example.mapper") @SpringBootApplication @@ -10,4 +16,12 @@ public class Main { public static void main(String[] args) { SpringApplication.run(Main.class,args); } + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //分页 + interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); //防全局修改和删除 + return interceptor; + } } \ No newline at end of file diff --git a/code/backend/src/main/java/org/example/controller/UserController.java b/code/backend/src/main/java/org/example/controller/UserController.java index da75422..842b42d 100644 --- a/code/backend/src/main/java/org/example/controller/UserController.java +++ b/code/backend/src/main/java/org/example/controller/UserController.java @@ -1,10 +1,35 @@ package org.example.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.ibatis.annotations.Param; +import org.example.mapper.UserMapper; +import org.example.pojo.User; +import org.example.service.UserService; +import org.example.utils.Result; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +@Tag(name="用户",description = "用户相关接口") @RestController @RequestMapping("/user") public class UserController { + @Autowired + UserService userService; + + @Operation(summary = "注册", description = "用户注册接口") + @PostMapping("/regist") + public Result regist(@RequestBody User user){ + System.out.println(user); + return userService.regist(user); + } + + @Operation(summary = "登录", description = "用户登录接口") + @GetMapping("/login") + public Result login(@Parameter(description = "用户名") @Param("username") String username,@Parameter(description = "用户密码") @Param("password") String password){ + return userService.login(username, password); + } + } diff --git a/code/backend/src/main/java/org/example/pojo/User.java b/code/backend/src/main/java/org/example/pojo/User.java index 8eb678a..30faef3 100644 --- a/code/backend/src/main/java/org/example/pojo/User.java +++ b/code/backend/src/main/java/org/example/pojo/User.java @@ -1,8 +1,28 @@ package org.example.pojo; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data +@Schema(title = "用户相关信息") public class User { + @Schema(title = "用户id,不需要传") + private Integer id; + @Schema(title = "用户名,必需") + private String username; + @Schema(title = "用户昵称,必需") + private String name; + @Schema(title = "用户密码,必需") + private String password; + @Schema(title = "用户工作单位,非必须") + @TableField("workUnit") + private String workUnit; + @Schema(title = "用户邮箱,非必须") + private String email; + @Schema(title = "用户电话,非必须") + private String phone; + @Schema(title = "用户头像url,非必须") + private String avatar; } diff --git a/code/backend/src/main/java/org/example/service/UserService.java b/code/backend/src/main/java/org/example/service/UserService.java index 4957a6d..678ebb7 100644 --- a/code/backend/src/main/java/org/example/service/UserService.java +++ b/code/backend/src/main/java/org/example/service/UserService.java @@ -1,4 +1,9 @@ package org.example.service; +import org.example.pojo.User; +import org.example.utils.Result; + public interface UserService { + public Result regist(User user); + public Result login(String username, String password); } diff --git a/code/backend/src/main/java/org/example/service/impl/UserServiceImpl.java b/code/backend/src/main/java/org/example/service/impl/UserServiceImpl.java index e7c2df8..ced8c21 100644 --- a/code/backend/src/main/java/org/example/service/impl/UserServiceImpl.java +++ b/code/backend/src/main/java/org/example/service/impl/UserServiceImpl.java @@ -1,7 +1,43 @@ package org.example.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.example.mapper.UserMapper; +import org.example.pojo.User; +import org.example.service.UserService; +import org.example.utils.MD5Util; +import org.example.utils.Result; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service -public class UserServiceImpl { +public class UserServiceImpl implements UserService { + @Autowired + UserMapper userMapper; + + public Result regist(User user){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username",user.getUsername()); + boolean isExist = userMapper.exists(queryWrapper); + if(isExist){ + return Result.error("-1","用户名已被使用"); + } + user.setPassword(MD5Util.encrypt(user.getPassword())); + Integer rows = userMapper.insert(user); + if(rows>0){ + return Result.success(); + } + return Result.error("-1","failure"); + } + + @Override + public Result login(String username, String password) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username",username).eq("password",MD5Util.encrypt(password)); + User user = userMapper.selectOne(queryWrapper); + user.setPassword(null); + if(user != null){ + return Result.success(user); + } + return Result.error("-1","账号或者密码错误"); + } } diff --git a/code/backend/src/main/java/org/example/utils/MD5Util.java b/code/backend/src/main/java/org/example/utils/MD5Util.java new file mode 100644 index 0000000..d187701 --- /dev/null +++ b/code/backend/src/main/java/org/example/utils/MD5Util.java @@ -0,0 +1,32 @@ +package org.example.utils; + +import org.springframework.stereotype.Component; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +@Component +public final class MD5Util { + public static String encrypt(String strSrc) { + try { + char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', + '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + byte[] bytes = strSrc.getBytes(); + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(bytes); + bytes = md.digest(); + int j = bytes.length; + char[] chars = new char[j * 2]; + int k = 0; + for (int i = 0; i < bytes.length; i++) { + byte b = bytes[i]; + chars[k++] = hexChars[b >>> 4 & 0xf]; + chars[k++] = hexChars[b & 0xf]; + } + return new String(chars); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + throw new RuntimeException("MD5加密出错!!+" + e); + } + } +} \ No newline at end of file diff --git a/code/backend/src/main/java/org/example/utils/Result.java b/code/backend/src/main/java/org/example/utils/Result.java new file mode 100644 index 0000000..abc43ed --- /dev/null +++ b/code/backend/src/main/java/org/example/utils/Result.java @@ -0,0 +1,66 @@ +package org.example.utils; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(value = "响应结果实体", description = "响应结果实体") +public class Result { + @ApiModelProperty(value = "响应提示码") + private String code; + @ApiModelProperty(value = "提示信息") + private String msg; + @ApiModelProperty(value = "响应数据") + private T data; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public Result() { + } + + public Result(T data) { + this.data = data; + } + + public static Result success() { + Result result = new Result<>(); + result.setCode("0"); + result.setMsg("成功"); + return result; + } + + public static Result success(T data) { + Result result = new Result<>(data); + result.setCode("0"); + result.setMsg("成功"); + return result; + } + + public static Result error(String code, String msg) { + Result result = new Result(); + result.setCode(code); + result.setMsg(msg); + return result; + } +} diff --git a/code/backend/src/main/resources/application.yaml b/code/backend/src/main/resources/application.yaml index 6069f70..e764ce9 100644 --- a/code/backend/src/main/resources/application.yaml +++ b/code/backend/src/main/resources/application.yaml @@ -6,7 +6,7 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: - url: jdbc:mysql://localhost:3306/studb + url: jdbc:mysql://localhost:3306/digital_culture_heritage username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/code/frontend/src/views/user/Forum.vue b/code/frontend/src/views/user/Forum.vue new file mode 100644 index 0000000..61153a3 --- /dev/null +++ b/code/frontend/src/views/user/Forum.vue @@ -0,0 +1,67 @@ + + + + + + + + + + 湖南非遗论坛 + + 2023.10.19 + + + + 2023年10月12日,广受瞩目的第八届中国成都国际非物质文化遗产节开幕。其中的重要板块——非遗成都论坛以“《保护非物质文化遗产公约》20周年非物质文化遗产保护实践回顾与探索”为主题,邀请国内外非遗领域的知名专家学者多侧面多角度展开学术探讨,并分享国际社会在文... + + + + 查看讨论 + + + + + + + + + + + + + + \ No newline at end of file