Pārlūkot izejas kodu

适配远程调用

hexiao 1 gadu atpakaļ
vecāks
revīzija
8b82e519be

+ 19 - 0
api/src/main/java/com/ankaibei/workflow/api/LoginApi.java

@@ -0,0 +1,19 @@
+package com.ankaibei.workflow.api;
+
+import com.ankaibei.workflow.vo.LoginInfo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+@FeignClient(name = "loginApi", url = "${api-url:localhost:8077/api}")
+public interface LoginApi {
+
+
+    @PostMapping("/admin/upms/login/doLogin")
+    String doLogin (@RequestBody LoginInfo loginInfo);
+
+    @PostMapping("/admin/upms/login/doLogout")
+    String doLogout ();
+
+    @GetMapping("/admin/upms/login/getLoginInfo")
+    String getLoginInfo();
+}

+ 11 - 0
api/src/main/java/com/ankaibei/workflow/vo/LoginInfo.java

@@ -0,0 +1,11 @@
+package com.ankaibei.workflow.vo;
+
+import lombok.Data;
+
+@Data
+public class LoginInfo {
+
+    private String loginName;
+
+    private String password;
+}

+ 9 - 2
application-webadmin/pom.xml

@@ -5,12 +5,13 @@
         <groupId>com.ankaibei.workFlow</groupId>
         <groupId>com.ankaibei.workFlow</groupId>
         <artifactId>AnKaiBeiWorkFlow</artifactId>
         <artifactId>AnKaiBeiWorkFlow</artifactId>
         <version>1.0.0</version>
         <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
     </parent>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 
-    <artifactId>ankaibei-projectwebadmin</artifactId>
+    <artifactId>application-webadmin</artifactId>
     <version>1.0.0</version>
     <version>1.0.0</version>
-    <name>application</name>
+    <name>application-webadmin</name>
     <packaging>jar</packaging>
     <packaging>jar</packaging>
 
 
     <dependencies>
     <dependencies>
@@ -19,6 +20,12 @@
             <artifactId>spring-boot-starter-captcha</artifactId>
             <artifactId>spring-boot-starter-captcha</artifactId>
             <version>${ajcaptcha.version}</version>
             <version>${ajcaptcha.version}</version>
         </dependency>
         </dependency>
+
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>api</artifactId>
+            <version>1.0.0</version>
+        </dependency>
         <!-- aj-captcha 依赖data-redis作为缓存 -->
         <!-- aj-captcha 依赖data-redis作为缓存 -->
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>

+ 394 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/api/LoginApiService.java

