ソースを参照

add(weChat-Operation)
[]

wangxiao1002 4 年 前
コミット
2dba0b4e16

+ 9 - 0
operation-backend/pom.xml

@@ -53,6 +53,15 @@
             <version>1.1.0</version>
         </dependency>
         <!--kaptcha end-->
+
+        <!--JWT start-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+        <!--JWT end-->
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>

+ 2 - 2
operation-backend/src/main/java/com/idiot/operationbackend/config/SwaggerConfiguration.java

@@ -35,9 +35,9 @@ public class SwaggerConfiguration {
 
     private ApiInfo apiInfo() {
         return new ApiInfoBuilder()
-                .title("微信公众号运营平台 RESTful APIs")
+                .title("微信公众号运营平台 RESTFUL APIs")
                 .description("weChat-Operation 微信公众号深度运营管理平台,提升用户体验感!")
-                .termsOfServiceUrl("http://localhost:8999/")
+                .termsOfServiceUrl("http://127.0.0.1:38090/wxoperate")
                 .contact(new Contact("wang xiao","www.github.com/wangxiao1002","Eo_xiao@163.com"))
                 .version("1.0")
                 .build();

+ 12 - 3
operation-backend/src/main/java/com/idiot/operationbackend/controller/AccountController.java

@@ -1,11 +1,14 @@
 package com.idiot.operationbackend.controller;
 
-import com.idiot.operationbackend.entity.OfficialAccount;
+import com.idiot.operationbackend.entity.Account;
+import com.idiot.operationbackend.service.facade.AccountService;
 import com.idiot.operationbackend.support.JsonResult;
+import com.idiot.operationbackend.util.JwtTokenUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestHeader;
@@ -26,10 +29,16 @@ public class AccountController {
     private final Logger logger = LoggerFactory.getLogger(AccountController.class);
 
 
+    @Autowired
+    private AccountService accountService;
+
     @GetMapping
     @ApiOperation(value = "查询公众号列表")
-    public ResponseEntity<JsonResult<List<OfficialAccount>>> list (@RequestHeader String token) {
-        logger.info("查询公众号列表");
+    public ResponseEntity<JsonResult<List<Account>>> list (@RequestHeader(value = "AUTH_TOKEN") String token) {
+
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}查询公众号列表",userId);
+        accountService.list();
         return null;
     }
 }

+ 4 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/AuthController.java

@@ -5,6 +5,7 @@ import com.idiot.operationbackend.entity.AuthUser;
 import com.idiot.operationbackend.service.facade.AuthUserService;
 import com.idiot.operationbackend.support.CustomException;
 import com.idiot.operationbackend.support.JsonResult;
+import com.idiot.operationbackend.util.JwtTokenUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -56,6 +57,8 @@ public class AuthController {
             throw new CustomException(500,"账号或者密码错误!请检查大小写");
         }
         authUser.setPassword("");
-        return ResponseEntity.ok(JsonResult.success(authUser));
+        String  token = JwtTokenUtil.sign(authUser.getNikeName(),authUser.getId());
+        return ResponseEntity.ok().header("AUTH_TOKEN",token)
+                .body(JsonResult.success(authUser));
     }
 }

+ 11 - 2
operation-backend/src/main/java/com/idiot/operationbackend/entity/OfficialAccount.java → operation-backend/src/main/java/com/idiot/operationbackend/entity/Account.java

@@ -11,7 +11,7 @@ import com.idiot.operationbackend.support.AccountState;
  * @date Created in 17:51 2020/9/10
  */
 @TableName("t_official_account")
