Merge branch 'cc_20230520_partner' of http://gitlab.coolcollege.cn/hangzhou/java/coolstore-partner-manage into cc_20230520_partner

# Conflicts:
#	coolstore-partner-webb/src/main/java/com/cool/store/config/TokenValidateFilter.java
This commit is contained in:
pserimal
2023-06-09 13:44:21 +08:00
47 changed files with 1128 additions and 347 deletions

View File

@@ -16,7 +16,7 @@ public class CommonConstants {
public static final String DEFAULT_AVATAR = "DefaultAvatar"; public static final String DEFAULT_AVATAR = "DefaultAvatar";
public static final int ACTION_TOKEN_EXPIRE = 14400; public static final int ACCESS_TOKEN_EXPIRE = 14400;
public static final int REFRESH_TOKEN_EXPIRE = 60*60*24*30; public static final int REFRESH_TOKEN_EXPIRE = 60*60*24*30;
@@ -74,6 +74,8 @@ public class CommonConstants {
public static final String DELETE_DEPT_ID = "-1"; public static final String DELETE_DEPT_ID = "-1";
public static final String AI_USER_ID = "a100000001"; public static final String AI_USER_ID = "a100000001";
public static final long ZERO_LONG = 0L;
public static final int ZERO = 0; public static final int ZERO = 0;
public static final int ONE = 1; public static final int ONE = 1;
public static final int TWO = 2; public static final int TWO = 2;

View File

@@ -0,0 +1,31 @@
package com.cool.store.enums;
/**
* @author zhangchenbiao
* @FileName: MentTypeEnum
* @Description:
* @date 2021-09-23 17:59
*/
public enum MenuTypeEnum {
MENU(1,"菜单"),
AUTH(2,"权限");
private Integer code;
private String message;
MenuTypeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,43 @@
package com.cool.store.enums;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author zhangchenbiao
* @FileName: PlatFormTypeEnum
* @Description:
* @date 2023-06-08 16:43
*/
public enum PlatFormTypeEnum {
/**
* 菜单类型
*/
PC("PC","pc端菜单"),
;
private String code;
private String msg;
protected static final Map<String, PlatFormTypeEnum> map = Arrays.stream(values()).collect(
Collectors.toMap(PlatFormTypeEnum::getCode, Function.identity()));
PlatFormTypeEnum(String code, String msg){
this.code=code;
this.msg=msg;
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
public static PlatFormTypeEnum getByCode(String code) {
return map.get(code);
}
}

View File

@@ -0,0 +1,26 @@
package com.cool.store.dao;
import com.cool.store.entity.SysMenuDO;
import com.cool.store.mapper.SysMenuMapper;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: SysMenuDAO
* @Description:
* @date 2023-06-08 16:41
*/
@Repository
public class SysMenuDAO {
@Resource
private SysMenuMapper sysMenuMapper;
public List<SysMenuDO> selectMenuAll(List<Long> parentIds, String platformType){
return sysMenuMapper.selectMenuAll(parentIds, platformType);
}
}

View File

@@ -0,0 +1,29 @@
package com.cool.store.mapper;
import com.cool.store.entity.SysMenuDO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author zhangchenbiao
* @date 2023-06-08 04:38
*/
public interface SysMenuMapper {
/**
*
* 默认插入方法,只会给有值的字段赋值
* 会对传进来的字段做判空处理如果字段为空则使用数据库默认字段或者null
* dateTime:2023-06-08 04:38
*/
int insertSelective(SysMenuDO record);
/**
*
* 默认更新方法根据主键更新不会把null值更新到数据库避免覆盖之前有值的
* dateTime:2023-06-08 04:38
*/
int updateByPrimaryKeySelective(SysMenuDO record);
List<SysMenuDO> selectMenuAll(@Param("list") List<Long> parentIds, @Param("platformType") String platformType);
}

View File

@@ -162,7 +162,7 @@
</trim> </trim>
ON DUPLICATE KEY UPDATE user_id = values(user_id), name = values(name), remark = values(remark), mobile = values(mobile), email = values(email), org_email = values(org_email) ON DUPLICATE KEY UPDATE user_id = values(user_id), name = values(name), remark = values(remark), mobile = values(mobile), email = values(email), org_email = values(org_email)
, main_admin = values(main_admin), is_admin = values(is_admin), unionid = values(unionid), avatar = values(avatar), jobnumber = values(jobnumber), is_leader = values(is_leader) , main_admin = values(main_admin), is_admin = values(is_admin), unionid = values(unionid), avatar = values(avatar), jobnumber = values(jobnumber), is_leader = values(is_leader)
, leader_dept_ids = values(leader_dept_ids), face_url = values(face_url), user_status = values(user_status), user_region_ids = values(user_region_ids) , leader_dept_ids = values(leader_dept_ids), face_url = values(face_url), user_status = values(user_status), user_region_ids = values(user_region_ids), deleted = values(deleted)
</foreach> </foreach>
</insert> </insert>
<update id="updateByPrimaryKeySelective"> <update id="updateByPrimaryKeySelective">
@@ -240,6 +240,6 @@
</select> </select>
<update id="deleteUser"> <update id="deleteUser">
update enterprise_user set deleted = 1 where id in <foreach collection="excludeUserIds" open="(" close=")" separator="," item="userId">#{userId}</foreach> update enterprise_user set deleted = 1 where user_id not in <foreach collection="excludeUserIds" open="(" close=")" separator="," item="userId">#{userId}</foreach>
</update> </update>
</mapper> </mapper>

View File

@@ -0,0 +1,239 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cool.store.mapper.SysMenuMapper">
<resultMap id="BaseResultMap" type="com.cool.store.entity.SysMenuDO">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="parent_id" jdbcType="BIGINT" property="parentId"/>
<result column="code" jdbcType="VARCHAR" property="code"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="alias" jdbcType="VARCHAR" property="alias"/>
<result column="path" jdbcType="VARCHAR" property="path"/>
<result column="perms" jdbcType="VARCHAR" property="perms"/>
<result column="source" jdbcType="VARCHAR" property="source"/>
<result column="sort" jdbcType="INTEGER" property="sort"/>
<result column="category" jdbcType="INTEGER" property="category"/>
<result column="action" jdbcType="INTEGER" property="action"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="platform" jdbcType="VARCHAR" property="platform"/>
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted"/>
<result column="type" jdbcType="VARCHAR" property="type"/>
<result column="target" jdbcType="VARCHAR" property="target"/>
<result column="component" jdbcType="VARCHAR" property="component"/>
<result column="icon" jdbcType="VARCHAR" property="icon"/>
<result column="menu_type" jdbcType="TINYINT" property="menuType"/>
<result column="env" jdbcType="VARCHAR" property="env"/>
<result column="common_functions_icon" jdbcType="VARCHAR" property="commonFunctionsIcon"/>
</resultMap>
<sql id="Base_Column_List">
id, parent_id, code, name, alias, path, perms, source, sort, category, action, remark,
platform, is_deleted, type, target, component, icon, menu_type, env, common_functions_icon
</sql>
<insert id="insertSelective" keyColumn="id" keyProperty="record.id" useGeneratedKeys="true">
insert into sys_menu
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="parentId != null">
parent_id,
</if>
<if test="code != null">
code,
</if>
<if test="name != null">
name,
</if>
<if test="alias != null">
alias,
</if>
<if test="path != null">
path,
</if>
<if test="perms != null">
perms,
</if>
<if test="source != null">
source,
</if>
<if test="sort != null">
sort,
</if>
<if test="category != null">
category,
</if>
<if test="action != null">
action,
</if>
<if test="remark != null">
remark,
</if>
<if test="platform != null">
platform,
</if>
<if test="isDeleted != null">
is_deleted,
</if>
<if test="type != null">
type,
</if>
<if test="target != null">
target,
</if>
<if test="component != null">
component,
</if>
<if test="icon != null">
icon,
</if>
<if test="menuType != null">
menu_type,
</if>
<if test="env != null">
env,
</if>
<if test="commonFunctionsIcon != null">
common_functions_icon,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="parentId != null">
#{parentId},
</if>
<if test="code != null">
#{code},
</if>
<if test="name != null">
#{name},
</if>
<if test="alias != null">
#{alias},
</if>
<if test="path != null">
#{path},
</if>
<if test="perms != null">
#{perms},
</if>
<if test="source != null">
#{source},
</if>
<if test="sort != null">
#{sort},
</if>
<if test="category != null">
#{category},
</if>
<if test="action != null">
#{action},
</if>
<if test="remark != null">
#{remark},
</if>
<if test="platform != null">
#{platform},
</if>
<if test="isDeleted != null">
#{isDeleted},
</if>
<if test="type != null">
#{type},
</if>
<if test="target != null">
#{target},
</if>
<if test="component != null">
#{component},
</if>
<if test="icon != null">
#{icon},
</if>
<if test="menuType != null">
#{menuType},
</if>
<if test="env != null">
#{env},
</if>
<if test="commonFunctionsIcon != null">
#{commonFunctionsIcon},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective">
update sys_menu
<set>
<if test="parentId != null">
parent_id = #{parentId},
</if>
<if test="code != null">
code = #{code},
</if>
<if test="name != null">
name = #{name},
</if>
<if test="alias != null">
alias = #{alias},
</if>
<if test="path != null">
path = #{path},
</if>
<if test="perms != null">
perms = #{perms},
</if>
<if test="source != null">
source = #{source},
</if>
<if test="sort != null">
sort = #{sort},
</if>
<if test="category != null">
category = #{category},
</if>
<if test="action != null">
action = #{action},
</if>
<if test="remark != null">
remark = #{remark},
</if>
<if test="platform != null">
platform = #{platform},
</if>
<if test="isDeleted != null">
is_deleted = #{isDeleted},
</if>
<if test="type != null">
type = #{type},
</if>
<if test="target != null">
target = #{target},
</if>
<if test="component != null">
component = #{component},
</if>
<if test="icon != null">
icon = #{icon},
</if>
<if test="menuType != null">
menu_type = #{menuType},
</if>
<if test="env != null">
env = #{env},
</if>
<if test="commonFunctionsIcon != null">
common_functions_icon = #{commonFunctionsIcon},
</if>
</set>
where id = #{id}
</update>
<select id="selectMenuAll" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from
sys_menu
where
platform=#{platformType}
<if test="list!=null and list.size>0">
and parent_id in
<foreach collection="list" item="parentId" open="(" close=")" separator=",">
#{parentId}
</foreach>
</if>
</select>
</mapper>

View File

@@ -3,4 +3,4 @@ jdbc.url = jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcoll
jdbc.user= coolstore jdbc.user= coolstore
jdbc.password = CSCErYcXniNYm7bT jdbc.password = CSCErYcXniNYm7bT
table.name = enterprise_user_role table.name = sys_menu

View File

@@ -0,0 +1,82 @@
package com.cool.store.entity;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @author zhangchenbiao
* @date 2023-06-08 04:38
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SysMenuDO implements Serializable {
@ApiModelProperty("自增id")
private Long id;
@ApiModelProperty("父级菜单")
private Long parentId;
@ApiModelProperty("菜单编号")
private String code;
@ApiModelProperty("菜单名称")
private String name;
@ApiModelProperty("菜单别名")
private String alias;
@ApiModelProperty("请求地址(前端路由)")
private String path;
@ApiModelProperty("后端权限标识")
private String perms;
@ApiModelProperty("菜单资源(图片)")
private String source;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("菜单类型(菜单,按钮)")
private Integer category;
@ApiModelProperty("操作按钮类型(工具栏,操作栏,工具操作栏)")
private Integer action;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("所属项目PC小程序")
private String platform;
@ApiModelProperty("是否已删除")
private Integer isDeleted;
@ApiModelProperty("操作类型")
private String type;
@ApiModelProperty("是否新开页面")
private String target;
@ApiModelProperty("组件")
private String component;
@ApiModelProperty("图标")
private String icon;
@ApiModelProperty("菜单类型 1菜单 2权限")
private Integer menuType;
@ApiModelProperty("环境")
private String env;
@ApiModelProperty("常用功能_图标")
private String commonFunctionsIcon;
}

View File

@@ -0,0 +1,118 @@
package com.cool.store.vo.menu;
import com.cool.store.entity.SysMenuDO;
import com.cool.store.enums.MenuTypeEnum;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* describe:
*
* @author zhouyiping
* @date 2020/09/22
*/
@Data
public class MenuTreeVO {
@ApiModelProperty("请求地址(前端路由)")
private String path;
@ApiModelProperty("菜单编号")
private String code;
@ApiModelProperty("菜单名称")
private String name;
@ApiModelProperty("菜单id")
private Long id;
@ApiModelProperty("父级菜单")
private Long parentId;
@ApiModelProperty("是否新开页面")
private String target;
@ApiModelProperty("组件")
private String component;
@ApiModelProperty("图标'")
private String icon;
@ApiModelProperty("常用功能图标")
private String commonFunctionsIcon;
@ApiModelProperty("菜单类型 1菜单 2权限")
private Integer menuType;
@ApiModelProperty("权限列表")
private List<String> authorityList;
@ApiModelProperty("子菜单")
private List<MenuTreeVO> children;
public static List<MenuTreeVO> dealMenuTree(Long rootId, List<SysMenuDO> menuList) {
if(CollectionUtils.isEmpty(menuList)){
return Lists.newArrayList();
}
Map<Long, List<SysMenuDO>> parentGroup = ListUtils.emptyIfNull(menuList).stream().collect(Collectors.groupingBy(SysMenuDO::getParentId));
List<SysMenuDO> menuDOList = parentGroup.get(rootId);
if (CollectionUtils.isEmpty(menuDOList)) {
return Collections.emptyList();
}
List<MenuTreeVO> voList = convertVO(menuDOList);
List<MenuTreeVO> treeVOList = new LinkedList<>(voList);
for (MenuTreeVO data : treeVOList) {
getChild(data, parentGroup);
}
return treeVOList;
}
public static List<MenuTreeVO> convertVO(List<SysMenuDO> menuList) {
menuList = menuList.stream().sorted(Comparator.comparing(SysMenuDO::getSort)).collect(Collectors.toList());
List<MenuTreeVO> resultList = new ArrayList<>();
for (SysMenuDO menu : menuList) {
MenuTreeVO vo = new MenuTreeVO();
vo.setId(menu.getId());
vo.setParentId(menu.getParentId());
vo.setName(menu.getName());
vo.setCode(menu.getType());
vo.setPath(menu.getPath());
vo.setComponent(menu.getComponent());
vo.setTarget(menu.getTarget());
vo.setIcon(menu.getIcon());
vo.setMenuType(menu.getMenuType());
vo.setCommonFunctionsIcon(menu.getCommonFunctionsIcon());
resultList.add(vo);
}
return resultList;
}
public static void getChild(MenuTreeVO data, Map<Long, List<SysMenuDO>> parentGroup) {
List<SysMenuDO> sysMenuDOList = parentGroup.get(data.getId());
List<SysMenuDO> parentMenuList = ListUtils.emptyIfNull(sysMenuDOList).stream().filter(menu -> MenuTypeEnum.MENU.getCode().equals(menu.getMenuType())).collect(Collectors.toList());
List<SysMenuDO> parentAuthList = ListUtils.emptyIfNull(sysMenuDOList).stream().filter(menu -> MenuTypeEnum.AUTH.getCode().equals(menu.getMenuType())).collect(Collectors.toList());
//属于菜单下时候
if (CollectionUtils.isNotEmpty(parentMenuList)) {
List<MenuTreeVO> voList = convertVO(parentMenuList);
List<String> authList = parentMenuList.stream().map(SysMenuDO::getType).collect(Collectors.toList());
data.setAuthorityList(authList);
List<MenuTreeVO> menuList = voList.stream().filter(vo -> MenuTypeEnum.MENU.getCode().equals(vo.getMenuType())).collect(Collectors.toList());
data.setChildren(menuList);
voList.forEach(child -> {
getChild(child, parentGroup);
});
}
//数据是权限的的时候
if (CollectionUtils.isNotEmpty(parentAuthList)) {
List<String> authList = parentAuthList.stream().map(SysMenuDO::getType).collect(Collectors.toList());
data.setAuthorityList(authList);
}
}
}

View File

@@ -10,11 +10,7 @@ public class CurrentUser {
private String name; private String name;
private String enterpriseId; private String corpId;
private String dingCorpId;
private String appType;
private String accessToken; private String accessToken;
@@ -23,19 +19,15 @@ public class CurrentUser {
*/ */
private String roleIds; private String roleIds;
private String dbName;
/** /**
* 钉钉管理员和数智门店无关 * 钉钉管理员和数智门店无关
*/ */
private Boolean isAdmin; private Boolean isAdmin;
/** /**
* 角色权限 * 头像
*/ */
private String roleAuth; private String avatar;
private String mainCorpId;
private SysRoleDO sysRoleDO; private SysRoleDO sysRoleDO;
} }

View File

@@ -6,7 +6,7 @@ import org.apache.commons.lang3.StringUtils;
/** /**
* *
*/ */
public class UserContext { public class CurrentUserContext {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

View File

@@ -0,0 +1,16 @@
package com.cool.store.service;
import com.cool.store.vo.menu.MenuTreeVO;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: MenuService
* @Description:
* @date 2023-06-08 16:43
*/
public interface MenuService {
List<MenuTreeVO> getUserMenus(String userId);
}

View File

@@ -80,6 +80,8 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
enterpriseUserRoleDAO.batchInsertOrUpdate(userRoleInsertOrUpdateList); enterpriseUserRoleDAO.batchInsertOrUpdate(userRoleInsertOrUpdateList);
//删除不存在的角色? //删除不存在的角色?
sysRoleDAO.deleteRole(DataSourceEnum.SYNC, roleIds); sysRoleDAO.deleteRole(DataSourceEnum.SYNC, roleIds);
}else {
//如果为空 是不是得删除角色 及用户角色信息?
} }
} }

View File

@@ -18,6 +18,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.crypto.RandomNumberGenerator; import org.apache.shiro.crypto.RandomNumberGenerator;
import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -40,6 +41,8 @@ public class LoginServiceImpl implements LoginService {
private RedisUtilPool redisUtilPool; private RedisUtilPool redisUtilPool;
@Resource @Resource
private EnterpriseUserRoleDAO enterpriseUserRoleDAO; private EnterpriseUserRoleDAO enterpriseUserRoleDAO;
@Value("${corp.id:null}")
private String corpId;
@Override @Override
public Object feiShuLogin(String userId, Boolean needRefreshToken, String avatar) { public Object feiShuLogin(String userId, Boolean needRefreshToken, String avatar) {
@@ -73,25 +76,20 @@ public class LoginServiceImpl implements LoginService {
enterpriseUser.setFaceUrl(finalAvatar); enterpriseUser.setFaceUrl(finalAvatar);
currentUser.setUserId(enterpriseUser.getUserId()); currentUser.setUserId(enterpriseUser.getUserId());
currentUser.setIsAdmin(enterpriseUser.getIsAdmin()); currentUser.setIsAdmin(enterpriseUser.getIsAdmin());
//设置当前登录人使用的企业相关信息
//currentUser.setRoleAuth(sysRole.getRoleAuth());
currentUser.setSysRoleDO(sysRole); currentUser.setSysRoleDO(sysRole);
currentUser.setCorpId(corpId);
currentUser.setAvatar(enterpriseUser.getAvatar());
//生成令牌 //生成令牌
RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator(); RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
String token = randomNumberGenerator.nextBytes().toHex(); String token = randomNumberGenerator.nextBytes().toHex();
String refreshToken = randomNumberGenerator.nextBytes().toHex(); String refreshToken = randomNumberGenerator.nextBytes().toHex();
currentUser.setName(enterpriseUser.getName()); currentUser.setName(enterpriseUser.getName());
currentUser.setAccessToken(token); currentUser.setAccessToken(token);
JSONObject jsonObject = new JSONObject(); redisUtilPool.setString(CommonConstants.ACCESS_TOKEN_KEY + ":" + token, JSON.toJSONString(currentUser), CommonConstants.ACCESS_TOKEN_EXPIRE);
jsonObject.put("action_token", token);
jsonObject.put("user", currentUser);
redisUtilPool.setString(CommonConstants.ACCESS_TOKEN_KEY + ":" + token, JSON.toJSONString(currentUser), CommonConstants.ACTION_TOKEN_EXPIRE);
jsonObject.put("expire", CommonConstants.ACTION_TOKEN_EXPIRE);
redisUtilPool.setString(currentUser.getUserId(), token); redisUtilPool.setString(currentUser.getUserId(), token);
redisUtilPool.setString(CommonConstants.REFRESH_TOKEN_KEY+":"+refreshToken,JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE); redisUtilPool.setString(CommonConstants.REFRESH_TOKEN_KEY+":"+refreshToken,JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE);
jsonObject.put("refresh_token",refreshToken);
log.info("[" + enterpriseUser.getName() + "; action_token"+ token + "; userId" + currentUser.getUserId() +"]登入系统成功"); log.info("[" + enterpriseUser.getName() + "; action_token"+ token + "; userId" + currentUser.getUserId() +"]登入系统成功");
return jsonObject; return currentUser;
} }
} }

View File

@@ -0,0 +1,31 @@
package com.cool.store.service.impl;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.SysMenuDAO;
import com.cool.store.entity.SysMenuDO;
import com.cool.store.enums.PlatFormTypeEnum;
import com.cool.store.service.MenuService;
import com.cool.store.vo.menu.MenuTreeVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: MenuServiceImpl
* @Description:
* @date 2023-06-08 16:43
*/
@Service
public class MenuServiceImpl implements MenuService {
@Resource
private SysMenuDAO sysMenuDAO;
@Override
public List<MenuTreeVO> getUserMenus(String userId) {
List<SysMenuDO> menuList= sysMenuDAO.selectMenuAll(null, PlatFormTypeEnum.PC.getCode());
return MenuTreeVO.dealMenuTree(CommonConstants.ZERO_LONG, menuList);
}
}

View File

@@ -1,50 +0,0 @@
package com.cool.store.utils;
import com.cool.store.context.DataSourceContext;
import com.cool.store.context.UserContext;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class DataSourceHelper {
private static final Logger logger = LoggerFactory.getLogger(DataSourceHelper.class);
/**
* @param
* @return void
* @throws
* @Title changeToMy
* @Description 切换到自己的数据库
*/
public static void changeToMy() {
DataSourceContext.clearDataSourceType();
String dbName = UserContext.getUser().getDbName();
DataSourceContext.setDataSourceType(dbName);
}
/**
* @param datasource
* @return void
* @throws
* @Title changeToSpecificDataSource
* @Description 切换到指定的数据库
*/
public static void changeToSpecificDataSource(String datasource) {
DataSourceContext.clearDataSourceType();
String dbName = datasource;
DataSourceContext.setDataSourceType(dbName);
}
/**
* @param
* @return void
* @throws
* @Title reset
* @Description 重置链接到主库
*/
public static void reset() {
DataSourceContext.clearDataSourceType();
}
}

View File

@@ -0,0 +1,46 @@
package com.cool.store.config;
import cn.hutool.http.HttpStatus;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description 跨域配置
* @author Aaron
* @date 2020/1/9
*/
@Component
@Order(1)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin",reqs.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS, GET, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "36000");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Origin, Authorization, content-type, XMLHttpRequest, Authorization, User-Agent, Cookie, accessToken");
if (reqs.getMethod().equals("OPTIONS") || reqs.getMethod().equals("HEAD")) {
response.setStatus(HttpStatus.HTTP_OK);
return;
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}

View File

@@ -0,0 +1,69 @@
package com.cool.store.config;
import javafx.application.Application;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: ServletContextConfig
* @Description:
* @date 2023-06-08 16:28
*/
@Configuration
@ComponentScan(basePackageClasses = Application.class, useDefaultFilters = true)
public class ServletContextConfig extends WebMvcConfigurationSupport {
private final Logger logger = LoggerFactory.getLogger(ServletContextConfig.class);
/**
* 配置servlet处理
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "OPTIONS", "PUT", "DELETE")
.maxAge(3600);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
/**
* 统一异常处理
*
* @param exceptionResolvers
*/
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
}

View File

@@ -3,8 +3,7 @@ package com.cool.store.config;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.response.ResponseResult; import com.cool.store.response.ResponseResult;
import com.cool.store.context.UserContext; import com.cool.store.context.CurrentUserContext;
import com.cool.store.utils.DataSourceHelper;
import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.RedisUtilPool;
import com.cool.store.context.CurrentUser; import com.cool.store.context.CurrentUser;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -68,51 +67,49 @@ public class TokenValidateFilter implements Filter {
@Override @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// HttpServletResponse response = (HttpServletResponse) servletResponse; HttpServletResponse response = (HttpServletResponse) servletResponse;
// HttpServletRequest reqs = (HttpServletRequest) servletRequest; HttpServletRequest reqs = (HttpServletRequest) servletRequest;
// String uri = reqs.getRequestURI(); String uri = reqs.getRequestURI();
// String method = reqs.getMethod(); String method = reqs.getMethod();
// String userStr = ""; String userStr = "";
// CurrentUser currentUser = null; CurrentUser currentUser = null;
// boolean isInWhiteList = excludePath(uri); boolean isInWhiteList = excludePath(uri);
// String accessToken = reqs.getParameter("access_token"); String accessToken = reqs.getHeader("accessToken");
// String key = "access_token:" + accessToken; String key = "access_token:" + accessToken;
// if(StringUtils.isNotBlank(accessToken)){ if(StringUtils.isNotBlank(accessToken)){
// userStr = redisUtilPool.getString(key); userStr = redisUtilPool.getString(key);
// if(StringUtils.isNotBlank(userStr)){ if(StringUtils.isNotBlank(userStr)){
// currentUser = JSON.parseObject(userStr, CurrentUser.class); currentUser = JSON.parseObject(userStr, CurrentUser.class);
// } }
// } }
// log.info("url:{}", uri); log.info("url:{}", uri);
// if ( !isInWhiteList && !method.equals("OPTIONS")) { if ( !isInWhiteList && !method.equals("OPTIONS")) {
// if (StringUtils.isEmpty(accessToken)) { if (StringUtils.isEmpty(accessToken)) {
// response.setStatus(HttpStatus.OK.value()); response.setStatus(HttpStatus.OK.value());
// response.getWriter().write(JSON.toJSONString( response.getWriter().write(JSON.toJSONString(
// ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID))); ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID)));
// return; return;
// } }
// if (Objects.isNull(currentUser)) { if (Objects.isNull(currentUser)) {
// response.setStatus(HttpStatus.OK.value()); response.setStatus(HttpStatus.OK.value());
// response.getWriter().write(JSON.toJSONString( response.getWriter().write(JSON.toJSONString(
// ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID))); ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID)));
// return; return;
// } }
// log.info("url:{}, access_token:{}, userId:{}, username:{}, enterpriseId:{}", uri, accessToken, currentUser.getUserId(), currentUser.getName(), currentUser.getEnterpriseId()); log.info("url:{}, access_token:{}, userId:{}, username:{}", uri, accessToken, currentUser.getUserId(), currentUser.getName());
// } }
// if(StringUtils.isBlank(userStr) && !isInWhiteList){ if(StringUtils.isBlank(userStr) && !isInWhiteList){
// response.setStatus(HttpStatus.OK.value()); response.setStatus(HttpStatus.OK.value());
// response.getWriter().write(JSON.toJSONString( response.getWriter().write(JSON.toJSONString(
// ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID))); ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID)));
// return; return;
// } }
// try { try {
// UserContext.setUser(userStr); CurrentUserContext.setUser(userStr);
// DataSourceHelper.changeToMy(); filterChain.doFilter(servletRequest, servletResponse);
// filterChain.doFilter(servletRequest, servletResponse); } finally {
// } finally { CurrentUserContext.removeUser();
// UserContext.removeUser(); }
// }
filterChain.doFilter(servletRequest, servletResponse);
} }
@Override @Override