@@ -0,0 +1,394 @@
+//package com.ankaibei.workFlow.webadmin.api;
+//
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.util.StrUtil;
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.alibaba.fastjson.serializer.SerializerFeature;
+//import com.ankaibei.workFlow.common.core.annotation.MyRequestBody;
+//import com.ankaibei.workFlow.common.core.annotation.NoAuthInterface;
+//import com.ankaibei.workFlow.common.core.constant.ApplicationConstant;
+//import com.ankaibei.workFlow.common.core.constant.ErrorCodeEnum;
+//import com.ankaibei.workFlow.common.core.object.CodeEnum;
+//import com.ankaibei.workFlow.common.core.object.ResMsg;
+//import com.ankaibei.workFlow.common.core.object.ResponseResult;
+//import com.ankaibei.workFlow.common.core.object.TokenData;
+//import com.ankaibei.workFlow.common.core.upload.BaseUpDownloader;
+//import com.ankaibei.workFlow.common.core.upload.UpDownloaderFactory;
+//import com.ankaibei.workFlow.common.core.upload.UploadResponseInfo;
+//import com.ankaibei.workFlow.common.core.upload.UploadStoreInfo;
+//import com.ankaibei.workFlow.common.core.util.*;
+//import com.ankaibei.workFlow.common.datafilter.config.DataFilterProperties;
+//import com.ankaibei.workFlow.common.log.annotation.OperationLog;
+//import com.ankaibei.workFlow.common.log.model.constant.SysOperationLogType;
+//import com.ankaibei.workFlow.common.online.api.config.OnlineApiProperties;
+//import com.ankaibei.workFlow.common.online.config.OnlineProperties;
+//import com.ankaibei.workFlow.common.online.model.OnlineDatasource;
+//import com.ankaibei.workFlow.common.online.service.OnlineDatasourceService;
+//import com.ankaibei.workFlow.common.online.util.OnlineUtil;
+//import com.ankaibei.workFlow.common.redis.cache.SessionCacheHelper;
+//import com.ankaibei.workFlow.webadmin.config.ApplicationConfig;
+//import com.ankaibei.workFlow.webadmin.upms.bo.SysMenuPerm;
+//import com.ankaibei.workFlow.webadmin.upms.controller.LoginController;
+//import com.ankaibei.workFlow.webadmin.upms.model.SysMenu;
+//import com.ankaibei.workFlow.webadmin.upms.model.SysUser;
+//import com.ankaibei.workFlow.webadmin.upms.model.SysUserPost;
+//import com.ankaibei.workFlow.webadmin.upms.model.SysUserRole;
+//import com.ankaibei.workFlow.webadmin.upms.model.constant.SysMenuType;
+//import com.ankaibei.workFlow.webadmin.upms.model.constant.SysOnlineMenuPermType;
+//import com.ankaibei.workFlow.webadmin.upms.model.constant.SysUserStatus;
+//import com.ankaibei.workFlow.webadmin.upms.model.constant.SysUserType;
+//import com.ankaibei.workFlow.webadmin.upms.service.*;
+//import com.ankaibei.workflow.api.LoginApi;
+//import io.swagger.annotations.ApiImplicitParam;
+//import io.swagger.annotations.ApiImplicitParams;
+//import org.redisson.api.RBucket;
+//import org.redisson.api.RedissonClient;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.security.crypto.password.PasswordEncoder;
+//import org.springframework.stereotype.Component;
+//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.multipart.MultipartFile;
+//
+//import javax.servlet.http.HttpServletResponse;
+//import java.net.URLDecoder;
+//import java.nio.charset.StandardCharsets;
+//import java.util.*;
+//import java.util.concurrent.TimeUnit;
+//import java.util.stream.Collectors;
+//
+//@Component
+//public class LoginApiService implements LoginApi {
+//    @Autowired
+//    private SysUserService sysUserService;
+//    @Autowired
+//    private SysMenuService sysMenuService;
+//    @Autowired
+//    private SysPermCodeService sysPermCodeService;
+//    @Autowired
+//    private SysPermService sysPermService;
+//    @Autowired
+//    private SysPostService sysPostService;
+//    @Autowired
+//    private SysRoleService sysRoleService;
+//    @Autowired
+//    private SysDataPermService sysDataPermService;
+//    @Autowired
+//    private SysPermWhitelistService sysPermWhitelistService;
+//    @Autowired
+//    private OnlineDatasourceService onlineDatasourceService;
+//    @Autowired
+//    private OnlineProperties onlineProperties;
+//    @Autowired
+//    private OnlineApiProperties onlineApiProperties;
+//    @Autowired
+//    private ApplicationConfig appConfig;
+//    @Autowired
+//    private RedissonClient redissonClient;
+//    @Autowired
+//    private SessionCacheHelper cacheHelper;
+//    @Autowired
+//    private PasswordEncoder passwordEncoder;
+//    @Autowired
+//    private UpDownloaderFactory upDownloaderFactory;
+//    @Autowired
+//    private DataFilterProperties dataFilterProperties;
+//
+//
+//
+//    @Override
+//    public String doLogin(String loginName, String password) {
+//        if (MyCommonUtil.existBlankArgument(loginName, password)) {
+//            return ResMsg.newInstance(CodeEnum.USER_NAME_PWD_NULL_CODE).toString();
+//        }
+//        String errorMessage;
+//        SysUser user = sysUserService.getSysUserByLoginName(loginName);
+//        try {
+//            password = URLDecoder.decode(password, StandardCharsets.UTF_8.name());
+//            // NOTE: 第一次使用时,请务必阅读ApplicationConstant.PRIVATE_KEY的代码注释。
+//            // 执行RsaUtil工具类中的main函数,可以生成新的公钥和私钥。
+//            password = RsaUtil.decrypt(password, ApplicationConstant.PRIVATE_KEY);
+//        } catch (Exception e) {
+//            return ResMsg.newInstance(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR).toString();
+//        }
+//        if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
+//            return ResMsg.error(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR.getCode(), CodeEnum.ACCOUNT_NO_PASSWORD_ERROR.toString()).toString();
+//        }
+//        if (user.getUserStatus() == SysUserStatus.STATUS_LOCKED) {
+//            errorMessage = "登录失败,用户账号被锁定!";
+//            return ResMsg.error(CodeEnum.INVALID_USER_STATUS.getCode(), errorMessage).toString();
+//        }
+//        JSONObject jsonData = this.buildLoginData(user);
+//        return ResMsg.newInstance(CodeEnum.OK, jsonData).toString();
+//    }
+//
+//
+//    public String doLogout() {
+//        String sessionId = TokenData.takeFromRequest().getSessionId();
+//        String sessionIdKey = RedisKeyUtil.makeSessionIdKey(sessionId);
+//        redissonClient.getBucket(sessionIdKey).delete();
+//        redissonClient.getBucket(RedisKeyUtil.makeSessionWhiteListPermKey(sessionId)).deleteAsync();
+//        String menuPermPattern = RedisKeyUtil.getSessionMenuPermPrefix(sessionId) + "*";
+//        redissonClient.getKeys().deleteByPatternAsync(menuPermPattern);
+//        sysDataPermService.removeDataPermCache(sessionId);
+//        sysPermService.removeUserSysPermCache(sessionId);
+//        cacheHelper.removeAllSessionCache(sessionId);
+//        return ResponseResult.success().toString();
+//    }
+//
+//
+//    public String getLoginInfo() {
+//        TokenData tokenData = TokenData.takeFromRequest();
+//        // 这里解释一下为什么没有缓存menuList和permCodeList。
+//        // 1. 该操作和权限验证不同,属于低频操作。
+//        // 2. 第一次登录和再次获取登录信息之间,如果修改了用户的权限,那么本次获取的是最新权限。
+//        // 3. 上一个问题无法避免,因为即便缓存也是有过期时间的,过期之后还是要从数据库获取的。
+//        JSONObject jsonData = new JSONObject();
+//        jsonData.put("showName", tokenData.getShowName());
+//        jsonData.put("isAdmin", tokenData.getIsAdmin());
+//        if (StrUtil.isNotBlank(tokenData.getHeadImageUrl())) {
+//            jsonData.put("headImageUrl", tokenData.getHeadImageUrl());
+//        }
+//        Collection<SysMenu> menuList;
+//        Collection<String> permCodeList;
+//        if (tokenData.getIsAdmin()) {
+//            menuList = sysMenuService.getAllListByOrder("showOrder");
+//            permCodeList = sysPermCodeService.getAllPermCodeList();
+//        } else {
+//            menuList = sysMenuService.getMenuListByUserId(tokenData.getUserId());
+//            permCodeList = sysPermCodeService.getPermCodeListByUserId(tokenData.getUserId());
+//        }
+//        menuList = menuList.stream().filter(m -> m.getMenuType() <= SysMenuType.TYPE_MENU).collect(Collectors.toList());
+//        jsonData.put("menuList", menuList);
+//        jsonData.put("permCodeList", permCodeList);
+//        return ResponseResult.success(jsonData).toString();
+//    }
+//
+//
+//
+//
+//    private JSONObject buildLoginData(SysUser user) {
+//        int deviceType = MyCommonUtil.getDeviceType();
+//        boolean isAdmin = user.getUserType() == SysUserType.TYPE_ADMIN;
+//        Map<String, Object> claims = new HashMap<>(3);
+//        String sessionId = user.getLoginName() + "_" + deviceType + "_" + MyCommonUtil.generateUuid();
+//        claims.put("sessionId", sessionId);
+//        String token = JwtUtil.generateToken(claims, appConfig.getExpiration(), appConfig.getTokenSigningKey());
+//        JSONObject jsonData = new JSONObject();
+//        jsonData.put(TokenData.REQUEST_ATTRIBUTE_NAME, token);
+//        jsonData.put("showName", user.getShowName());
+//        jsonData.put("isAdmin", isAdmin);
+//        if (StrUtil.isNotBlank(user.getHeadImageUrl())) {
+//            jsonData.put("headImageUrl", user.getHeadImageUrl());
+//        }
+//        TokenData tokenData = this.buildTokenData(user, sessionId, deviceType);
+//        this.putTokenDataToSessionCache(tokenData);
+//        // 这里手动将TokenData存入request,便于OperationLogAspect统一处理操作日志。
+//        TokenData.addToRequest(tokenData);
+//        Collection<SysMenu> allMenuList;
+//        Collection<String> permCodeList;
+//        if (isAdmin) {
+//            allMenuList = sysMenuService.getAllListByOrder("showOrder");
+//            permCodeList = sysPermCodeService.getAllPermCodeList();
+//        } else {
+//            allMenuList = sysMenuService.getMenuListByUserId(Long.parseLong(user.getUserId()));
+//            permCodeList = sysPermCodeService.getPermCodeListByUserId(Long.parseLong(user.getUserId()));
+//        }
+//        List<SysMenu> menuList = allMenuList.stream()
+//                .filter(m -> m.getMenuType() <= SysMenuType.TYPE_MENU).collect(Collectors.toList());
+//        //jsonData.put("menuList", menuList);
+//        //jsonData.put("permCodeList", permCodeList);
+//        Set<String> permSet = null;
+//        if (!isAdmin) {
+//            // 所有登录用户都有白名单接口的访问权限。
+//            List<String> whitelist = this.getAndCacheWhitelist(sessionId);
+//            permSet = new HashSet<>(whitelist);
+//            if (StrUtil.isNotBlank(tokenData.getRoleIds())) {
+//                List<Long> roleIds = StrUtil.split(tokenData.getRoleIds(), ',')
+//                        .stream().map(Long::valueOf).collect(Collectors.toList());
+//                Set<String> menuPermSet = this.getAndCacheMenuPermData(allMenuList, roleIds);
+//                permSet.addAll(menuPermSet);
+//            }
+//        }
+//        List<SysMenu> onlineMenuList = allMenuList.stream()
+//                .filter(m -> m.getOnlineFormId() != null && m.getMenuType().equals(SysMenuType.TYPE_BUTTON))
+//                .collect(Collectors.toList());
+//        LoginApiService.OnlinePermData onlinePermData = this.getAndCacheOnlineMenuPermData(allMenuList, onlineMenuList);
+//        permCodeList.addAll(onlinePermData.permCodeSet);
+//        if (!isAdmin) {
+//            permSet.addAll(onlinePermData.permUrlSet);
+//            // 缓存用户的权限资源
+//            sysPermService.putUserSysPermCache(sessionId, Long.parseLong(user.getUserId()), permSet);
+//            sysDataPermService.putDataPermCache(sessionId, Long.parseLong(user.getUserId()), user.getDeptId());
+//        }
+//        return jsonData;
+//    }
+//
+//    private TokenData buildTokenData(SysUser user, String sessionId, int deviceType) {
+//        TokenData tokenData = new TokenData();
+//        tokenData.setSessionId(sessionId);
+//        tokenData.setUserId(Long.parseLong(user.getUserId()));
+//        tokenData.setDeptId(user.getDeptId());
+//        tokenData.setLoginName(user.getLoginName());
+//        tokenData.setShowName(user.getShowName());
+//        tokenData.setIsAdmin(user.getUserType().equals(SysUserType.TYPE_ADMIN));
+//        tokenData.setLoginIp(IpUtil.getRemoteIpAddress(ContextUtil.getHttpRequest()));
+//        tokenData.setLoginTime(new Date());
+//        tokenData.setDeviceType(deviceType);
+//        tokenData.setHeadImageUrl(user.getHeadImageUrl());
+//        List<SysUserPost> userPostList = sysPostService.getSysUserPostListByUserId(user.getUserId());
+//        if (CollUtil.isNotEmpty(userPostList)) {
+//            Set<String> deptPostIdSet = userPostList.stream().map(SysUserPost::getDeptPostId).collect(Collectors.toSet());
+//            tokenData.setDeptPostIds(StrUtil.join(",", deptPostIdSet));
+//            Set<String> postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet());
+//            tokenData.setPostIds(StrUtil.join(",", postIdSet));
+//        }
+//        List<SysUserRole> userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId());
+//        if (CollUtil.isNotEmpty(userRoleList)) {
+//            Set<String> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
+//            tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet));
+//        }
+//        return tokenData;
+//    }
+//
+//    private void putTokenDataToSessionCache(TokenData tokenData) {
+//        String sessionIdKey = RedisKeyUtil.makeSessionIdKey(tokenData.getSessionId());
+//        String sessionData = JSON.toJSONString(tokenData, SerializerFeature.WriteNonStringValueAsString);
+//        RBucket<String> bucket = redissonClient.getBucket(sessionIdKey);
+//        bucket.set(sessionData);
+//        bucket.expire(appConfig.getSessionExpiredSeconds(), TimeUnit.SECONDS);
+//    }
+//
+//    private void putMenuPermToCache(String sessionId, SysMenuPerm menuPerm) {
+//        if (dataFilterProperties.getEnabledDataPermFilter()) {
+//            String menuPermKey = RedisKeyUtil.makeSessionMenuPermKey(sessionId, menuPerm.getMenuId());
+//            RBucket<String> cachedData = redissonClient.getBucket(menuPermKey);
+//            cachedData.set(JSON.toJSONString(menuPerm.getPermUrlSet()));
+//            cachedData.expire(appConfig.getSessionExpiredSeconds(), TimeUnit.SECONDS);
+//        }
+//    }
+//
+//    private List<String> getAndCacheWhitelist(String sessionId) {
+//        List<String> whitelistUrls = sysPermWhitelistService.getWhitelistPermList();
+//        if (dataFilterProperties.getEnabledDataPermFilter()) {
+//            // 白名单的数据缓存主要用户数据权限过滤是,如果菜单关联的权限中并不包含当前请求的url,则需要判断是否为白名单url。
+//            RBucket<String> cachedData = redissonClient.getBucket(RedisKeyUtil.makeSessionWhiteListPermKey(sessionId));
+//            cachedData.set(JSON.toJSONString(whitelistUrls));
+//            cachedData.expire(appConfig.getSessionExpiredSeconds(), TimeUnit.SECONDS);
+//        }
+//        return whitelistUrls;
+//    }
+//
+//    private Set<String> getAndCacheMenuPermData(Collection<SysMenu> allMenuList, List<Long> roleIds) {
+//        List<SysMenuPerm> allMenuPermList = MyModelUtil.copyCollectionTo(allMenuList, SysMenuPerm.class);
+//        allMenuPermList = allMenuPermList.stream()
+//                .filter(m -> m.getMenuType() != SysMenuType.TYPE_DIRECTORY).collect(Collectors.toList());
+//        Map<Long, SysMenuPerm> allMenuPermMap =
+//                allMenuPermList.stream().collect(Collectors.toMap(SysMenuPerm::getMenuId, m -> m));
+//        List<Map<String, Object>> menuPermDataList = sysMenuService.getMenuAndPermListByRoleIds(roleIds);
+//        // 将查询出的菜单权限数据,挂接到完整的菜单树上。
+//        for (Map<String, Object> menuPermData : menuPermDataList) {
+//            Long menuId = (Long) menuPermData.get("menuId");
+//            SysMenuPerm menuPerm = allMenuPermMap.get(menuId);
+//            menuPerm.getPermUrlSet().add(menuPermData.get("url").toString());
+//        }
+//        // 根据菜单的上下级关联关系,将菜单列表还原为菜单树。
+//        List<TreeNode<SysMenuPerm, Long>> menuTreeList =
+//                TreeNode.build(allMenuPermList, SysMenuPerm::getMenuId, SysMenuPerm::getParentId, null);
+//        Set<String> permSet = new HashSet<>();
+//        String sessionId = TokenData.takeFromRequest().getSessionId();
+//        // 递归菜单树上每个菜单节点,将子菜单关联的所有permUrlSet,都合并到一级菜单的permUrlSet中。
+//        for (TreeNode<SysMenuPerm, Long> treeNode : menuTreeList) {
+//            this.buildAllSubMenuPermUrlSet(treeNode.getChildList(), treeNode.getData().getPermUrlSet());
+//            permSet.addAll(treeNode.getData().getPermUrlSet());
+//            this.putMenuPermToCache(sessionId, treeNode.getData());
+//        }
+//        return permSet;
+//    }
+//
+//    private void buildAllSubMenuPermUrlSet(List<TreeNode<SysMenuPerm, Long>> subList, Set<String> rootPermUrlSet) {
+//        for (TreeNode<SysMenuPerm, Long> treeNode : subList) {
+//            rootPermUrlSet.addAll(treeNode.getData().getPermUrlSet());
+//            if (CollUtil.isNotEmpty(treeNode.getChildList())) {
+//                this.buildAllSubMenuPermUrlSet(treeNode.getChildList(), rootPermUrlSet);
+//            }
+//        }
+//    }
+//
+//    private LoginApiService.OnlinePermData getAndCacheOnlineMenuPermData(Collection<SysMenu> allMenuList, List<SysMenu> onlineMenuList) {
+//        LoginApiService.OnlinePermData permData = new LoginApiService.OnlinePermData();
+//        if (CollUtil.isEmpty(onlineMenuList)) {
+//            return permData;
+//        }
+//        List<SysMenuPerm> allMenuPermList = MyModelUtil.copyCollectionTo(allMenuList, SysMenuPerm.class);
+//        List<SysMenuPerm> onlineMenuPermList = allMenuPermList.stream()
+//                .filter(m -> m.getOnlineFormId() != null
+//                        && m.getOnlineFlowEntryId() == null
+//                        && m.getMenuType().equals(SysMenuType.TYPE_MENU))
+//                .collect(Collectors.toList());
+//        Map<Long, List<SysMenuPerm>> onlineMenuPermMap =
+//                onlineMenuPermList.stream().collect(Collectors.groupingBy(SysMenuPerm::getOnlineFormId));
+//        this.buildOnlinePermData(onlineMenuList, onlineMenuPermMap, permData);
+//        // 这个非常非常重要,不能删除。因为在线票单的url前缀是可以配置的,那么表单字典接口的url也是动态。
+//        // 所以就不能把这个字典列表接口放到数据库的白名单表中。
+//        List<String> onlineWhitelistUrls = CollUtil.newArrayList(
+//                onlineProperties.getOperationUrlPrefix() + "/onlineOperation/listDict",
+//                onlineApiProperties.getUrlPrefix() + "/onlineForm/render",
+//                onlineApiProperties.getUrlPrefix() + "/onlineForm/view");
+//        String sessionId = TokenData.takeFromRequest().getSessionId();
+//        for (SysMenuPerm menuPerm : onlineMenuPermList) {
+//            menuPerm.getPermUrlSet().addAll(onlineWhitelistUrls);
+//            this.putMenuPermToCache(sessionId, menuPerm);
+//        }
+//        permData.permUrlSet.addAll(onlineWhitelistUrls);
+//        return permData;
+//    }
+//
+//    private void buildOnlinePermData(
+//            List<SysMenu> onlineMenuList, Map<Long, List<SysMenuPerm>> onlineMenuPermMap, LoginApiService.OnlinePermData permData) {
+//        List<SysMenu> viewMenuList = onlineMenuList.stream()
+//                .filter(m -> m.getOnlineMenuPermType() == SysOnlineMenuPermType.TYPE_VIEW)
+//                .collect(Collectors.toList());
+//        if (CollUtil.isNotEmpty(viewMenuList)) {
+//            Set<Long> formIdSet = viewMenuList.stream().map(SysMenu::getOnlineFormId).collect(Collectors.toSet());
+//            List<OnlineDatasource> datasourceList =
+//                    onlineDatasourceService.getOnlineDatasourceListByFormIds(formIdSet);
+//            for (OnlineDatasource datasource : datasourceList) {
+//                permData.permCodeSet.add(OnlineUtil.makeViewPermCode(datasource.getVariableName()));
+//                Set<String> permUrls = onlineProperties.getViewUrlList().stream()
+//                        .map(url -> url + datasource.getVariableName()).collect(Collectors.toSet());
+//                permData.permUrlSet.addAll(permUrls);
+//                List<SysMenuPerm> menuPermList = onlineMenuPermMap.get(datasource.getOnlineFormDatasource().getFormId());
+//                for (SysMenuPerm menuPerm : menuPermList) {
+//                    menuPerm.getPermUrlSet().addAll(permUrls);
+//                }
+//            }
+//        }
+//        List<SysMenu> editMenuList = onlineMenuList.stream()
+//                .filter(m -> m.getOnlineMenuPermType() == SysOnlineMenuPermType.TYPE_EDIT)
+//                .collect(Collectors.toList());
+//        if (CollUtil.isNotEmpty(editMenuList)) {
+//            Set<Long> formIdSet = editMenuList.stream().map(SysMenu::getOnlineFormId).collect(Collectors.toSet());
+//            List<OnlineDatasource> datasourceList =
+//                    onlineDatasourceService.getOnlineDatasourceListByFormIds(formIdSet);
+//            for (OnlineDatasource datasource : datasourceList) {
+//                permData.permCodeSet.add(OnlineUtil.makeEditPermCode(datasource.getVariableName()));
+//                Set<String> permUrls = onlineProperties.getEditUrlList().stream()
+//                        .map(url -> url + datasource.getVariableName()).collect(Collectors.toSet());
+//                permData.permUrlSet.addAll(permUrls);
+//                List<SysMenuPerm> menuPermList = onlineMenuPermMap.get(datasource.getOnlineFormDatasource().getFormId());
+//                for (SysMenuPerm menuPerm : menuPermList) {
+//                    menuPerm.getPermUrlSet().addAll(permUrls);
+//                }
+//            }
+//        }
+//    }
+//
+//    static class OnlinePermData {
+//        public final Set<String> permCodeSet = new HashSet<>();
+//        public final Set<String> permUrlSet = new HashSet<>();
+//    }
+//}

