Kaynağa Gözat

看板小程序登录接口

zuy 2 yıl önce
ebeveyn
işleme
66b06112e8

+ 7 - 0
admin/pom.xml

@@ -49,6 +49,13 @@
             <version>1.6.2</version>
         </dependency>
 
+<!--运营看板小程序-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>4.5.0</version>
+        </dependency>
+
     </dependencies>
 
     <properties>

+ 37 - 0
admin/src/main/java/com/kym/admin/config/WxKanbanConfig.java

@@ -0,0 +1,37 @@
+package com.kym.admin.config;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * 微信运营看板小程序配置
+ */
+@Configuration
+public class WxKanbanConfig {
+
+    @Value("${wechat.kanban.appid}")
+    private String appid;
+
+
+    @Value("${wechat.kanban.secret}")
+    private String secret;
+
+    @Value("${wechat.kanban.token}")
+    private String token;
+
+    @Bean("kanbanWxMaService")
+    public WxMaService kanbanWxMaService() {
+        WxMaServiceImpl impl = new WxMaServiceImpl();
+        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+        config.setAppid(appid);
+        config.setSecret(secret);
+        config.setToken(token);
+        impl.setWxMaConfig(config);
+        return impl;
+    }
+}

+ 69 - 0
admin/src/main/java/com/kym/admin/controller/WxKanbanController.java

@@ -0,0 +1,69 @@
+package com.kym.admin.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import com.kym.common.R;
+import com.kym.common.controller.IController;
+import com.kym.entity.admin.AdminUser;
+import com.kym.service.admin.AdminUserService;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 微信看板小程序
+ * 登录控制器
+ */
+@Slf4j
+@RestController
+@RequestMapping("/wx")
+public class WxKanbanController extends IController {
+
+    private final WxMaService wxMaService;
+
+    private final AdminUserService adminUserService;
+
+
+    public WxKanbanController(@Qualifier("kanbanWxMaService") WxMaService wxMaService, AdminUserService adminUserService) {
+        this.wxMaService = wxMaService;
+        this.adminUserService = adminUserService;
+    }
+
+    @RequestMapping("getUnionId")
+    public R<?> getUnionId(String code) throws WxErrorException {
+        WxMaJscode2SessionResult result = wxMaService.jsCode2SessionInfo(code);
+        return R.success(result);
+    }
+
+    /**
+     * 获取微信手机号
+     * @param code
+     * @return
+     * @throws WxErrorException
+     */
+    @RequestMapping("getPhoneNumber")
+    public R<?> getPhoneNumber(String code) throws WxErrorException {
+        WxMaPhoneNumberInfo result = wxMaService.getUserService().getPhoneNoInfo(code);
+        return R.success(result);
+    }
+
+
+    @PostMapping("login")
+    public R<?> login(@RequestBody AdminUser  user) {
+        return resp(()->adminUserService.wxLogin(user));
+    }
+
+    @PostMapping("loginByUnion")
+    public R<?> loginByUnion(@RequestBody AdminUser  user) {
+        return resp(()->adminUserService.loginByUnion(user));
+    }
+
+
+
+}

+ 0 - 3
admin/src/main/java/com/kym/admin/jobs/ActivityDelayJob.java

@@ -12,11 +12,8 @@ import com.kym.service.admin.RechargeRightsService;
 import com.kym.service.jobs.DelayService;
 import com.kym.service.jobs.DelayedItem;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Scope;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
-import org.springframework.stereotype.Service;
 
 import java.util.concurrent.DelayQueue;
 import java.util.concurrent.ExecutorService;

+ 6 - 0
admin/src/main/resources/application-dev.yml

@@ -36,6 +36,12 @@ wechat:
     aesKey: #微信小程序消息服务器配置的EncodingAESKey
     msgDataFormat: JSON
 
+#运营看板小程序
+  kanban:
+    appid: wx369fcff95d387bde
+    secret: e36560b99afd5f744754cd09e8f6cc2a
+    token:
+
   fapiao:
     baseInformation: https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/merchant/base-information
     taxCodes: https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/merchant/tax-codes

+ 10 - 0
entity/src/main/java/com/kym/entity/admin/AdminUser.java