-public class OfficialAccount {
+public class Account {
 
     @TableId
     private String id;
@@ -36,6 +36,8 @@ public class OfficialAccount {
 
     private AccountState state;
 
+    private String createUserId;
+
 
     /**
      * 粉丝数量
@@ -49,7 +51,6 @@ public class OfficialAccount {
     @TableField(exist = false)
     private Integer interactFansNum;
 
-
     public String getId() {
         return id;
     }
@@ -138,6 +139,14 @@ public class OfficialAccount {
         this.state = state;
     }
 
+    public String getCreateUserId() {
+        return createUserId;
+    }
+
+    public void setCreateUserId(String createUserId) {
+        this.createUserId = createUserId;
+    }
+
     public Integer getFansNum() {
         return fansNum;
     }

+ 2 - 2
operation-backend/src/main/java/com/idiot/operationbackend/mappers/OfficialAccountMapper.java → operation-backend/src/main/java/com/idiot/operationbackend/mappers/AccountMapper.java

@@ -1,11 +1,11 @@
 package com.idiot.operationbackend.mappers;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.idiot.operationbackend.entity.OfficialAccount;
+import com.idiot.operationbackend.entity.Account;
 
 /**
  * @author wang xiao
  * @date Created in 17:55 2020/9/10
  */
-public interface OfficialAccountMapper extends BaseMapper<OfficialAccount> {
+public interface AccountMapper extends BaseMapper<Account> {
 }

+ 2 - 2
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/OfficialAccountService.java → operation-backend/src/main/java/com/idiot/operationbackend/service/facade/AccountService.java

@@ -1,11 +1,11 @@
 package com.idiot.operationbackend.service.facade;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.idiot.operationbackend.entity.OfficialAccount;
+import com.idiot.operationbackend.entity.Account;
 
 /**
  * @author wang xiao
  * @date Created in 17:56 2020/9/10
  */
-public interface OfficialAccountService extends IService<OfficialAccount> {
+public interface AccountService extends IService<Account> {
 }

+ 16 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountServiceImpl.java

@@ -0,0 +1,16 @@
+package com.idiot.operationbackend.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.idiot.operationbackend.entity.Account;
+import com.idiot.operationbackend.mappers.AccountMapper;
+import com.idiot.operationbackend.service.facade.AccountService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author wang xiao
+ * @date Created in 17:56 2020/9/10
+ */
+@Service
+public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account>
+        implements AccountService {
+}

+ 0 - 16
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/OfficialAccountServiceImpl.java

@@ -1,16 +0,0 @@
-package com.idiot.operationbackend.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.idiot.operationbackend.entity.OfficialAccount;
-import com.idiot.operationbackend.mappers.OfficialAccountMapper;
-import com.idiot.operationbackend.service.facade.OfficialAccountService;
-import org.springframework.stereotype.Service;
-
-/**
- * @author wang xiao
- * @date Created in 17:56 2020/9/10
- */
-@Service
-public class OfficialAccountServiceImpl extends ServiceImpl<OfficialAccountMapper, OfficialAccount>
-        implements OfficialAccountService {
-}

+ 176 - 0
operation-backend/src/main/java/com/idiot/operationbackend/util/JwtTokenUtil.java

@@ -0,0 +1,176 @@
+package com.idiot.operationbackend.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.idiot.operationbackend.support.CustomException;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * jwt token 工具
+ * @author wang xiao
+ * @date Created in 19:50 2020/9/10
+ */
+public class JwtTokenUtil {
+
+    /**
+     * 过期时间为2小时
+     */
+    private static final long EXPIRE_TIME = 1000*60*60*2;
+
+    /**
+     * Token私钥
+     */
+    private static final String TOKEN_SECRET = "2fba06fd5a77b06a0cf04b9c0967e6d6";
+
+    /**
+     * 生成签名
+     * @param userName
+     * @param userId
+     */
+    public static String sign(String userName,String userId){
+        return createToken(userName, userId, EXPIRE_TIME,TimeUnit.MILLISECONDS,TOKEN_SECRET);
+    }
+
+    /**
+     * 生成签名
+     * @param userName
+     * @param userId
+     * @param expireTime
+     */
+    public static String sign(String userName,String userId,long expireTime){
+        return createToken(userName, userId, expireTime,TimeUnit.MILLISECONDS,TOKEN_SECRET);
+    }
+
+    public static String sign(String userName,String userId,long expireTime,String secret){
+        return createToken(userName, userId, expireTime,TimeUnit.MILLISECONDS,secret);
+    }
+    public static String sign(String userName,String userId,long expireTime,TimeUnit timeUnit){
+        return createToken(userName, userId, expireTime,timeUnit,TOKEN_SECRET);
+    }
+
+
+    /**
+     * 验证token
+     * @param token
+     * @return boolean
+     */
+    public static boolean verity(String token){
+        return verityToken(token, TOKEN_SECRET);
+    }
+
+    /**
+     * 验证token
+     * @param token
+     * @param secret
+     * @return boolean
+     */
+    public static boolean verity(String token,String secret){
+        return verityToken(token, secret);
+    }
+
+
+    /**
+     * 获取用户信息
+     * @param token
+     * @param secret
+     * @return String
+     */
+    public static String getUserId (String token,String secret) {
+        return resolvingToken(token, secret).get("userId").asString();
+    }
+    /**
+     * 获取用户信息
+     * @param token
+     * @return String
+     */
+    public static String getUserId (String token) {
+        return resolvingToken(token, TOKEN_SECRET).get("userId").asString();
+    }
+
+    /**
+     * 获取用户信息
+     * @param token
+     * @param secret
+     * @return String
+     */
+    public static String getUserName (String token,String secret) {
+        return resolvingToken(token, secret).get("userName").asString();
+    }
+    /**
+     * 获取用户信息
+     * @param token
+     * @return String
+     */
+    public static String getUserName (String token) {
+        return resolvingToken(token, TOKEN_SECRET).get("userName").asString();
+    }
+
+
+
+    /**
+     * 生成token
+     * @param userName 用户名称
+     * @param userId 用户id
+     * @param expireTime 过期时间
+     * @param timeUnit 时间
+     * @param secret 密钥
+     * @return String
+     */
+    private static String createToken(String userName, String userId, long expireTime, TimeUnit timeUnit,String secret){
+        expireTime = timeUnit.convert(expireTime,TimeUnit.MILLISECONDS);
+        Date date = new Date(System.currentTimeMillis() + expireTime);
+        Algorithm algorithm = Algorithm.HMAC256(secret);
+        HashMap<String,Object> header = new HashMap<>(2);
+        header.put("typ","JWT");
+        header.put("alg","HS256");
+        return JWT.create().withHeader(header).withClaim("userName",userName)
+                .withClaim("userId",userId).withExpiresAt(date).sign(algorithm);
+    }
+
+    /**
+     * 解析Token
+     * @param token
+     * @param secret
+     * @return
+     */
+    private static Map<String, Claim> resolvingToken(String token,String secret){
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTVerifier verifier = JWT.require(algorithm).build();
+            DecodedJWT jwt = verifier.verify(token);
+            return jwt.getClaims();
+        }catch (Exception e){
+            throw new CustomException(401,"token is disabled");
+        }
+    }
+
+    /**
+     * 验证token
+     * @param token
+     * @param secret
+     * @return
+     */
+    private static boolean verityToken(String token, String secret) {
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTVerifier verifier = JWT.require(algorithm).build();
+            DecodedJWT jwt = verifier.verify(token);
+            return true;
+        }catch (Exception e){
+            throw new CustomException(401,"token is disabled");
+        }
+    }
+
+
+
+
+
+
+}

+ 1 - 0
sql/dataBase.sql

@@ -33,6 +33,7 @@ CREATE TABLE `t_official_account`  (
   `qrcode_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '二维码图片的 URL',
   `state` tinyint(0) NULL DEFAULT NULL COMMENT '状态',
   `create_time` datetime(0) NULL DEFAULT NULL,
+  `create_user_id` varchar(20) NULL DEFAULT NULL COMMENT '创建人',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公众号' ROW_FORMAT = Dynamic;