Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@ -1,10 +1,9 @@
|
||||
<script setup lang="ts">
|
||||
|
||||
import LogPage from './components/LogPage.vue';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<LogPage/>
|
||||
<router-view/>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
Before Width: | Height: | Size: 496 B After Width: | Height: | Size: 496 B |
@ -0,0 +1,14 @@
|
||||
<script set lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'Manager',
|
||||
});
|
||||
</script>
|
||||
<template>
|
||||
|
||||
</template>
|
||||
|
||||
<sytle scoped>
|
||||
|
||||
</sytle>
|
@ -0,0 +1,32 @@
|
||||
import type { RouteRecord, RouteRecordRaw } from 'vue-router';
|
||||
import { createWebHashHistory, createRouter,createWebHistory } from 'vue-router';
|
||||
import LogPage from './components/LogPage.vue';
|
||||
import Personal from './components/Personal.vue';
|
||||
import Manager from './components/Personal/AcountManager.vue';
|
||||
|
||||
const routes:Array<RouteRecordRaw> = [
|
||||
{
|
||||
path:'/log',
|
||||
name: 'LogPage',
|
||||
component: LogPage
|
||||
},
|
||||
{
|
||||
path:'/personal',
|
||||
name: 'Personal',
|
||||
component: Personal,
|
||||
children: [
|
||||
{
|
||||
path:'manager',
|
||||
name: 'Manager',
|
||||
component:Manager,
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(import.meta.env.BASE_URL),
|
||||
routes
|
||||
});
|
||||
|
||||
export default router;
|
@ -0,0 +1,40 @@
|
||||
package com.unilife.config;
|
||||
|
||||
import com.unilife.interceptor.JwtInterceptor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class WebMvcConfig implements WebMvcConfigurer {
|
||||
@Autowired
|
||||
private JwtInterceptor jwtInterceptor;
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
registry.addInterceptor(jwtInterceptor).addPathPatterns("/**")
|
||||
.excludePathPatterns(
|
||||
"/users/login",
|
||||
"/users/register",
|
||||
"/users/code",
|
||||
"/users/login/code",
|
||||
"/swagger-resources/**",
|
||||
"/v2/api-docs/**",
|
||||
"/doc.html",
|
||||
"/webjars/**"
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
registry.addMapping("/**")
|
||||
.allowedOriginPatterns("*") // 允许所有来源,生产环境建议限制为特定域名
|
||||
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
|
||||
.allowedHeaders("*")
|
||||
.allowCredentials(true)
|
||||
.maxAge(3600);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.unilife.interceptor;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.unilife.utils.BaseContext;
|
||||
import com.unilife.utils.JwtUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class JwtInterceptor implements HandlerInterceptor {
|
||||
@Autowired
|
||||
private JwtUtil jwtUtil;
|
||||
|
||||
@Autowired
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||
|
||||
log.info("JwtInterceptor preHandle");
|
||||
String token = request.getHeader("Authorization");
|
||||
|
||||
if(StrUtil.isBlank(token)){
|
||||
response.setStatus(401);
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean verified = jwtUtil.verifyToken(token);
|
||||
if (!verified) {
|
||||
response.setStatus(401);
|
||||
return false;
|
||||
}
|
||||
|
||||
//从token中获取userid并存入threadlocal
|
||||
Long userId = jwtUtil.getUserIdFromToken(token);
|
||||
BaseContext.setId(userId);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||
BaseContext.removeId();
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.unilife.model.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class LoginVO {
|
||||
private Long id;
|
||||
private String username;
|
||||
private String nickname;
|
||||
private String avatar;
|
||||
private Byte role;
|
||||
private Byte isVerified;
|
||||
private Byte status;
|
||||
private String token;
|
||||
private String LoginIp;
|
||||
}
|
||||
|
@ -0,0 +1,15 @@
|
||||
package com.unilife.model.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class RegisterVO {
|
||||
private Long id;
|
||||
private String username;
|
||||
private String nickname;
|
||||
private String loginIp;
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
package com.unilife.service;
|
||||
|
||||
import com.unilife.model.dto.LoginDTO;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
@ -1,22 +1,19 @@
|
||||
package com.unilife.service;
|
||||
|
||||
import com.unilife.common.result.Result;
|
||||
import com.unilife.model.dto.LogDTO;
|
||||
import com.unilife.model.dto.LoginDTO;
|
||||
import com.unilife.model.dto.LoginEmailDTO;
|
||||
import com.unilife.model.dto.RegisterDTO;
|
||||
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
|
||||
public interface UserService {
|
||||
Result register(LoginDTO loginDTO, HttpServletRequest request);
|
||||
Result register(RegisterDTO registerDTO, HttpServletRequest request);
|
||||
|
||||
Result login(LogDTO logDTO, HttpServletRequest request);
|
||||
Result login(LoginDTO loginDTO,HttpServletRequest request);
|
||||
|
||||
Result sendVerificationCode(String email,HttpServletRequest request);
|
||||
|
||||
Result loginWithEmail(LoginEmailDTO loginEmailDTO, HttpServletRequest request);
|
||||
|
||||
|
||||
Result loginWithEmail(LoginEmailDTO loginEmailDTO,HttpServletRequest request);
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.unilife.utils;
|
||||
|
||||
public class BaseContext {
|
||||
|
||||
public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
|
||||
|
||||
public static void setId(Long id) {
|
||||
threadLocal.set(id);
|
||||
}
|
||||
|
||||
public static Long getId() {
|
||||
return threadLocal.get();
|
||||
}
|
||||
|
||||
public static void removeId() {
|
||||
threadLocal.remove();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.unilife.utils;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.jwt.JWTUtil;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class JwtUtil {
|
||||
@Value("${jwt.secret}")
|
||||
private String secret;
|
||||
|
||||
@Value("${jwt.expiration}")
|
||||
public long expiration;
|
||||
|
||||
public String generateToken(Long id) {
|
||||
DateTime now = DateTime.now();
|
||||
DateTime expireTime = new DateTime(now.getTime() + expiration * 1000);
|
||||
|
||||
Map<String, Object> payload = new HashMap<>();
|
||||
payload.put("userId", id);
|
||||
payload.put("created",now.getTime());
|
||||
return JWTUtil.createToken(payload,secret.getBytes());
|
||||
}
|
||||
|
||||
public boolean verifyToken(String token) {
|
||||
try{
|
||||
JWTUtil.verify(token,secret.getBytes());
|
||||
return true;
|
||||
}catch (Exception e){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public Long getUserIdFromToken(String token) {
|
||||
try {
|
||||
return (Long)JWTUtil.parseToken(token).getPayload("userId");
|
||||
}catch (Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
import request from '../utils/request';
|
||||
|
||||
// 用户注册
|
||||
export function register(data) {
|
||||
return request({
|
||||
url: '/auth/register',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 用户密码登录
|
||||
export function login(data) {
|
||||
return request({
|
||||
url: '/auth/login',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 获取邮箱验证码
|
||||
export function getEmailCode(data) {
|
||||
return request({
|
||||
url: '/auth/email/code',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
// 邮箱验证码登录
|
||||
export function loginWithCode(data) {
|
||||
return request({
|
||||
url: '/auth/login/code',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package com.unilife.model.vo;
|
||||
|
||||
import com.unilife.model.entity.User;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LogVO {
|
||||
private Integer id;
|
||||
private String username;
|
||||
private String nickname;
|
||||
private String avatar;
|
||||
private Byte role;
|
||||
private Byte isVerified;
|
||||
private Byte status;
|
||||
private String loginIp;
|
||||
|
||||
public LogVO(Integer id,String username,String nickname,String avatar,Byte role,Byte isVerified,Byte status,String loginIp)
|
||||
{
|
||||
this.id = id;
|
||||
this.username = username;
|
||||
this.nickname = nickname;
|
||||
this.avatar = avatar;
|
||||
this.role = role;
|
||||
this.isVerified = isVerified;
|
||||
this.status = status;
|
||||
this.loginIp = loginIp;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,19 +0,0 @@
|
||||
package com.unilife.model.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LoginVO {
|
||||
private Integer id;
|
||||
private String username;
|
||||
private String nickname;
|
||||
private String loginIp;
|
||||
|
||||
public LoginVO(Integer id, String username, String nickname,String loginIp)
|
||||
{
|
||||
this.id = id;
|
||||
this.username = username;
|
||||
this.nickname = nickname;
|
||||
this.loginIp = loginIp;
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 268 KiB |