@@ -25,6 +25,9 @@ import java.time.LocalDateTime;
 @Accessors(chain = true)
 public class AdminUser extends BaseEntity implements Serializable {
 
+    public static final int STATUS_禁用=0;
+    public static final  int STATUS_启用=1;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -68,4 +71,11 @@ public class AdminUser extends BaseEntity implements Serializable {
      */
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime lastLoginTime;
+
+
+    /**
+     * 微信小程序unionid
+     */
+    private String unionId;
+
 }

+ 2 - 1
mapper/src/main/resources/mappers/admin/AdminUserMapper.xml

@@ -10,6 +10,7 @@
         <result column="password" property="password" />
         <result column="nickname" property="nickname" />
         <result column="mobile_phone" property="mobilePhone" />
+        <result column="union_id" property="unionId" />
         <result column="avatar" property="avatar" />
         <result column="status" property="status" />
         <result column="create_time" property="createTime" />
@@ -34,7 +35,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, username, password, nickname, mobile_phone, avatar, status, create_time, update_time, last_login_time
+        id, company_id, username, password, nickname, mobile_phone,union_id, avatar, status, create_time, update_time, last_login_time
     </sql>
 
     <select id="listUserPermissions" resultMap="AdminUserVoMap" parameterType="java.lang.Long">

+ 4 - 0
service/src/main/java/com/kym/service/admin/AdminUserService.java

@@ -39,4 +39,8 @@ public interface AdminUserService extends MPJBaseService<AdminUser> {
     void updateAdminUser(AdminUserVo adminUserVo);
 
     PageBean<?> listUser(CommonQueryParam params);
+
+    Object wxLogin(AdminUser user);
+
+    Object loginByUnion(AdminUser user);
 }

+ 65 - 0
service/src/main/java/com/kym/service/admin/impl/AdminUserServiceImpl.java

@@ -173,4 +173,69 @@ public class AdminUserServiceImpl extends MPJBaseServiceImpl<AdminUserMapper, Ad
                 .list();
         return new PageBean<>(list);
     }
+
+    @Override
+    public Object wxLogin(AdminUser user) {
+        CommUtil.asserts(CommUtil.isNotEmptyAndNull(user.getUnionId()), "微信账户信息错误");
+
+        var adminUser = lambdaQuery()
+                .eq(AdminUser::getUnionId, user.getUnionId())
+                .eq(AdminUser::getMobilePhone, user.getMobilePhone())
+                .eq(AdminUser::getStatus, AdminUser.STATUS_启用).one();
+        if (null == adminUser) {
+            //判断是否已有手机账号存在,有则自动绑定union id,无则创建账号
+            adminUser = lambdaQuery()
+                    .eq(AdminUser::getMobilePhone, user.getMobilePhone())
+                    .eq(AdminUser::getStatus, AdminUser.STATUS_启用).one();
+            if (null != adminUser) {
+                adminUser.setUnionId(user.getUnionId());
+            } else {
+                //自动注册
+                CommUtil.asserts(CommUtil.isNotEmptyAndNull(user.getMobilePhone()), "手机号不能为空");
+                adminUser = new AdminUser();
+                adminUser.setId(IDGenerator.INS().nextId());
+                adminUser.setUnionId(user.getUnionId());
+                adminUser.setStatus(AdminUser.STATUS_启用);
+                adminUser.setMobilePhone(user.getMobilePhone());
+                adminUser.setUsername(user.getMobilePhone());
+                adminUser.setLastLoginTime(LocalDateTime.now());
+                adminUser.setUpdateTime(LocalDateTime.now());
+                this.save(adminUser);
+            }
+        }
+        StpUtil.login(adminUser.getId());
+        // 用户名存入session,统一日志读取使用
+        StpUtil.getSession().set("mobilePhone", adminUser.getMobilePhone());
+        StpUtil.getSession().set("username", adminUser.getUsername());
+        user.setLastLoginTime(LocalDateTime.now());
+        user.setMobilePhone(user.getMobilePhone());
+        this.updateById(adminUser);
+        LOGGER.info("微信用户union:{},name:{},phone:{},id:{}登录", adminUser.getUnionId(), adminUser.getUsername(), adminUser.getMobilePhone(), adminUser.getId());
+        // token在cookie中有隐式返回,这里多做显式返回
+        user.setPassword(null);
+        user.setUnionId(null);
+        return Map.of("user", user, "satoken", StpUtil.getTokenValue());
+    }
+
+    @Override
+    public Object loginByUnion(AdminUser user) {
+        CommUtil.asserts(CommUtil.isNotEmptyAndNull(user.getUnionId()), "微信账户信息错误");
+        var adminUser = lambdaQuery()
+                .eq(AdminUser::getUnionId, user.getUnionId())
+                .eq(AdminUser::getStatus, AdminUser.STATUS_启用).one();
+        if(null==adminUser){
+            return Map.of("user", adminUser);
+        }else{
+            StpUtil.login(adminUser.getId());
+            // 用户名存入session,统一日志读取使用
+            StpUtil.getSession().set("mobilePhone", adminUser.getMobilePhone());
+            StpUtil.getSession().set("username", adminUser.getUsername());
+            user.setLastLoginTime(LocalDateTime.now());
+            user.setMobilePhone(user.getMobilePhone());
+            this.updateById(adminUser);
+            user.setPassword(null);
+            user.setUnionId(null);
+            return Map.of("user", user, "satoken", StpUtil.getTokenValue());
+        }
+    }
 }