screen-api/src/main/java/com/moral/api/config/redis/RedisConfig.java
@@ -1,12 +1,21 @@ package com.moral.api.config.redis; import java.time.Duration; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisPassword; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @@ -16,9 +25,9 @@ @Configuration public class RedisConfig { @Bean(name="redisTemplate") @Bean(name = "redisTemplate") @ConditionalOnMissingBean(StringRedisTemplate.class) //此注解的作用 如果容器中没有RedisTemplate 那就注入 有就不注入了 public RedisTemplate<String,Object> stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { public RedisTemplate<String, Object> stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); @@ -39,4 +48,62 @@ redisTemplate.afterPropertiesSet(); return redisTemplate; } @Bean(name = "tokenRedisTemplate") public RedisTemplate<String, Object> getTokenRedisTemplate( @Value("${spring.tokenRedis.host}") String hostName, @Value("${spring.tokenRedis.password}") String password, @Value("${spring.tokenRedis.port}") int port, @Value("${spring.tokenRedis.database}") int database, @Value("${spring.tokenRedis.pool.max-active}") int maxActive, @Value("${spring.tokenRedis.pool.max-idle}") int maxIdle, @Value("${spring.tokenRedis.pool.min-idle}") int minIdle, @Value("${spring.tokenRedis.pool.max-wait}") long maxWait, @Value("${spring.tokenRedis.timeout}") long timeout ) { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); configuration.setHostName(hostName); configuration.setPort(port); configuration.setDatabase(database); RedisPassword redisPassword = RedisPassword.of(password); configuration.setPassword(redisPassword); GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); genericObjectPoolConfig.setMaxTotal(maxActive); genericObjectPoolConfig.setMinIdle(minIdle); genericObjectPoolConfig.setMaxIdle(maxIdle); genericObjectPoolConfig.setMaxWaitMillis(maxWait); LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder(); builder.poolConfig(genericObjectPoolConfig); builder.commandTimeout(Duration.ofSeconds(timeout)); LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build()); connectionFactory.afterPropertiesSet(); return createRedisTemplate(connectionFactory); } public RedisTemplate createRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 redisTemplate.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); // valuevalue采用jackson序列化方式 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // hash的value采用jackson序列化方式 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); redisTemplate.afterPropertiesSet(); return redisTemplate; } } screen-api/src/main/java/com/moral/api/controller/WebController.java
@@ -23,6 +23,7 @@ import com.moral.api.service.UserService; import com.moral.constant.ResultMessage; import com.moral.redis.RedisUtil; import com.moral.util.WebUtils; @Slf4j @Api(tags = {"大屏"}) @@ -36,27 +37,22 @@ @Autowired private GroupService groupService; /** * @param account 账户 * @param password 密码 * @Auther jinpengyong * @Description web登陆 */ @ApiOperation(value = "登陆", notes = "登陆") @ApiImplicitParams({ @ApiImplicitParam(name = "account", value = "账户", required = true, paramType = "path", dataType = "String"), @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "path", dataType = "String") @ApiImplicitParam(name = "account", value = "账户", required = true, paramType = "query", dataType = "String"), @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query", dataType = "String") }) @RequestMapping(value = "login/{account}/{password}", method = RequestMethod.GET) public ResultMessage login(@PathVariable("account") String account, @PathVariable("password") String password) { if (account == null || password == null) { return ResultMessage.fail("账户和密码不能为空"); @RequestMapping(value = "login", method = RequestMethod.POST) public ResultMessage login(HttpServletRequest request) { Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null); if (!(parameters.containsKey("account") && parameters.containsKey("password"))) { return ResultMessage.fail("用户名及密码不允许为空!"); } Map<String, Object> map = userService.login(account, password); Map<String, Object> map = userService.login(parameters); if (map.get("token") == null) { return ResultMessage.fail(map.get("msg").toString()); } return ResultMessage.ok(map.get("token")); return ResultMessage.ok(map); } @ApiOperation(value = "注销", notes = "注销") screen-api/src/main/java/com/moral/api/entity/User.java
@@ -95,13 +95,6 @@ private String isDelete; @TableField(exist = false) private Set<Group> groups; @TableField(exist = false) private Set<Menu> menus; @Override protected Serializable pkVal() { return this.id; screen-api/src/main/java/com/moral/api/mapper/GroupMapper.java
@@ -1,5 +1,8 @@ package com.moral.api.mapper; import java.util.List; import java.util.Map; import com.moral.api.entity.Group; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -13,4 +16,6 @@ */ public interface GroupMapper extends BaseMapper<Group> { List<Map<String, Object>> selectUserGroup(int userId); } screen-api/src/main/java/com/moral/api/mapper/MenuMapper.java
@@ -1,5 +1,7 @@ package com.moral.api.mapper; import java.util.List; import com.moral.api.entity.Menu; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -13,4 +15,6 @@ */ public interface MenuMapper extends BaseMapper<Menu> { List<Menu> selectUserMenu(int userId); } screen-api/src/main/java/com/moral/api/mapper/OrganizationMapper.java
@@ -1,5 +1,7 @@ package com.moral.api.mapper; import java.util.Map; import com.moral.api.entity.Organization; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -13,4 +15,6 @@ */ public interface OrganizationMapper extends BaseMapper<Organization> { Map<String, Object> selectOrganizationById(int id); } screen-api/src/main/java/com/moral/api/mapper/UserMapper.java
@@ -17,7 +17,5 @@ */ public interface UserMapper extends BaseMapper<User> { Set<Group> selectUserGroup(int userId); Set<Menu> selectUserMenu(int userId); } screen-api/src/main/java/com/moral/api/service/UserService.java
@@ -17,7 +17,7 @@ */ public interface UserService extends IService<User> { Map<String, Object> login(String account, String password); Map<String, Object> login(Map<String,Object> parameters); Map<String, Object> addUser(User user, Integer currentUserId); screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
@@ -1,26 +1,29 @@ package com.moral.api.service.impl; import io.swagger.models.auth.In; import java.util.ArrayList; import java.util.Date; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.Group; import com.moral.api.entity.Menu; import com.moral.api.entity.User; import com.moral.api.mapper.GroupMapper; import com.moral.api.mapper.MenuMapper; import com.moral.api.mapper.OrganizationMapper; import com.moral.api.mapper.UserMapper; import com.moral.api.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.redis.RedisUtil; import com.moral.util.AESUtils; import com.moral.util.MD5Utils; import com.moral.util.TokenUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; /** @@ -37,32 +40,120 @@ @Autowired private UserMapper userMapper; @Autowired private GroupMapper groupMapper; @Autowired private MenuMapper menuMapper; @Autowired private OrganizationMapper organizationMapper; @Value("${AES.KEY}") private String AESKey; @Override public Map<String, Object> login(String account, String password) { Map<String, Object> resultMap = new HashMap<>(); public Map<String, Object> login(Map<String, Object> parameters) { Map<String, Object> resultMap = new LinkedHashMap<>(); //接收参数 String account = parameters.get("account").toString(); String password = parameters.get("password").toString(); //解密 account = AESUtils.decrypt(account, AESKey); password = AESUtils.decrypt(password, AESKey); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("account", account).eq("password", password).eq("is_Delete", "0"); //校验账户 queryWrapper.eq("account", account); User user = userMapper.selectOne(queryWrapper); String msg; String token = null; if (user == null) { msg = "用户名或密码错误"; } else if (user.getExpireTime() != null && user.getExpireTime().getTime() < System.currentTimeMillis()) { msg = "你的账户已过期"; msg = "用户名不存在"; } else { msg = "登陆成功"; token = user.getId() + "-" + UUID.randomUUID().toString().replaceAll("-", ""); Set<Group> groups = userMapper.selectUserGroup(user.getId()); Set<Menu> menus = userMapper.selectUserMenu(user.getId()); user.setGroups(groups); user.setMenus(menus); RedisUtil.set(token, user, 1296000); if (!MD5Utils.saltMD5Verify(password, user.getPassword())) {//校验密码 msg = "密码错误"; } else if ("1".equals(user.getIsDelete())) { msg = "账户已被删除"; } else if (user.getExpireTime() != null && user.getExpireTime().getTime() < System.currentTimeMillis()) { msg = "你的账户已过期"; } else { int userId = user.getId(); //查询地图等级 Map<String, Object> orgMap = organizationMapper.selectOrganizationById(user.getOrganizationId()); String locationCode = orgMap.get(orgMap.get("location_level").toString()).toString(); //封装用户信息 Map<String, Object> userInfo = new LinkedHashMap<>(); userInfo.put("userId", userId); userInfo.put("account", user.getAccount()); userInfo.put("userName", user.getUserName()); userInfo.put("organizationId", user.getOrganizationId()); userInfo.put("locationCode", locationCode); List<Map<String, Object>> groups = groupMapper.selectUserGroup(userId); userInfo.put("groups", groups); userInfo.putAll(getMenus(userId)); //生成token,并存入redis String token = TokenUtils.getToken(user.getId().toString(), userInfo); resultMap.put("token", token); resultMap.putAll(userInfo); return resultMap; } } resultMap.put("token", token); resultMap.put("msg", msg); return resultMap; } //根据userId获取用户层级菜单 private Map<String, Object> getMenus(int userId) { List<Menu> allMenus = menuMapper.selectUserMenu(userId); Map<String, Object> resultMap = new LinkedHashMap<>(); //第一级菜单 List<Menu> oneMenu = allMenus.stream() .filter(o -> o.getParentId().equals(0)) .sorted(Comparator.comparing(Menu::getOrder)) .collect(Collectors.toList()); List<Map<String, Object>> newList = new ArrayList<>(); //遍历一级菜单 oneMenu.forEach(o -> { Map<String, Object> menuMap = new LinkedHashMap<>(); menuMap.put("id", o.getId()); menuMap.put("name", o.getName()); menuMap.put("url", o.getUrl()); menuMap.put("icon", o.getIcon()); menuMap.put("menus", getMenusByRecursion(o, allMenus)); newList.add(menuMap); }); resultMap.put("menus", newList); return resultMap; } //获取用户层级菜单递归方法 private List<Map<String, Object>> getMenusByRecursion(Menu menu, List<Menu> menus) { List<List<Map<String, Object>>> resultList = new ArrayList(); Menu newMenu = new Menu(); newMenu.setParentId(menu.getId()); //筛选出下一级菜单信息 List<Menu> nextLevelMenus = menus.stream() .filter(o -> o.getParentId().equals(menu.getId())) .collect(Collectors.toList()); List<Map<String, Object>> list = new ArrayList<>(); if (nextLevelMenus.size() > 0) { //遍历下一级菜单信息,并封装返回参数 nextLevelMenus.forEach(o -> { Map<String, Object> menuMap = new LinkedHashMap<>(); menuMap.put("id", o.getId()); menuMap.put("name", o.getName()); menuMap.put("url", o.getUrl()); menuMap.put("icon", o.getIcon()); //调用递归体 menuMap.put("menus", getMenusByRecursion(o, menus)); list.add(menuMap); }); resultList.add(list); } return list; } @Override public Map<String, Object> addUser(User user, Integer userId) { Map<String, Object> resultMap = new HashMap<>(); screen-api/src/main/resources/application-dev.yml
@@ -2,13 +2,13 @@ port: 8081 tomcat: uri-encoding: UTF-8 #最小线程数 #最小线程数 min-spare-threads: 500 #最大线程数 #最大线程数 max-threads: 2500 #最大链接数 #最大链接数 max-connections: 6500 #最大等待队列长度 #最大等待队列长度 accept-count: 1000 spring: profiles: @@ -17,10 +17,10 @@ name: screen-api redis: #cluster: #nodes: 47.112.126.78:7001,47.112.126.78:7002,47.112.126.132:7003,47.112.126.132:7004,47.112.132.193:7005,47.112.132.193:7006 #nodes: 47.112.126.78:7001,47.112.126.78:7002,47.112.126.132:7003,47.112.126.132:7004,47.112.132.193:7005,47.112.132.193:7006 #password: test #timeout: 500 host: 39.97.177.149 host: 39.97.177.149 port: 6379 password: chenkaiyu111 timeout: 30000 @@ -41,7 +41,7 @@ port: 6379 password: chenkaiyu111 timeout: 30000 database: 14 database: 15 pool: max-active: 256 max-wait: 30000 @@ -77,9 +77,9 @@ field-strategy: NOT_EMPTY db-type: MYSQL configuration: map-underscore-to-camel-case: true call-setters-on-nulls: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true call-setters-on-nulls: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl kafka: listener: screen-api/src/main/resources/mapper/GroupMapper.xml
@@ -2,14 +2,29 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.moral.api.mapper.GroupMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.Group"> <id column="id" property="id" /> <result column="group_name" property="groupName" /> <result column="organization_id" property="organizationId" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="is_delete" property="isDelete" /> </resultMap> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.Group"> <id column="id" property="id"/> <result column="group_name" property="groupName"/> <result column="organization_id" property="organizationId"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <result column="is_delete" property="isDelete"/> </resultMap> <resultMap id="GroupResultMap" type="java.util.LinkedHashMap"> <id column="id" property="id"/> <result column="group_name" property="groupName"/> <result column="organization_id" property="organizationId"/> </resultMap> <select id="selectUserGroup" resultMap="GroupResultMap"> SELECT g.id,g.group_name FROM `group` g,`user_group` ug WHERE ug.user_id = #{userId} AND ug.group_id = g.id AND g.is_delete = 0 AND ug.is_delete = 0 ORDER BY g.id </select> </mapper> screen-api/src/main/resources/mapper/MenuMapper.xml
@@ -15,4 +15,24 @@ <result column="is_delete" property="isDelete"/> </resultMap> <resultMap id="MenuResultMap" type="com.moral.api.entity.Menu"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="url" property="url"/> <result column="icon" property="icon"/> <result column="parent_id" property="parentId"/> <result column="order" property="order" jdbcType="INTEGER"/> </resultMap> <select id="selectUserMenu" resultMap="MenuResultMap"> SELECT DISTINCT m.id,m.name,m.url,m.icon,m.parent_id,m.order FROM `user_group` ug,`group_menu` gm,`menu` m WHERE ug.user_id = #{userId} AND ug.group_id = gm.group_id AND gm.menu_id = m.id AND ug.is_delete = 0 AND gm.is_delete = 0 AND m.is_delete = 0 ORDER by m.`order` </select> </mapper> screen-api/src/main/resources/mapper/OrganizationMapper.xml
@@ -2,26 +2,29 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.moral.api.mapper.OrganizationMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.Organization"> <id column="id" property="id" /> <result column="parent_id" property="parentId" /> <result column="admin_user_id" property="adminUserId" /> <result column="name" property="name" /> <result column="province_code" property="provinceCode" /> <result column="city_code" property="cityCode" /> <result column="area_code" property="areaCode" /> <result column="town_code" property="townCode" /> <result column="village_code" property="villageCode" /> <result column="location_level" property="locationLevel" /> <result column="address" property="address" /> <result column="phone" property="phone" /> <result column="email" property="email" /> <result column="wechat" property="wechat" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="expire_time" property="expireTime" /> <result column="is_delete" property="isDelete" /> </resultMap> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.Organization"> <id column="id" property="id"/> <result column="parent_id" property="parentId"/> <result column="admin_user_id" property="adminUserId"/> <result column="name" property="name"/> <result column="province_code" property="provinceCode"/> <result column="city_code" property="cityCode"/> <result column="area_code" property="areaCode"/> <result column="town_code" property="townCode"/> <result column="village_code" property="villageCode"/> <result column="location_level" property="locationLevel"/> <result column="address" property="address"/> <result column="phone" property="phone"/> <result column="email" property="email"/> <result column="wechat" property="wechat"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <result column="expire_time" property="expireTime"/> <result column="is_delete" property="isDelete"/> </resultMap> <select id="selectOrganizationById" resultType="java.util.Map"> SELECT * FROM organization WHERE id= #{orgId} </select> </mapper> screen-api/src/main/resources/mapper/UserMapper.xml
@@ -2,41 +2,21 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.moral.api.mapper.UserMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.User"> <id column="id" property="id" /> <result column="is_admin" property="isAdmin" /> <result column="account" property="account" /> <result column="password" property="password" /> <result column="user_name" property="userName" /> <result column="organization_id" property="organizationId" /> <result column="email" property="email" /> <result column="mobile" property="mobile" /> <result column="wechat" property="wechat" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="expire_time" property="expireTime" /> <result column="is_delete" property="isDelete" /> </resultMap> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.User"> <id column="id" property="id"/> <result column="is_admin" property="isAdmin"/> <result column="account" property="account"/> <result column="password" property="password"/> <result column="user_name" property="userName"/> <result column="organization_id" property="organizationId"/> <result column="email" property="email"/> <result column="mobile" property="mobile"/> <result column="wechat" property="wechat"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <result column="expire_time" property="expireTime"/> <result column="is_delete" property="isDelete"/> </resultMap> <select id="selectUserGroup" resultType="com.moral.api.entity.Group"> SELECT g.* FROM `group` g,`user_group` ug WHERE ug.user_id = #{userId} AND ug.group_id = g.id AND g.is_delete = 0 AND ug.is_delete = 0 </select> <select id="selectUserMenu" resultType="com.moral.api.entity.Menu"> SELECT DISTINCT m.* FROM `user_group` ug,`group_menu` gm,`menu` m WHERE ug.user_id = #{userId} and ug.group_id = gm.group_id and gm.menu_id = m.id and ug.is_delete = 0 and gm.is_delete = 0 and m.is_delete = 0 ORDER by m.`order` </select> </mapper> screen-common/src/main/java/com/moral/util/WebUtils.java
New file @@ -0,0 +1,44 @@ package com.moral.util; import java.util.Enumeration; import java.util.Map; import java.util.TreeMap; import javax.servlet.ServletRequest; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; public class WebUtils extends org.springframework.web.util.WebUtils { public static Map<String, Object> getParametersStartingWith(ServletRequest request, String prefix) { Assert.notNull(request, "Request must not be null"); Enumeration<String> paramNames = request.getParameterNames(); Map<String, Object> params = new TreeMap<String, Object>(); if (prefix == null) { prefix = ""; } while (paramNames != null && paramNames.hasMoreElements()) { String paramName = paramNames.nextElement(); if ("".equals(prefix) || paramName.startsWith(prefix)) { String unprefixed = paramName.substring(prefix.length()); String[] values = request.getParameterValues(paramName); if (values == null || values.length == 0 ) { // Do nothing, no values found at all. } else if (values.length > 1) { params.put(unprefixed, values); } else { if (!ObjectUtils.isEmpty(values[0]) && !"null".equalsIgnoreCase(values[0])) { if ("sorter".equals(unprefixed)) { params.put(unprefixed, values[0].replace("end", "")); } else { params.put(unprefixed, values[0]); } } } } } return params; } }