View File

@@ -58,28 +58,12 @@ public class Swagger2Config {
.globalOperationParameters(pars); .globalOperationParameters(pars);
} }
private Docket createDocketByPath (String groupName, String... paths){
List<Parameter> pars = getParameters();
return new Docket(DocumentationType.SWAGGER_2)
.enable(Boolean.TRUE)
.apiInfo(this.getApiInfo())
.groupName(groupName)
.select()
.paths(this.scanPath(paths))
.build()
.globalOperationParameters(pars);
}
private List<Parameter> getParameters() { private List<Parameter> getParameters() {
List<Parameter> pars = new ArrayList<>(); List<Parameter> pars = new ArrayList<>();
pars.add(new ParameterBuilder().name("accessToken").description("令牌").required(true) pars.add(new ParameterBuilder().name("accessToken").description("令牌").required(true)
.modelRef(new ModelRef("string")) .modelRef(new ModelRef("string"))
.defaultValue("{{accessToken}}") .defaultValue("{{accessToken}}")
.parameterType("query").build()); .parameterType("query").build());
pars.add(new ParameterBuilder().name("enterpriseId").required(true)
.modelRef(new ModelRef("string"))
.defaultValue("45f92210375346858b6b6694967f44de")
.parameterType("path").build());
return pars; return pars;
} }
@@ -94,17 +78,6 @@ public class Swagger2Config {
return predicate; return predicate;
} }
private Predicate<String> scanPath(final String... paths) {
Predicate<String> predicate = null;
for (String path : paths) {
if(StringUtils.isNotBlank(path)){
Predicate<String> tempPredicate = PathSelectors.ant(path);
predicate = predicate == null ? tempPredicate : Predicates.or(tempPredicate,predicate);
}
}
return predicate;
}
@Bean @Bean
public Docket allApi() { public Docket allApi() {

View File

@@ -1,18 +1,10 @@
package com.cool.store.controller; package com.cool.store.controller;
import com.cool.store.dto.enterprise.EnterpriseUserDTO;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.EnterpriseUserService; import com.cool.store.service.EnterpriseUserService;
import com.cool.store.utils.DataSourceHelper;
import com.cool.store.vo.buser.EnterpriseUserPageVO;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
/** /**
* @author zhangchenbiao * @author zhangchenbiao

View File

@@ -1,16 +1,18 @@
package com.cool.store.controller; package com.cool.store.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cool.store.context.CurrentUserContext;
import com.cool.store.dto.login.FeiShuLoginDTO; import com.cool.store.dto.login.FeiShuLoginDTO;
import com.cool.store.dto.login.UserIdInfoDTO; import com.cool.store.dto.login.UserIdInfoDTO;
import com.cool.store.enums.AppTypeEnum;
import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
import com.cool.store.http.ISVHttpRequest; import com.cool.store.http.ISVHttpRequest;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.LoginService; import com.cool.store.service.LoginService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -34,7 +36,7 @@ public class LoginController {
@PostMapping(value = "/feiShuLogin") @PostMapping(value = "/feiShuLogin")
public Object feiShuLogin(@RequestBody FeiShuLoginDTO param) { public ResponseResult feiShuLogin(@RequestBody FeiShuLoginDTO param) {
log.info("feiShuLogin data={}", JSONObject.toJSONString(param)); log.info("feiShuLogin data={}", JSONObject.toJSONString(param));
String code = param.getCode(); String code = param.getCode();
try { try {
@@ -45,7 +47,7 @@ public class LoginController {
} }
log.info("userInfo:{}", JSONObject.toJSONString(userInfo)); log.info("userInfo:{}", JSONObject.toJSONString(userInfo));
String userId = userInfo.getOpenId(); String userId = userInfo.getOpenId();
return loginService.feiShuLogin(userId, Boolean.TRUE, StringUtils.EMPTY); return ResponseResult.success(loginService.feiShuLogin(userId, Boolean.TRUE, StringUtils.EMPTY));
} catch (ServiceException e) { } catch (ServiceException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
throw new ServiceException(ErrorCodeEnum.LOGIN_ERROR); throw new ServiceException(ErrorCodeEnum.LOGIN_ERROR);
@@ -55,4 +57,9 @@ public class LoginController {
} }
} }
@GetMapping("/getUserInfoByToken")
public ResponseResult getUserInfoByToken(){
return ResponseResult.success(CurrentUserContext.getUser());
}
} }

View File

@@ -0,0 +1,27 @@
package com.cool.store.controller;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.MenuService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author zhangchenbiao
* @FileName: MenuController
* @Description:
* @date 2023-06-08 16:58
*/
@RestController
public class MenuController {
@Resource
private MenuService menuService;
@GetMapping("/menu/getUserMenus")
public ResponseResult getUserMenus(){
return ResponseResult.success(menuService.getUserMenus(null));
}
}

View File

@@ -34,13 +34,15 @@ public class OssClientController {
private String endpoint; private String endpoint;
@Value("${oss.bucket:null}") @Value("${oss.bucket:null}")
private String bucket; private String bucket;
@Value("${corp.id:null}")
private String corpId;
@GetMapping("/getUploadFileConfig") @GetMapping("/getUploadFileConfig")
public ResponseResult getUploadFileConfig(@RequestParam("enterpriseId")String enterpriseId){ public ResponseResult getUploadFileConfig(){
// host的格式为 bucketname.endpoint // host的格式为 bucketname.endpoint
String host = "http://" + bucket + "." + endpoint; String host = "http://" + bucket + "." + endpoint;
// 用户上传文件时指定的前缀。 // 用户上传文件时指定的前缀。
String dir = "partner/" + enterpriseId + "/"; String dir = "partner/" + corpId + "/";
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret); OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try { try {

View File

@@ -42,4 +42,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -42,4 +42,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -40,4 +40,11 @@ rocketmq.accessKey=LTAI5t5ouXZuFgxJMbQea3b2
rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig
rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080 rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
#oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -50,5 +50,4 @@ oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore oss.bucket=vec-coolstore
corp.id = 171cddee76471740
default.database.name=coolcollege_intelligent_hy

View File

@@ -40,4 +40,11 @@ rocketmq.accessKey=LTAI5t5ouXZuFgxJMbQea3b2
rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig
rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080 rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
#oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -40,4 +40,11 @@ rocketmq.accessKey=LTAI5t5ouXZuFgxJMbQea3b2
rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig
rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080 rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
#oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -42,4 +42,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -80,12 +80,7 @@
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" /> <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:tea-openapi:0.0.19" level="project" /> <orderEntry type="library" name="Maven: com.aliyun:tea-openapi:0.0.19" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:tea-util:0.2.12" level="project" /> <orderEntry type="library" name="Maven: com.aliyun:tea-util:0.2.12" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:credentials-java:0.2.4" level="project" /> <orderEntry type="library" name="Maven: com.aliyun:credentials-java:0.2.4" level="project" />
<orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
<orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.3" level="project" />
<orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
<orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-core:2.3.0" level="project" /> <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-core:2.3.0" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:2.3.0" level="project" /> <orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:2.3.0" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:openapiutil:0.1.9" level="project" /> <orderEntry type="library" name="Maven: com.aliyun:openapiutil:0.1.9" level="project" />
@@ -135,5 +130,24 @@
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.5.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.5.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.5.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" /> <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
<orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.13.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.12" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.13" level="project" />
<orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6" level="project" />
<orderEntry type="library" name="Maven: org.codehaus.jettison:jettison:1.1" level="project" />
<orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.5.10" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
<orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
<orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.5" level="project" />
<orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
<orderEntry type="library" name="Maven: io.opentracing:opentracing-api:0.33.0" level="project" />
<orderEntry type="library" name="Maven: io.opentracing:opentracing-util:0.33.0" level="project" />
<orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.1.0" level="project" />
<orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.11.0" level="project" />
</component> </component>
</module> </module>

View File

@@ -29,6 +29,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
</dependencies> </dependencies>

View File

@@ -1,17 +0,0 @@
package com.cool.store.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author zhangchenbiao
* @FileName: CommonBeanConfig
* @Description:
* @date 2023-05-19 18:41
*/
@Slf4j
@Component
public class CommonBeanConfig {
}

View File

@@ -0,0 +1,46 @@
package com.cool.store.config;
import cn.hutool.http.HttpStatus;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description 跨域配置
* @author Aaron
* @date 2020/1/9
*/
@Component
@Order(1)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin",reqs.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS, GET, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "36000");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Origin, Authorization, content-type, XMLHttpRequest, Authorization, User-Agent, Cookie, accessToken");
if (reqs.getMethod().equals("OPTIONS") || reqs.getMethod().equals("HEAD")) {
response.setStatus(HttpStatus.HTTP_OK);
return;
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}

View File

@@ -0,0 +1,69 @@
package com.cool.store.config;
import javafx.application.Application;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: ServletContextConfig
* @Description:
* @date 2023-06-08 16:28
*/
@Configuration
@ComponentScan(basePackageClasses = Application.class, useDefaultFilters = true)
public class ServletContextConfig extends WebMvcConfigurationSupport {
private final Logger logger = LoggerFactory.getLogger(ServletContextConfig.class);
/**
* 配置servlet处理
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "OPTIONS", "PUT", "DELETE")
.maxAge(3600);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
/**
* 统一异常处理
*
* @param exceptionResolvers
*/
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
}

View File

@@ -1,121 +0,0 @@
package com.cool.store.config;
import com.alibaba.fastjson.JSON;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.response.ResponseResult;
import com.cool.store.context.CurrentUser;
import com.cool.store.context.UserContext;
import com.cool.store.utils.DataSourceHelper;
import com.cool.store.utils.RedisUtilPool;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
/**
* @author ydw
* @Description 权限校验
* @date 2020/1/15
*/
@Component
@Order(3)
@Slf4j
public class TokenValidateFilter implements Filter {
@Autowired
private RedisUtilPool redisUtilPool;
private static AntPathMatcher matcher = new AntPathMatcher();
private static List<String> patternList =
Lists.newArrayList("/web/check/ok","/check/ok", "/partner/mini/program/doc.html","/partner/mini/program/v2/api-docs",
"/**/swagger*/**","/**/openArea/**",
"/**/webjars/**");
/**
* @param uri
* @return boolean
* @throws
* @Title excludePath
* @Description 是否是放行的请求
*/
private boolean excludePath(String uri) {
for (String pattern : patternList) {
if (matcher.match(pattern, uri)) {
return true;
}
}
return false;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest reqs = (HttpServletRequest) servletRequest;
String uri = reqs.getRequestURI();
String method = reqs.getMethod();
String userStr = "";
CurrentUser currentUser = null;
boolean isInWhiteList = excludePath(uri);
String accessToken = reqs.getParameter("access_token");
String key = "access_token:" + accessToken;
if(StringUtils.isNotBlank(accessToken)){
userStr = redisUtilPool.getString(key);
if(StringUtils.isNotBlank(userStr)){
currentUser = JSON.parseObject(userStr, CurrentUser.class);
}
}
log.info("url:{}", uri);
if ( !isInWhiteList && !method.equals("OPTIONS")) {
if (StringUtils.isEmpty(accessToken)) {
response.setStatus(HttpStatus.OK.value());
response.getWriter().write(JSON.toJSONString(
ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID)));
return;
}
if (Objects.isNull(currentUser)) {
response.setStatus(HttpStatus.OK.value());
response.getWriter().write(JSON.toJSONString(
ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID)));
return;
}
log.info("url:{}, accessToken:{}, userId:{}, username:{}, enterpriseId:{}", uri, accessToken, currentUser.getUserId(), currentUser.getName(), currentUser.getEnterpriseId());
}
if(StringUtils.isBlank(userStr) && !isInWhiteList){
response.setStatus(HttpStatus.OK.value());
response.getWriter().write(JSON.toJSONString(
ResponseResult.fail(ErrorCodeEnum.ACCESS_TOKEN_INVALID)));
return;
}
try {
UserContext.setUser(userStr);
DataSourceHelper.changeToMy();
filterChain.doFilter(servletRequest, servletResponse);
} finally {
UserContext.removeUser();
}
}
@Override
public void destroy() {
}
}

View File

@@ -58,28 +58,12 @@ public class Swagger2Config {
.globalOperationParameters(pars); .globalOperationParameters(pars);
} }
private Docket createDocketByPath (String groupName, String... paths){
List<Parameter> pars = getParameters();
return new Docket(DocumentationType.SWAGGER_2)
.enable(Boolean.TRUE)
.apiInfo(this.getApiInfo())
.groupName(groupName)
.select()
.paths(this.scanPath(paths))
.build()
.globalOperationParameters(pars);
}
private List<Parameter> getParameters() { private List<Parameter> getParameters() {
List<Parameter> pars = new ArrayList<>(); List<Parameter> pars = new ArrayList<>();
pars.add(new ParameterBuilder().name("accessToken").description("令牌").required(true) pars.add(new ParameterBuilder().name("accessToken").description("令牌").required(true)
.modelRef(new ModelRef("string")) .modelRef(new ModelRef("string"))
.defaultValue("{{accessToken}}") .defaultValue("{{accessToken}}")
.parameterType("query").build()); .parameterType("query").build());
pars.add(new ParameterBuilder().name("enterpriseId").required(true)
.modelRef(new ModelRef("string"))
.defaultValue("45f92210375346858b6b6694967f44de")
.parameterType("path").build());
return pars; return pars;
} }
@@ -94,17 +78,6 @@ public class Swagger2Config {
return predicate; return predicate;
} }
private Predicate<String> scanPath(final String... paths) {
Predicate<String> predicate = null;
for (String path : paths) {
if(StringUtils.isNotBlank(path)){
Predicate<String> tempPredicate = PathSelectors.ant(path);
predicate = predicate == null ? tempPredicate : Predicates.or(tempPredicate,predicate);
}
}
return predicate;
}
@Bean @Bean
public Docket allApi() { public Docket allApi() {

View File

@@ -0,0 +1,65 @@
package com.cool.store.controller;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.cool.store.response.ResponseResult;
import com.cool.store.vo.oss.OssUploadConfigVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Date;
/**
* @author zhangchenbiao
* @FileName: OssClientController
* @Description:
* @date 2023-06-01 11:25
*/
@RestController
@RequestMapping({"/oss"})
@Slf4j
public class OssClientController {
@Value("${oss.accessKeyId:null}")
private String accessKeyId;
@Value("${oss.accessKeySecret:null}")
private String accessKeySecret;
@Value("${oss.endpoint:null}")
private String endpoint;
@Value("${oss.bucket:null}")
private String bucket;
@Value("${corp.id:null}")
private String corpId;
@GetMapping("/getUploadFileConfig")
public ResponseResult getUploadFileConfig(){
// host的格式为 bucketname.endpoint
String host = "http://" + bucket + "." + endpoint;
// 用户上传文件时指定的前缀。
String dir = "partner/" + corpId + "/";
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
long expireTime = 300;
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
Date expiration = new Date(expireEndTime);
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
String postPolicy = client.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String signature = client.calculatePostSignature(postPolicy);
OssUploadConfigVO result = new OssUploadConfigVO(accessKeyId, encodedPolicy, signature, dir, host, String.valueOf(expireEndTime / 1000));
return ResponseResult.success(result);
}catch (Exception e){
log.info("exception", e);
}
return ResponseResult.success();
}
}

View File

@@ -42,4 +42,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -42,4 +42,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -38,4 +38,11 @@ rocketmq.accessKey=LTAI5t5ouXZuFgxJMbQea3b2
rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig
rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080 rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
#oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -45,4 +45,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -38,4 +38,11 @@ rocketmq.accessKey=LTAI5t5ouXZuFgxJMbQea3b2
rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig
rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080 rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
#oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -38,4 +38,11 @@ rocketmq.accessKey=LTAI5t5ouXZuFgxJMbQea3b2
rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig rocketmq.secretKey=yuomDstRjSdihtN5zo8viDbWu8Z0ig
rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080 rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX5N7rwl.cn-hangzhou.mq-internal.aliyuncs.com:8080
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
#oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740

View File

@@ -40,4 +40,9 @@ rocketmq.nameSrvAdder=http://MQ_INST_1947409023213164_BX3sLZnA.cn-hangzhou.mq-in
rocketmq.topic=simple_message rocketmq.topic=simple_message
rocketmq.orderTopic=order_message rocketmq.orderTopic=order_message
default.database.name=coolcollege_intelligent_hy #oss配置
oss.accessKeyId=LTAI5tKSnAbkEbmT6CeBwNN3
oss.accessKeySecret=PbXOzUFwAvZ2K5zIawwa7NAJE2pFXS
oss.endpoint=oss-cn-shanghai.aliyuncs.com
oss.bucket=vec-coolstore
corp.id = 171cddee76471740