+ 3 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/interceptor/AuthenticationInterceptor.java

@@ -51,6 +51,9 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
             throws Exception {
             throws Exception {
         String url = request.getRequestURI();
         String url = request.getRequestURI();
         log.info("拦截**请求路径:{}",url);
         log.info("拦截**请求路径:{}",url);
+        if(url.startsWith("/api/foreign") || url.startsWith("/api/error")){
+            return true;
+        }
         String token = this.getTokenFromRequest(request);
         String token = this.getTokenFromRequest(request);
         boolean noLoginUrl = this.isNoAuthInterface(handler);
         boolean noLoginUrl = this.isNoAuthInterface(handler);
         // 如果接口方法标记NoAuthInterface注解,可以直接跳过Token鉴权验证,这里主要为了测试接口方便
         // 如果接口方法标记NoAuthInterface注解,可以直接跳过Token鉴权验证,这里主要为了测试接口方便

+ 10 - 5
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/upms/controller/LoginController.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.ankaibei.workflow.api.LoginApi;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParam;
@@ -119,16 +120,20 @@ public class LoginController {
             @MyRequestBody String loginName,
             @MyRequestBody String loginName,
             @MyRequestBody String password
             @MyRequestBody String password
             //@MyRequestBody String captchaVerification
             //@MyRequestBody String captchaVerification
-    ) throws Exception {
+    ) {
         if (MyCommonUtil.existBlankArgument(loginName, password)) {
         if (MyCommonUtil.existBlankArgument(loginName, password)) {
             return ResMsg.newInstance(CodeEnum.USER_NAME_PWD_NULL_CODE);
             return ResMsg.newInstance(CodeEnum.USER_NAME_PWD_NULL_CODE);
         }
         }
         String errorMessage;
         String errorMessage;
         SysUser user = sysUserService.getSysUserByLoginName(loginName);
         SysUser user = sysUserService.getSysUserByLoginName(loginName);
-        password = URLDecoder.decode(password, StandardCharsets.UTF_8.name());
-        // NOTE: 第一次使用时,请务必阅读ApplicationConstant.PRIVATE_KEY的代码注释。
-        // 执行RsaUtil工具类中的main函数,可以生成新的公钥和私钥。
-        password = RsaUtil.decrypt(password, ApplicationConstant.PRIVATE_KEY);
+        try {
+            password = URLDecoder.decode(password, StandardCharsets.UTF_8.name());
+            // NOTE: 第一次使用时,请务必阅读ApplicationConstant.PRIVATE_KEY的代码注释。
+            // 执行RsaUtil工具类中的main函数,可以生成新的公钥和私钥。
+            password = RsaUtil.decrypt(password, ApplicationConstant.PRIVATE_KEY);
+        } catch (Exception e) {
+            return ResMsg.newInstance(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR);
+        }
         if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
         if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
             return ResMsg.error(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR.getCode(), CodeEnum.ACCOUNT_NO_PASSWORD_ERROR.toString());
             return ResMsg.error(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR.getCode(), CodeEnum.ACCOUNT_NO_PASSWORD_ERROR.toString());
         }
         }

+ 1 - 1
application-webadmin/src/main/resources/application.yml

@@ -3,7 +3,7 @@ logging:
     # 这里设置的日志级别优先于logback-spring.xml文件Loggers中的日志级别。
     # 这里设置的日志级别优先于logback-spring.xml文件Loggers中的日志级别。
     com.ankaibei.workFlow: info
     com.ankaibei.workFlow: info
   config: classpath:logback-spring.xml
   config: classpath:logback-spring.xml
-
+akb-service: localhost:${server.port}${server.servlet.context-path}
 server:
 server:
   port: 8077
   port: 8077
   tomcat:
   tomcat:

+ 1 - 0
common/pom.xml

@@ -5,6 +5,7 @@
         <groupId>com.ankaibei.workFlow</groupId>
         <groupId>com.ankaibei.workFlow</groupId>
         <artifactId>AnKaiBeiWorkFlow</artifactId>
         <artifactId>AnKaiBeiWorkFlow</artifactId>
         <version>1.0.0</version>
         <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
     </parent>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 

+ 1 - 0
framework/pom.xml

@@ -5,6 +5,7 @@
         <groupId>com.ankaibei.workFlow</groupId>
         <groupId>com.ankaibei.workFlow</groupId>
         <artifactId>AnKaiBeiWorkFlow</artifactId>
         <artifactId>AnKaiBeiWorkFlow</artifactId>
         <version>1.0.0</version>
         <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
     </parent>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 

+ 41 - 0
pom.xml

@@ -48,6 +48,7 @@
         <module>application-webadmin</module>
         <module>application-webadmin</module>
         <module>common</module>
         <module>common</module>
         <module>framework</module>
         <module>framework</module>
+        <module>api</module>
     </modules>
     </modules>
 
 
     <dependencies>
     <dependencies>
@@ -206,4 +207,44 @@
             </plugin>
             </plugin>
         </plugins>
         </plugins>
     </build>
     </build>
+
+    <repositories>
+        <repository>
+            <id>custom_group</id>
+            <name>Nexus Repository</name>
+            <url>http://124.71.171.71:18881/repository/custom_group/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>custom_group</id>
+            <name>Nexus Plugin Repository</name>
+            <url>http://124.71.171.71:18881/repository/custom_group/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </pluginRepository>
+    </pluginRepositories>
+    <!--项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件jar等部署到远程仓库。 -->
+    <distributionManagement>
+        <repository><!--部署项目产生的构件到远程仓库需要的信息 -->
+            <id>custom_releases</id><!-- 此处id和settings.xml的id保持一致 -->
+            <name>Nexus Release Repository</name>
+            <url>http://124.71.171.71:18881/repository/custom_releases/</url>
+        </repository>
+        <snapshotRepository><!--构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见distributionManagement/repository元素 -->
+            <id>custom_snapshots</id><!-- 此处id和settings.xml的id保持一致 -->
+            <name>Nexus Snapshot Repository</name>
+            <url>http://124.71.171.71:18881/repository/custom_snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
 </project>
 </project>