From eff1294ca6e741072d5e17aba9989d262b424f5f Mon Sep 17 00:00:00 2001 From: dyh <2825183872@qq.com> Date: Sat, 13 Aug 2022 01:28:06 +0800 Subject: [PATCH] =?UTF-8?q?version-1.8[=E6=B3=A8=E5=86=8C+=E7=99=BB?= =?UTF-8?q?=E5=BD=95+=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF(=E5=90=8E?= =?UTF-8?q?=E7=AB=AFAPUI+=E5=89=8D=E7=AB=AFVue)(localStore+ajax)]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 26 +++ .../com/kob/backend/BackendApplication.java | 1 + .../kob/backend/config/SecurityConfig.java | 38 ++++- .../filter/JwtAuthenticationTokenFilter.java | 61 +++++++ .../controller/user/UserController.java | 158 +++++++++--------- .../user/account/InfoController.java | 20 +++ .../user/account/LoginController.java | 31 ++++ .../user/account/RegisterController.java | 26 +++ .../main/java/com/kob/backend/pojo/User.java | 5 + .../service/impl/UserDetailsServiceImpl.java | 2 +- .../impl/user/account/InfoServiceImpl.java | 33 ++++ .../impl/user/account/LoginServiceImpl.java | 42 +++++ .../user/account/RegisterServiceImpl.java | 88 ++++++++++ .../service/impl/utils/UserDetailsImpl.java | 3 +- .../service/user/account/InfoService.java | 11 ++ .../service/user/account/LoginService.java | 11 ++ .../service/user/account/RegisterService.java | 10 ++ .../java/com/kob/backend/utils/JwtUtil.java | 63 +++++++ web/src/App.vue | 81 +++++++-- web/src/assets/images/404.jpg | Bin 0 -> 98099 bytes web/src/assets/scripts/AcGameObject.js | 2 +- web/src/assets/scripts/GameMap.js | 2 +- web/src/components/NavBar.vue | 37 ++-- web/src/router/index.js | 55 +++++- web/src/store/index.js | 3 + web/src/store/user.js | 105 ++++++++++++ web/src/views/error/NotFound.vue | 2 +- .../user/account/UserAccountLoginView.vue | 104 ++++++++++++ .../user/account/UserAccountRegisterView.vue | 83 +++++++++ web/src/views/user/account/copy.vue | 70 ++++++++ 30 files changed, 1057 insertions(+), 116 deletions(-) create mode 100644 backend/src/main/java/com/kob/backend/config/filter/JwtAuthenticationTokenFilter.java create mode 100644 backend/src/main/java/com/kob/backend/controller/user/account/InfoController.java create mode 100644 backend/src/main/java/com/kob/backend/controller/user/account/LoginController.java create mode 100644 backend/src/main/java/com/kob/backend/controller/user/account/RegisterController.java create mode 100644 backend/src/main/java/com/kob/backend/service/impl/user/account/InfoServiceImpl.java create mode 100644 backend/src/main/java/com/kob/backend/service/impl/user/account/LoginServiceImpl.java create mode 100644 backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java create mode 100644 backend/src/main/java/com/kob/backend/service/user/account/InfoService.java create mode 100644 backend/src/main/java/com/kob/backend/service/user/account/LoginService.java create mode 100644 backend/src/main/java/com/kob/backend/service/user/account/RegisterService.java create mode 100644 backend/src/main/java/com/kob/backend/utils/JwtUtil.java create mode 100644 web/src/assets/images/404.jpg create mode 100644 web/src/store/user.js create mode 100644 web/src/views/user/account/UserAccountLoginView.vue create mode 100644 web/src/views/user/account/UserAccountRegisterView.vue create mode 100644 web/src/views/user/account/copy.vue diff --git a/backend/pom.xml b/backend/pom.xml index 17390d8..41c755d 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -16,6 +16,32 @@ + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + org.springframework.boot spring-boot-starter-security diff --git a/backend/src/main/java/com/kob/backend/BackendApplication.java b/backend/src/main/java/com/kob/backend/BackendApplication.java index 1b2f296..ca43a67 100644 --- a/backend/src/main/java/com/kob/backend/BackendApplication.java +++ b/backend/src/main/java/com/kob/backend/BackendApplication.java @@ -13,3 +13,4 @@ public class BackendApplication { } } + \ No newline at end of file diff --git a/backend/src/main/java/com/kob/backend/config/SecurityConfig.java b/backend/src/main/java/com/kob/backend/config/SecurityConfig.java index ed324e8..acc5287 100644 --- a/backend/src/main/java/com/kob/backend/config/SecurityConfig.java +++ b/backend/src/main/java/com/kob/backend/config/SecurityConfig.java @@ -1,20 +1,48 @@ //实现用户密码的加密存储。==>加上此文件,必须是密文存储 - +//实现公开页面 package com.kob.backend.config; +import com.kob.backend.config.filter.JwtAuthenticationTokenFilter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity - -public class SecurityConfig { +public class SecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Bean public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder();//返回加密方法 + return new BCryptPasswordEncoder(); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable() + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + .antMatchers("/user/account/token/", "/user/account/register/").permitAll() + .antMatchers(HttpMethod.OPTIONS).permitAll() + .anyRequest().authenticated(); + + http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/kob/backend/config/filter/JwtAuthenticationTokenFilter.java b/backend/src/main/java/com/kob/backend/config/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..e901eef --- /dev/null +++ b/backend/src/main/java/com/kob/backend/config/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,61 @@ +//用来验证jwt token,如果验证成功,则将User信息注入上下文中 +package com.kob.backend.config.filter; + +import com.kob.backend.mapper.UserMapper; +import com.kob.backend.pojo.User; +import com.kob.backend.service.impl.utils.UserDetailsImpl; +import com.kob.backend.utils.JwtUtil; +import io.jsonwebtoken.Claims; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + @Autowired + private UserMapper userMapper; + + @Override + protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException { + String token = request.getHeader("Authorization"); + + if (!StringUtils.hasText(token) || !token.startsWith("Bearer ")) { + filterChain.doFilter(request, response); + return; + } + + token = token.substring(7); + + String userid; + try { + Claims claims = JwtUtil.parseJWT(token); + userid = claims.getSubject(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + User user = userMapper.selectById(Integer.parseInt(userid)); + + if (user == null) { + throw new RuntimeException("用户名未登录"); + } + + UserDetailsImpl loginUser = new UserDetailsImpl(user); + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(loginUser, null, null); + + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + + filterChain.doFilter(request, response); + } +} diff --git a/backend/src/main/java/com/kob/backend/controller/user/UserController.java b/backend/src/main/java/com/kob/backend/controller/user/UserController.java index 7a5f085..474f219 100644 --- a/backend/src/main/java/com/kob/backend/controller/user/UserController.java +++ b/backend/src/main/java/com/kob/backend/controller/user/UserController.java @@ -1,79 +1,79 @@ -package com.kob.backend.controller.user; - - -//@ResponseBody 把return的结果变为Json等数据, -//@Controller 返回jsp,html页面+跳转 -//@Controller + @ResponseBody 返回json等数据 -//@RestController 返回json等数据,不能是jsp,html【@Controller+@responseBody】 - -//@RequestMapping 给出外界访问方法的路径,或者说触发路径 ,触发条件 -//@GetMapping -//PostMapping - -//@AutoWired:自动导入依赖的bean。[用到mapper层的接口时,数据库,写上去] -//byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 -//当加上(required=false)时,就算找不到bean也不报错。 -//它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。 - -//mapper接口 被mybatis实现 -//接口实例调用mybatis的crud -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.kob.backend.mapper.UserMapper; -import com.kob.backend.pojo.User; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -//@@@@@@@@@@@@@@@ 实现了【增删查】 @@@@@@@@@@@@@@@@ -@RestController -public class UserController { - - @Autowired - UserMapper userMapper; - - /*查询所有用户*/ - @GetMapping("/user/all/") - public List getAll() - { - return userMapper.selectList(null); - } - - /*查询单个用户*/ - @GetMapping("/user/{userId}/") - public User getUser(@PathVariable int userId) - { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id",userId); - return userMapper.selectOne(queryWrapper); - // 范围遍历 - // public List getUser(int userId) - // queryWrapper.ge("id", 2).le("id", 3); - // return userMapper.selectList(queryWrapper); - } - - /*添加一个用户*/ - @GetMapping("/user/add/{userId}/{username}/{password}/") - public String addUser(@PathVariable int userId, - @PathVariable String username, - @PathVariable String password) - { - PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - String encoderPassword = passwordEncoder.encode(password); - User user = new User(userId,username,encoderPassword); - userMapper.insert(user); - return "Add User Sucessfully"; - } - - /*删除一个用户*/ - @GetMapping("/user/delete/{userId}/") - public String deleteUser(@PathVariable int userId) - { - userMapper.deleteById(userId); - return "Delete User Successfully"; - } - -} \ No newline at end of file +//package com.kob.backend.controller.user; +// +// +////@ResponseBody 把return的结果变为Json等数据, +////@Controller 返回jsp,html页面+跳转 +////@Controller + @ResponseBody 返回json等数据 +////@RestController 返回json等数据,不能是jsp,html【@Controller+@responseBody】 +// +////@RequestMapping 给出外界访问方法的路径,或者说触发路径 ,触发条件 +////@GetMapping +////PostMapping +// +////@AutoWired:自动导入依赖的bean。[用到mapper层的接口时,数据库,写上去] +////byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 +////当加上(required=false)时,就算找不到bean也不报错。 +////它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。 +// +////mapper接口 被mybatis实现 +////接口实例调用mybatis的crud +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +//import com.kob.backend.mapper.UserMapper; +//import com.kob.backend.pojo.User; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +//import org.springframework.security.crypto.password.PasswordEncoder; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.RestController; +// +//import java.util.List; +////@@@@@@@@@@@@@@@ 实现了【增删查】 @@@@@@@@@@@@@@@@ +//@RestController +//public class UserController { +// +// @Autowired +// UserMapper userMapper; +// +// /*查询所有用户*/ +// @GetMapping("/user/all/") +// public List getAll() +// { +// return userMapper.selectList(null); +// } +// +// /*查询单个用户*/ +// @GetMapping("/user/{userId}/") +// public User getUser(@PathVariable int userId) +// { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("id",userId); +// return userMapper.selectOne(queryWrapper); +// // 范围遍历 +// // public List getUser(int userId) +// // queryWrapper.ge("id", 2).le("id", 3); +// // return userMapper.selectList(queryWrapper); +// } +// +// /*添加一个用户*/ +// @GetMapping("/user/add/{userId}/{username}/{password}/") +// public String addUser(@PathVariable int userId, +// @PathVariable String username, +// @PathVariable String password) +// { +// PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); +// String encoderPassword = passwordEncoder.encode(password); +// User user = new User(userId,username,encoderPassword,"00"); +// userMapper.insert(user); +// return "Add User Sucessfully"; +// } +// +// /*删除一个用户*/ +// @GetMapping("/user/delete/{userId}/") +// public String deleteUser(@PathVariable int userId) +// { +// userMapper.deleteById(userId); +// return "Delete User Successfully"; +// } +// +//} \ No newline at end of file diff --git a/backend/src/main/java/com/kob/backend/controller/user/account/InfoController.java b/backend/src/main/java/com/kob/backend/controller/user/account/InfoController.java new file mode 100644 index 0000000..1723fa4 --- /dev/null +++ b/backend/src/main/java/com/kob/backend/controller/user/account/InfoController.java @@ -0,0 +1,20 @@ +package com.kob.backend.controller.user.account; + +import com.kob.backend.service.user.account.InfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class InfoController { + @Autowired + private InfoService infoService; + + @GetMapping("/user/account/info/") + public Map getInfo() + { + return infoService.getInfo(); + } +} diff --git a/backend/src/main/java/com/kob/backend/controller/user/account/LoginController.java b/backend/src/main/java/com/kob/backend/controller/user/account/LoginController.java new file mode 100644 index 0000000..b7f7f6d --- /dev/null +++ b/backend/src/main/java/com/kob/backend/controller/user/account/LoginController.java @@ -0,0 +1,31 @@ +package com.kob.backend.controller.user.account; + + +import com.kob.backend.service.user.account.LoginService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +//@GetMapping 直接从URL获得数据,以www.xxx.com/?id=1类似这种形式传输 +//@PostMapping 请求会从body部分拿到数据,好处是一些不希望用户看到的数据会放在body里面传输。 + +//返回数据 +@RestController +public class LoginController { + @Autowired + private LoginService loginService;//接口实例调用接口方法==>调用实现类中的方法 + + @PostMapping("/user/account/token/") + public Map getToken(@RequestParam Map map) + { + String username = map.get("username"); + String password = map.get("password"); +// System.out.println("------------"); + return loginService.getToken(username,password); + } + +} diff --git a/backend/src/main/java/com/kob/backend/controller/user/account/RegisterController.java b/backend/src/main/java/com/kob/backend/controller/user/account/RegisterController.java new file mode 100644 index 0000000..87b6bbb --- /dev/null +++ b/backend/src/main/java/com/kob/backend/controller/user/account/RegisterController.java @@ -0,0 +1,26 @@ +package com.kob.backend.controller.user.account; + +import com.kob.backend.service.user.account.RegisterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class RegisterController { + + @Autowired + private RegisterService registerService; + + @PostMapping("/user/account/register/") + public Map register(@RequestParam Map map) + { + String username = map.get("username"); + String password = map.get("password"); + String confirmedPassword = map.get("confirmedPassword"); + return registerService.register(username,password,confirmedPassword); + } + +} diff --git a/backend/src/main/java/com/kob/backend/pojo/User.java b/backend/src/main/java/com/kob/backend/pojo/User.java index bec7030..a246af2 100644 --- a/backend/src/main/java/com/kob/backend/pojo/User.java +++ b/backend/src/main/java/com/kob/backend/pojo/User.java @@ -1,5 +1,7 @@ package com.kob.backend.pojo; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -15,7 +17,10 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Data public class User { + + @TableId(type = IdType.AUTO) private Integer id; private String username; private String password; + private String photo; } \ No newline at end of file diff --git a/backend/src/main/java/com/kob/backend/service/impl/UserDetailsServiceImpl.java b/backend/src/main/java/com/kob/backend/service/impl/UserDetailsServiceImpl.java index 38c4047..b703f79 100644 --- a/backend/src/main/java/com/kob/backend/service/impl/UserDetailsServiceImpl.java +++ b/backend/src/main/java/com/kob/backend/service/impl/UserDetailsServiceImpl.java @@ -1,5 +1,5 @@ package com.kob.backend.service.impl; - +//关联数据库 【加载用户通过用户名 返回UserDetails接口实例】====》明文登录 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.kob.backend.mapper.UserMapper; import com.kob.backend.service.impl.utils.UserDetailsImpl; diff --git a/backend/src/main/java/com/kob/backend/service/impl/user/account/InfoServiceImpl.java b/backend/src/main/java/com/kob/backend/service/impl/user/account/InfoServiceImpl.java new file mode 100644 index 0000000..6963601 --- /dev/null +++ b/backend/src/main/java/com/kob/backend/service/impl/user/account/InfoServiceImpl.java @@ -0,0 +1,33 @@ +package com.kob.backend.service.impl.user.account; + +import com.kob.backend.pojo.User; +import com.kob.backend.service.impl.utils.UserDetailsImpl; +import com.kob.backend.service.user.account.InfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class InfoServiceImpl implements InfoService { + @Override + public Map getInfo() { + //获取用户认证 + UsernamePasswordAuthenticationToken authenticationToken = + (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + + //取出用户(实例化UserDetailsImp类) + UserDetailsImpl loginUser = (UserDetailsImpl) authenticationToken.getPrincipal(); + User user = loginUser.getUser(); + + Map map = new HashMap<>(); + map.put("error_message","success"); + map.put("id",user.getId().toString()); + map.put("username",user.getUsername()); + map.put("photo",user.getPhoto()); + return map; + } +} diff --git a/backend/src/main/java/com/kob/backend/service/impl/user/account/LoginServiceImpl.java b/backend/src/main/java/com/kob/backend/service/impl/user/account/LoginServiceImpl.java new file mode 100644 index 0000000..54106a8 --- /dev/null +++ b/backend/src/main/java/com/kob/backend/service/impl/user/account/LoginServiceImpl.java @@ -0,0 +1,42 @@ +package com.kob.backend.service.impl.user.account; + +import com.kob.backend.pojo.User; +import com.kob.backend.service.impl.utils.UserDetailsImpl; +import com.kob.backend.service.user.account.LoginService; +import com.kob.backend.utils.JwtUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +//AuthenticationManager(接口) 是认证相关的核心接口,也是发起认证的出发点 +// + +import java.util.HashMap; +import java.util.Map; + +@Service +public class LoginServiceImpl implements LoginService { + + @Autowired + private AuthenticationManager authenticationManager; + + @Override + public Map getToken(String username, String password) { + //将用户名+密码加密封装 + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(username,password); + //身份认证方法==>登录失败,自动处理 + Authentication authenticate = authenticationManager.authenticate(authenticationToken); + //登录成功==>取出用户(实例化UserDetailsImp类) + UserDetailsImpl loginUser = (UserDetailsImpl) authenticate.getPrincipal(); + User user = loginUser.getUser();//因为UserDetailsImpl有@Data + //取出Token==>通过主键生成jwt_token + String jwt = JwtUtil.createJWT(user.getId().toString()); + + Map map = new HashMap<>(); + map.put("error_message","success"); + map.put("token",jwt); + return map; + } +} diff --git a/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java b/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java new file mode 100644 index 0000000..a28c239 --- /dev/null +++ b/backend/src/main/java/com/kob/backend/service/impl/user/account/RegisterServiceImpl.java @@ -0,0 +1,88 @@ +package com.kob.backend.service.impl.user.account; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.kob.backend.mapper.UserMapper; +import com.kob.backend.pojo.User; +import com.kob.backend.service.user.account.RegisterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +@Service +public class RegisterServiceImpl implements RegisterService { + @Autowired + private UserMapper userMapper; + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + public Map register(String username, String password, String confirmedPassword) { + + Map map = new HashMap<>(); + + //判断是否有参数 + if(username == null) + { + map.put("error_message","用户名不能为空"); + return map; + } + + if(password == null || confirmedPassword == null) + { + map.put("error_message","密码不能为空"); + return map; + } + + //判断长度是否为 + username = username.trim(); + if(username.length() == 0) + { + map.put("error_message","用户名不能为空"); + return map; + } + + if(password.length() == 0 || confirmedPassword.length() == 0)//密码可以有空格 + { + map.put("error_message","密码不能为空"); + return map; + } + + if(username.length() > 100) + { + map.put("error_message","用户名长度不能大于100"); + return map; + } + if (password.length() > 100 || confirmedPassword.length() > 100) { + map.put("error_message", "密码不能大于100"); + return map; + } + + if(password.equals(confirmedPassword) == false) + { + map.put("error_message","两次密码不相同"); + return map; + } + + //查询用户名是否已经存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username",username); + List users = userMapper.selectList(queryWrapper); + if(!users.isEmpty()){ + map.put("error_message","用户名已存在"); + return map; + } + + //添加一个用户 + String encodedPassword = passwordEncoder.encode(password);//密码 + String photo = "https://cdn.acwing.com/media/user/profile/photo/85918_lg_5ed2550a14.png"; + User user = new User(null,username,encodedPassword,photo); + userMapper.insert(user); + map.put("error_message","success"); + + return map; + } +} diff --git a/backend/src/main/java/com/kob/backend/service/impl/utils/UserDetailsImpl.java b/backend/src/main/java/com/kob/backend/service/impl/utils/UserDetailsImpl.java index e49d92b..fc1c7e4 100644 --- a/backend/src/main/java/com/kob/backend/service/impl/utils/UserDetailsImpl.java +++ b/backend/src/main/java/com/kob/backend/service/impl/utils/UserDetailsImpl.java @@ -1,5 +1,5 @@ package com.kob.backend.service.impl.utils; - +//个人信息接口的实现====》明文登录 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -30,6 +30,7 @@ public class UserDetailsImpl implements UserDetails @Override public String getUsername() { return user.getUsername();} + //isAccountNonExpired 账户没有过期 @Override public boolean isAccountNonExpired() {//账号没过期 diff --git a/backend/src/main/java/com/kob/backend/service/user/account/InfoService.java b/backend/src/main/java/com/kob/backend/service/user/account/InfoService.java new file mode 100644 index 0000000..28e984a --- /dev/null +++ b/backend/src/main/java/com/kob/backend/service/user/account/InfoService.java @@ -0,0 +1,11 @@ +package com.kob.backend.service.user.account; +//根据令牌返回用户信息 +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public interface InfoService { + public Map getInfo(); +} + diff --git a/backend/src/main/java/com/kob/backend/service/user/account/LoginService.java b/backend/src/main/java/com/kob/backend/service/user/account/LoginService.java new file mode 100644 index 0000000..9f1436f --- /dev/null +++ b/backend/src/main/java/com/kob/backend/service/user/account/LoginService.java @@ -0,0 +1,11 @@ +package com.kob.backend.service.user.account; + +import org.springframework.stereotype.Service; + +import java.util.Map; + +//验证用户名密码,验证成功后返回 jwt token(令牌) +@Service +public interface LoginService { + public Map getToken(String username,String password); +} diff --git a/backend/src/main/java/com/kob/backend/service/user/account/RegisterService.java b/backend/src/main/java/com/kob/backend/service/user/account/RegisterService.java new file mode 100644 index 0000000..72eddfb --- /dev/null +++ b/backend/src/main/java/com/kob/backend/service/user/account/RegisterService.java @@ -0,0 +1,10 @@ +package com.kob.backend.service.user.account; +//注册账号 +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public interface RegisterService { + public Map register(String username, String password, String confirmedPassword); +} diff --git a/backend/src/main/java/com/kob/backend/utils/JwtUtil.java b/backend/src/main/java/com/kob/backend/utils/JwtUtil.java new file mode 100644 index 0000000..693b1aa --- /dev/null +++ b/backend/src/main/java/com/kob/backend/utils/JwtUtil.java @@ -0,0 +1,63 @@ +//JwtUtil 类为jwt 工具类 用来创建、解析 jwt token +package com.kob.backend.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; +import java.util.Date; +import java.util.UUID; + +@Component +public class JwtUtil { + public static final long JWT_TTL = 60 * 60 * 1000L * 24 * 14; // 有效期14天 + public static final String JWT_KEY = "SDFGjhdsfalshdfHFdsjkdsfds121232131afasdfac";//密钥 + + public static String getUUID() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String createJWT(String subject) { + JwtBuilder builder = getJwtBuilder(subject, null, getUUID()); + return builder.compact(); + } + + private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) { + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + SecretKey secretKey = generalKey(); + long nowMillis = System.currentTimeMillis(); + Date now = new Date(nowMillis); + if (ttlMillis == null) { + ttlMillis = JwtUtil.JWT_TTL; + } + + long expMillis = nowMillis + ttlMillis; + Date expDate = new Date(expMillis); + return Jwts.builder() + .setId(uuid) + .setSubject(subject) + .setIssuer("sg") + .setIssuedAt(now) + .signWith(signatureAlgorithm, secretKey) + .setExpiration(expDate); + } + + public static SecretKey generalKey() { + byte[] encodeKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY); + return new SecretKeySpec(encodeKey, 0, encodeKey.length, "HmacSHA256"); + } + + public static Claims parseJWT(String jwt) throws Exception { + SecretKey secretKey = generalKey(); + return Jwts.parserBuilder() + .setSigningKey(secretKey) + .build() + .parseClaimsJws(jwt) + .getBody(); + } +} \ No newline at end of file diff --git a/web/src/App.vue b/web/src/App.vue index 7afd6f4..3baba51 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -6,33 +6,86 @@ diff --git a/web/src/assets/images/404.jpg b/web/src/assets/images/404.jpg new file mode 100644 index 0000000000000000000000000000000000000000..595a4a9f9edcc43d79b0593790b8e6c99b496e3f GIT binary patch literal 98099 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μ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 { //【迭代】浏览器每一秒会迭代60次 requestAnimationFrame(step); + } //浏览器刷新 -> 执行一次 diff --git a/web/src/assets/scripts/GameMap.js b/web/src/assets/scripts/GameMap.js index a3b0e00..8354224 100644 --- a/web/src/assets/scripts/GameMap.js +++ b/web/src/assets/scripts/GameMap.js @@ -18,7 +18,7 @@ export class GameMap extends AcGameObject this.walls=[]; - this.inner_walls_count = 0; + this.inner_walls_count = 5; this.snakes = [ new Snake({id:0,color:"#4876ED",r:this.rows-2,c:1},this), diff --git a/web/src/components/NavBar.vue b/web/src/components/NavBar.vue index 6094f89..3327216 100644 --- a/web/src/components/NavBar.vue +++ b/web/src/components/NavBar.vue @@ -25,24 +25,31 @@ -