MinaUserController.java 6.0 KB
Newer Older
苗卫卫 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
package com.boco.nbd.wios.wx.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import com.boco.nbd.wios.manage.entity.bo.LoginInfo;
import com.boco.nbd.wios.manage.entity.bo.RoleBo;
import com.boco.nbd.wios.manage.service.impl.AccountService;
import com.boco.nbd.wios.manage.service.impl.RoleService;
import com.boco.nbd.wios.wx.utils.WeChatSessionKeyUtils;
import com.boco.nbd.wios.wx.vo.MinaLoginInfo;
import com.ihidea.component.api.v2.BaseResponse;
import com.ihidea.core.support.exception.ServiceException;
import com.ihidea.core.util.BeanUtilsEx;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;

/**
 * @author kevin
 * @create 2020/10/28 20:59
 */
@Api(tags = "微信小程序用户相关接口")
@RestController
@RequestMapping("/mina")
@ApiIgnore
public class MinaUserController {

    private static final String MINA_MENU="mina";

    @Autowired
    private AccountService accountService;

    @Autowired
    private RoleService roleService;


    @PostMapping(value = "/getOpenIdByCode")
    @ApiOperation(value = "根据code获取openId")
    @ApiImplicitParams({@ApiImplicitParam(name = "code", value = "微信code", dataType = "String", paramType = "query", required = true)})
  	public BaseResponse<String> getOpenIdByCode(String code) {
        String openId = null;
        if(StringUtils.isNotBlank(code)){
            openId = WeChatSessionKeyUtils.getOpenIdForWxInstant(code);
            if (StringUtils.isBlank(openId)) {
                throw new ServiceException("使用微信登陆失败,请刷新页面或重新进入");
            }
        }
        return new BaseResponse<>(openId);
  	}

    /**
     * 账号密码登录
     *
     * 登录的用户可能是区域工程经理、安装服务商员工(角色不固定),角色不同会导致订单查看范围不同
     * 0. 判断账号和密码是否匹配, 检查是否有小程序权限
     *
     * 后续查询订单
     * 1. 判断是否是区域工程经理角色(ROLE_ID:5)
     * 2. 如果是区域工程经理,根据负责的区域编号查询订单
     * 3. 如果是安装服务商员工,根据数据权限是个人还是全部来查询订单
     * 4. 查询订单数据范围(区域regionId,安装服务商supplierId, 员工staffId)
     *
     * 也就是登录成功后,需要返回当前用户角色和小程序按钮权限
     *
     * @param account
     * @param password
     * @return
     */
    @PostMapping(value = "/staff/login")
    @ApiOperation(value = "员工账号+密码登录")
    @ApiImplicitParams({@ApiImplicitParam(name = "account", value = "账号(手机号码)", dataType = "String", paramType = "query", required = true), 
    	@ApiImplicitParam(name = "password", value = "密码(手机端md5加密)", dataType = "String", paramType = "query", required = true)})
    public BaseResponse<MinaLoginInfo> login(String account, String password) throws Exception {

        LoginInfo loginInfo = accountService.loginMina(account, password);
        return new BaseResponse<>(convertLoginInfo(loginInfo));
    }

    /**
     * 一般登录信息转换为小程序登录信息
     * @param loginInfo
     * @return
     * @throws Exception
     */
    private MinaLoginInfo convertLoginInfo(LoginInfo loginInfo) throws Exception{
        MinaLoginInfo minaLoginInfo=BeanUtilsEx.copyPropertiesUnConvert(loginInfo, MinaLoginInfo.class);
        minaLoginInfo=getPermission(minaLoginInfo);
        Assert.notNull(minaLoginInfo.getCurrRoleId(), "无权限,请联系管理员开通权限");
        return minaLoginInfo;
    }

    private MinaLoginInfo getPermission(MinaLoginInfo minaLoginInfo){
        // 判断当前用户是否具有小程序权限
        List<RoleBo> roles=roleService.findMinaRoleMenu(minaLoginInfo.getAccountId());
        if(CollUtil.isNotEmpty(roles)){
            roles.forEach((role)->{
                if(StringUtils.contains(role.getMenuIds(), MINA_MENU)){
                    minaLoginInfo.setCurrRoleId(role.getId());
                    minaLoginInfo.setCurrRoleName(role.getName());
                    minaLoginInfo.setMenus(role.getMenuIds());
                    return;
                }
            });
        }
        return minaLoginInfo;
    }

    @GetMapping(value = "/staff/permission")
    @ApiOperation(value = "获取权限")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "accountId", value = "账号编号", dataType = "int", paramType = "query", required = true),
    })
    public BaseResponse<MinaLoginInfo> getPermissionByAccountId(Integer accountId) throws Exception{
        MinaLoginInfo minaLoginInfo=new MinaLoginInfo();
        minaLoginInfo.setAccountId(accountId);

        return new BaseResponse<>(getPermission(minaLoginInfo));
    }

    @PostMapping(value = "/staff/loginByWx")
    @ApiOperation(value = "微信授权手机号码登录")
    @ApiImplicitParams({@ApiImplicitParam(name = "openId", value = "微信openId", dataType = "String", paramType = "query", required = true), 
    	@ApiImplicitParam(name = "encryptedData", value = "包括敏感数据在内的完整用户信息的加密数据", dataType = "String", paramType = "query", required = true),
    	@ApiImplicitParam(name = "iv", value = "加密算法的初始向量", dataType = "String", paramType = "query", required = true)})
    public BaseResponse<MinaLoginInfo> loginByWx(String openId, String encryptedData, String iv) throws Exception{
        return new BaseResponse<>(convertLoginInfo(accountService.loginMinaByWx(openId, encryptedData, iv)));
    }
}