diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521a..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.m2/settings.xml b/.m2/settings.xml new file mode 100644 index 000000000..615216734 --- /dev/null +++ b/.m2/settings.xml @@ -0,0 +1,20 @@ + + + + + nexus + developer + 123456 + + + + + nexus + collcollege + http://nexus.coolcollege.cn/repository/maven-public/ + central + + + \ No newline at end of file diff --git a/coolstore-partner-common/coolstore-partner-common.iml b/coolstore-partner-common/coolstore-partner-common.iml new file mode 100644 index 000000000..1de68ac5e --- /dev/null +++ b/coolstore-partner-common/coolstore-partner-common.iml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-common/pom.xml b/coolstore-partner-common/pom.xml new file mode 100644 index 000000000..d1a2206a8 --- /dev/null +++ b/coolstore-partner-common/pom.xml @@ -0,0 +1,46 @@ + + + + coolstore-partner-manage + com.coolstore + 1.0.0 + + 4.0.0 + + coolstore-partner-common + + + 8 + 8 + + + + + org.apache.commons + commons-lang3 + + + org.projectlombok + lombok + + + com.alibaba + fastjson + + + org.apache.commons + commons-collections4 + + + org.apache.commons + commons-pool2 + + + redis.clients + jedis + + + + \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/model/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/model/constants/CommonConstants.java new file mode 100644 index 000000000..b1d27e08e --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/model/constants/CommonConstants.java @@ -0,0 +1,13 @@ +package com.cool.store.model.constants; + +/** + * @author zhangchenbiao + * @FileName: CommonConstatns + * @Description: + * @date 2023-05-18 14:47 + */ +public class CommonConstants { + + public static final String DEFAULT_DB = "coolcollege_intelligent_config"; + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/model/utils/RedisUtilPool.java b/coolstore-partner-common/src/main/java/com/cool/store/model/utils/RedisUtilPool.java new file mode 100644 index 000000000..a6a529a73 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/model/utils/RedisUtilPool.java @@ -0,0 +1,1418 @@ +package com.cool.store.model.utils; + +import org.apache.commons.lang3.StringUtils; +import redis.clients.jedis.*; + +import java.util.*; + +/** + * 内存数据库Redis的辅助类,负责对内存数据库的所有操作 + * + * @author fengjc + * @version V1.0 + */ +public class RedisUtilPool { + // 数据源 + private ShardedJedisPool shardedJedisPool; + + /** + * dbIndex和连接池的映射 + */ + private Map shardedJedisPoolMap; + + private static final String LOCK_SUCCESS = "OK"; + private static final String SET_IF_NOT_EXIST = "NX"; + private static final String SET_WITH_EXPIRE_TIME = "PX"; + + /** + * 它保证在执行操作之后释放数据源returnResource(jedis) + * + * @param + * @author fengjc + * @version V1.0 + */ + abstract class Executor { + + ShardedJedis jedis; + ShardedJedisPool shardedJedisPool; + + public Executor(ShardedJedisPool shardedJedisPool) { + this.shardedJedisPool = shardedJedisPool; + jedis = this.shardedJedisPool.getResource(); + } + + /** + * 回调 + * + * @return 执行结果 + */ + abstract T execute(); + + /** + * 调用{@link #execute()}并返回执行结果 + * 它保证在执行{@link #execute()}之后释放数据源returnResource(jedis) + * + * @return 执行结果 + */ + public T getResult() { + T result = null; + try { + result = execute(); + } catch (Throwable e) { + throw new RuntimeException("Redis execute exception", e); + } finally { + if (jedis != null) { + jedis.close(); + } + } + return result; + } + } + + /** + * 删除模糊匹配的key + * + * @param likeKey 模糊匹配的key + * @return 删除成功的条数 + */ + public long delKeysLike(final String likeKey) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + Collection jedisC = jedis.getAllShards(); + Iterator iter = jedisC.iterator(); + long count = 0; + while (iter.hasNext()) { + Jedis _jedis = iter.next(); + Set keys = _jedis.keys(likeKey + "*"); + if (keys != null && keys.size() > 0) + count += _jedis.del(keys.toArray(new String[keys.size()])); + } + return count; + } + }.getResult(); + } + + /** + * 删除 + * + * @param key 匹配的key + * @return 删除成功的条数 + */ + public Long delKey(final String key) { + return new Executor(shardedJedisPool) { + @Override + Long execute() { + return jedis.del(key); + } + }.getResult(); + } + + /** + * 删除 + * + * @param key 匹配的key + * @return 删除成功的条数 + */ + public Long delKey(final String key, final Integer dbIndex) { + ShardedJedisPool jedisPool = null; + if (null != shardedJedisPoolMap) { + jedisPool = shardedJedisPoolMap.get(dbIndex); + } + if (null == jedisPool) { + jedisPool = shardedJedisPool; + } + return new Executor(jedisPool) { + @Override + Long execute() { + return jedis.del(key); + } + }.getResult(); + + } + + /** + * 删除 + * + * @param keys 匹配的key的集合 + * @return 删除成功的条数 + */ + public Long delKeys(final String[] keys) { + return new Executor(shardedJedisPool) { + @Override + Long execute() { + Collection jedisC = jedis.getAllShards(); + Iterator iter = jedisC.iterator(); + long count = 0; + while (iter.hasNext()) { + Jedis _jedis = iter.next(); + count += _jedis.del(keys); + } + return count; + } + }.getResult(); + } + + /** + * 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。 + * 在 Redis 中,带有生存时间的 key 被称为『可挥发』(volatile)的。 + * + * @param key key + * @param expire 生命周期,单位为秒 + * @return 1: 设置成功 0: 已经超时或key不存在 + */ + public Long expire(final String key, final int expire) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.expire(key, expire); + } + }.getResult(); + } + + /** + * 获取给定key的剩余有效时间 + * + * @param key + * @return + */ + public Long getExpire(final String key) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.ttl(key); + } + }.getResult(); + } + + + /** + * 一个跨jvm的id生成器,利用了redis原子性操作的特点 + * + * @param key id的key + * @return 返回生成的Id + */ + public long makeId(final String key) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + long id = jedis.incr(key); + if ((id + 75807) >= Long.MAX_VALUE) { + // 避免溢出,重置,getSet命令之前允许incr插队,75807就是预留的插队空间 + jedis.getSet(key, "0"); + } + return id; + } + }.getResult(); + } + + /* ======================================Strings====================================== */ + + /** + * 将字符串值 value 关联到 key 。 + * 如果 key 已经持有其他值, setString 就覆写旧值,无视类型。 + * 对于某个原本带有生存时间(TTL)的键来说, 当 setString 成功在这个键上执行时, 这个键原有的 TTL 将被清除。 + * 时间复杂度:O(1) + * + * @param key key + * @param value string value + * @return 在设置操作成功完成时,才返回 OK 。 + */ + public String setString(final String key, final String value) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + return jedis.set(key, value); + } + }.getResult(); + } + + /** + * 将值 value 关联到 key ,并将 key 的生存时间设为 expire (以秒为单位)。 + * 如果 key 已经存在, 将覆写旧值。 + * 类似于以下两个命令: + * SET key value + * EXPIRE key expire # 设置生存时间 + * 不同之处是这个方法是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,在 Redis 用作缓存时,非常实用。 + * 时间复杂度:O(1) + * + * @param key key + * @param value string value + * @param expire 生命周期 + * @return 设置成功时返回 OK 。当 expire 参数不合法时,返回一个错误。 + */ + public String setString(final String key, final String value, final int expire) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + return jedis.setex(key, expire, value); + } + }.getResult(); + } + + + /** + * 时间复杂度: O(1) + * 为键 key 储存的数字值加上增量 increment 。 + * 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。 + * 如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误。 + * 本操作的值限制在 64 位(bit)有符号数字表示之内。 + * + * @param key key + * @param increment 计数步长 + * @return 在加上增量 increment 之后, 键 key 当前的值。 + */ + public Long incrby(final String key, final long increment) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.incrBy(key, increment); + } + }.getResult(); + } + + public Long incrby(final String key, final long increment, int cacheTime) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + Long result = jedis.incrBy(key, increment); + expire(key, cacheTime); + return result; + } + }.getResult(); + } + + /** + * 将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 setStringIfNotExists 不做任何动作。 + * 时间复杂度:O(1) + * + * @param key key + * @param value string value + * @return 设置成功,返回 1 。设置失败,返回 0 。 + */ + public Long setStringIfNotExists(final String key, final String value) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.setnx(key, value); + } + }.getResult(); + } + + /** + * 将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 setNxExpire 不做任何动作。 + * + * 时间复杂度:O(1) + * + * @param key key + * @param value string value + * @param expire 超时时间 + * @return 设置成功,返回 true 。设置失败,返回 false 。 + */ + public boolean setNxExpire(final String key, final String value, final int expire) { + String res = new Executor(shardedJedisPool) { + @Override + String execute() { + return jedis.set(key, value, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expire); + } + }.getResult(); + return res != null && res.equals(LOCK_SUCCESS); + } + + /** + * 返回 key 所关联的字符串值。如果 key 不存在那么返回特殊值 nil 。 + * 假如 key 储存的值不是字符串类型,返回一个错误,因为 getString 只能用于处理字符串值。 + * 时间复杂度: O(1) + * + * @param key key + * @return 当 key 不存在时,返回 nil ,否则,返回 key 的值。如果 key 不是字符串类型,那么返回一个错误。 + */ + public String getString(final String key) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + return jedis.get(key); + } + }.getResult(); + } + + /** + * 批量的 {@link #setString(String, String)} + * + * @param pairs 键值对数组{数组第一个元素为key,第二个元素为value} + * @return 操作状态的集合 + */ + public List batchSetString(final List> pairs) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + for (Pair pair : pairs) { + pipeline.set(pair.getKey(), pair.getValue()); + } + return pipeline.syncAndReturnAll(); + } + }.getResult(); + } + + /** + * 批量的 {@link #getString(String)} + * + * @param keys key数组 + * @return value的集合 + */ + public List batchGetString(final String[] keys) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + List result = new ArrayList(keys.length); + List> responses = new ArrayList>(keys.length); + for (String key : keys) { + responses.add(pipeline.get(key)); + } + pipeline.sync(); + for (Response resp : responses) { + result.add(resp.get()); + } + return result; + } + }.getResult(); + } + + /* ======================================Hashes====================================== */ + + /** + * 将哈希表 key 中的域 field 的值设为 value 。 + * 如果 key 不存在,一个新的哈希表被创建并进行 hashSet 操作。 + * 如果域 field 已经存在于哈希表中,旧值将被覆盖。 + * 时间复杂度: O(1) + * + * @param key key + * @param field 域 + * @param value string value + * @return 如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。 + */ + public Long hashSet(final String key, final String field, final String value) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.hset(key, field, value); + } + }.getResult(); + } + + /** + * 将哈希表 key 中的域 field 的值设为 value 。 + * 如果 key 不存在,一个新的哈希表被创建并进行 hashSet 操作。 + * 如果域 field 已经存在于哈希表中,旧值将被覆盖。 + * + * @param key key + * @param field 域 + * @param value string value + * @param expire 生命周期,单位为秒 + * @return 如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。 + */ + public Long hashSet(final String key, final String field, final String value, final int expire) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + Pipeline pipeline = jedis.getShard(key).pipelined(); + Response result = pipeline.hset(key, field, value); + pipeline.expire(key, expire); + pipeline.sync(); + return result.get(); + } + }.getResult(); + } + + /** + * 返回哈希表 key 中给定域 field 的值。 + * 时间复杂度:O(1) + * + * @param key key + * @param field 域 + * @return 给定域的值。当给定域不存在或是给定 key 不存在时,返回 nil 。 + */ + public String hashGet(final String key, final String field) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + return jedis.hget(key, field); + } + }.getResult(); + } + + /** + * 返回哈希表 key 中给定域 field 的值。 + * 时间复杂度:O(1) + * + * @param key key + * @param field 域 + * @return 给定域的值。当给定域不存在或是给定 key 不存在时,返回 nil 。 + */ + public String hashGetByIdx(final String key, final String field, final int dbIndex) { + ShardedJedisPool jedisPool = null; + if (null != shardedJedisPoolMap) { + jedisPool = shardedJedisPoolMap.get(dbIndex); + } + if (null == jedisPool) { + jedisPool = shardedJedisPool; + } + return new Executor(jedisPool) { + + @Override + String execute() { + return jedis.hget(key, field); + } + }.getResult(); + } + + /** + * 返回哈希表 key对应的所有值 + * 时间复杂度:O(1) + * + * @param key key + * @return 给定域的值。当给定域不存在或是给定 key 不存在时,返回 nil 。 + */ + public Map hashGetAllByIdx(final String key, final int dbIndex) { + ShardedJedisPool jedisPool = null; + if (null != shardedJedisPoolMap) { + jedisPool = shardedJedisPoolMap.get(dbIndex); + } + if (null == jedisPool) { + jedisPool = shardedJedisPool; + } + return new Executor>(jedisPool) { + + @Override + Map execute() { + return jedis.hgetAll(key); + } + }.getResult(); + } + + /** + * 返回哈希表 key 中给定域 field 的值。 如果哈希表 key 存在,同时设置这个 key 的生存时间 + * + * @param key key + * @param field 域 + * @param expire 生命周期,单位为秒 + * @return 给定域的值。当给定域不存在或是给定 key 不存在时,返回 nil 。 + */ + public String hashGet(final String key, final String field, final int expire) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + Pipeline pipeline = jedis.getShard(key).pipelined(); + Response result = pipeline.hget(key, field); + pipeline.expire(key, expire); + pipeline.sync(); + return result.get(); + } + }.getResult(); + } + + /** + * 同时将多个 field-value (域-值)对设置到哈希表 key 中。 + * 时间复杂度: O(N) (N为fields的数量) + * + * @param key key + * @param hash field-value的map + * @return 如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。 + */ + public String hashMultipleSet(final String key, final Map hash) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + return jedis.hmset(key, hash); + } + }.getResult(); + } + + /** + * 同时将多个 field-value (域-值)对设置到哈希表 key 中。同时设置这个 key 的生存时间 + * + * @param key key + * @param hash field-value的map + * @param expire 生命周期,单位为秒 + * @return 如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。 + */ + public String hashMultipleSet(final String key, final Map hash, final int expire) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + Pipeline pipeline = jedis.getShard(key).pipelined(); + Response result = pipeline.hmset(key, hash); + pipeline.expire(key, expire); + pipeline.sync(); + return result.get(); + } + }.getResult(); + } + + /** + * 返回哈希表 key 中,一个或多个给定域的值。如果给定的域不存在于哈希表,那么返回一个 nil 值。 + * 时间复杂度: O(N) (N为fields的数量) + * + * @param key key + * @param fields field的数组 + * @return 一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。 + */ + public List hashMultipleGet(final String key, final String... fields) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + return jedis.hmget(key, fields); + } + }.getResult(); + } + + /** + * 返回哈希表 key 中,一个或多个给定域的值。如果给定的域不存在于哈希表,那么返回一个 nil 值。 + * 同时设置这个 key 的生存时间 + * + * @param key key + * @param fields field的数组 + * @param expire 生命周期,单位为秒 + * @return 一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。 + */ + public List hashMultipleGet(final String key, final int expire, final String... fields) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + Pipeline pipeline = jedis.getShard(key).pipelined(); + Response> result = pipeline.hmget(key, fields); + pipeline.expire(key, expire); + pipeline.sync(); + return result.get(); + } + }.getResult(); + } + + /** + * 批量的{@link #hashMultipleSet(String, Map)},在管道中执行 + * + * @param pairs 多个hash的多个field + * @return 操作状态的集合 + */ + public List batchHashMultipleSet(final List>> pairs) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + for (Pair> pair : pairs) { + pipeline.hmset(pair.getKey(), pair.getValue()); + } + return pipeline.syncAndReturnAll(); + } + }.getResult(); + } + + /** + * 批量的{@link #hashMultipleSet(String, Map)},在管道中执行 + * + * @param data Map>格式的数据 + * @return 操作状态的集合 + */ + public List batchHashMultipleSet(final Map> data) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + for (Map.Entry> iter : data.entrySet()) { + pipeline.hmset(iter.getKey(), iter.getValue()); + } + return pipeline.syncAndReturnAll(); + } + }.getResult(); + } + + /** + * 批量的{@link #hashMultipleGet(String, String...)},在管道中执行 + * + * @param pairs 多个hash的多个field + * @return 执行结果的集合 + */ + public List> batchHashMultipleGet(final List> pairs) { + return new Executor>>(shardedJedisPool) { + + @Override + List> execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + List> result = new ArrayList>(pairs.size()); + List>> responses = new ArrayList>>(pairs.size()); + for (Pair pair : pairs) { + responses.add(pipeline.hmget(pair.getKey(), pair.getValue())); + } + pipeline.sync(); + for (Response> resp : responses) { + result.add(resp.get()); + } + return result; + } + }.getResult(); + + } + + /** + * 返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。 + * 时间复杂度: O(N) + * + * @param key key + * @return 以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。 + */ + public Map hashGetAll(final String key) { + return new Executor>(shardedJedisPool) { + @Override + Map execute() { + return jedis.hgetAll(key); + } + }.getResult(); + } + + /** + * 返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。 + * 同时设置这个 key 的生存时间 + * + * @param key key + * @param expire 生命周期,单位为秒 + * @return 以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。 + */ + public Map hashGetAll(final String key, final int expire) { + return new Executor>(shardedJedisPool) { + + @Override + Map execute() { + Pipeline pipeline = jedis.getShard(key).pipelined(); + Response> result = pipeline.hgetAll(key); + pipeline.expire(key, expire); + pipeline.sync(); + return result.get(); + } + }.getResult(); + } + + /** + * 批量的{@link #hashGetAll(String)} + * + * @param keys key的数组 + * @return 执行结果的集合 + */ + public List> batchHashGetAll(final String... keys) { + return new Executor>>(shardedJedisPool) { + + @Override + List> execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + List> result = new ArrayList>(keys.length); + List>> responses = new ArrayList>>(keys.length); + for (String key : keys) { + responses.add(pipeline.hgetAll(key)); + } + pipeline.sync(); + for (Response> resp : responses) { + result.add(resp.get()); + } + return result; + } + }.getResult(); + } + + /** + * 批量的{@link #hashMultipleGet(String, String...)},与{@link #batchHashGetAll(String...)}不同的是,返回值为Map类型 + * + * @param keys key的数组 + * @return 多个hash的所有filed和value + */ + public Map> batchHashGetAllForMap(final String... keys) { + return new Executor>>(shardedJedisPool) { + + @Override + Map> execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + + // 设置map容量防止rehash + int capacity = 1; + while ((int) (capacity * 0.75) <= keys.length) { + capacity <<= 1; + } + Map> result = new HashMap>(capacity); + List>> responses = new ArrayList>>(keys.length); + for (String key : keys) { + responses.add(pipeline.hgetAll(key)); + } + pipeline.sync(); + for (int i = 0; i < keys.length; ++i) { + result.put(keys[i], responses.get(i).get()); + } + return result; + } + }.getResult(); + } + + /** + * 删除掉hashkey 所对应的value + * + * @param key hash的key + * @param field map 的field + * @return + */ + public long hashDel(final String key, final String... field) { + + return new Executor(shardedJedisPool) { + @Override + Long execute() { + return jedis.hdel(key, field); + } + }.getResult(); + } + + /** + * 删除掉hashkey 所对应的value + * + * @param key hash的key + * @param field map 的field + * @return + */ + public long hashDelByIdx(final String key, final int dbIndex, final String... field) { + ShardedJedisPool jedisPool = null; + if (null != shardedJedisPoolMap) { + jedisPool = shardedJedisPoolMap.get(dbIndex); + } + if (null == jedisPool) { + jedisPool = shardedJedisPool; + } + return new Executor(jedisPool) { + @Override + Long execute() { + return jedis.hdel(key, field); + } + }.getResult(); + } + + /* ======================================List====================================== */ + + /** + * 将一个或多个值 value 插入到列表 key 的表尾(最右边)。 + * + * @param key key + * @param values value的数组 + * @return 执行 listPushTail 操作后,表的长度 + */ + public Long listPushTail(final String key, final String... values) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.rpush(key, values); + } + }.getResult(); + } + + /** + * 将一个或多个值 value 插入到列表 key 的表头 + * + * @param key key + * @param value string value + * @return 执行 listPushHead 命令后,列表的长度。 + */ + public Long listPushHead(final String key, final String value) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.lpush(key, value); + } + }.getResult(); + } + + /** + * 将一个或多个值 value 插入到列表 key 的表头, 当列表大于指定长度是就对列表进行修剪(trim) + * + * @param key key + * @param value string value + * @param size 链表超过这个长度就修剪元素 + * @return 执行 listPushHeadAndTrim 命令后,列表的长度。 + */ + public Long listPushHeadAndTrim(final String key, final String value, final long size) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + Pipeline pipeline = jedis.getShard(key).pipelined(); + Response result = pipeline.lpush(key, value); + // 修剪列表元素, 如果 size - 1 比 end 下标还要大,Redis将 size 的值设置为 end 。 + pipeline.ltrim(key, 0, size - 1); + pipeline.sync(); + return result.get(); + } + }.getResult(); + } + + /** + * 修剪列表 + */ + public Long listLRem(final String key, final String value) { + return new Executor(shardedJedisPool) { + @Override + Long execute() { + Long result = jedis.lrem(key, 1L, value); + return result; + } + }.getResult(); + } + + public Long rpop(final String key) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + String result = jedis.rpop(key); + if (StringUtils.isBlank(result)) { + return null; + } + return Long.valueOf(result); + } + }.getResult(); + } + + public String rpopStr(final String key) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + String result = jedis.rpop(key); + if (StringUtils.isBlank(result)) { + return null; + } + return result; + } + }.getResult(); + } + + + public String rpopForStr(final String key) { + return new Executor(shardedJedisPool) { + + @Override + String execute() { + return jedis.rpop(key); + } + }.getResult(); + } + + /** + * 指定db上原子加一 + * + * @param key + * @param dbIndex + * @return + */ + public Long incrementAndGet(final String key, final Integer dbIndex) { + ShardedJedisPool jedisPool = null; + if (null != shardedJedisPoolMap) { + jedisPool = shardedJedisPoolMap.get(dbIndex); + + } + if (null == jedisPool) { + jedisPool = shardedJedisPool; + } + return new Executor(jedisPool) { + + @Override + Long execute() { + + return jedis.incr(key); + } + }.getResult(); + } + + + /** + * 同{@link #(String, String[], boolean)},不同的是利用redis的事务特性来实现 + * + * @param key key + * @param values value的数组 + * @return null + */ + public Object updateListInTransaction(final String key, final List values) { + return new Executor(shardedJedisPool) { + + @Override + Object execute() { + Transaction transaction = jedis.getShard(key).multi(); + transaction.del(key); + for (String value : values) { + transaction.rpush(key, value); + } + transaction.exec(); + return null; + } + }.getResult(); + } + + + /** + * 返回list所有元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素,key不存在返回空列表 + * + * @param key key + * @return list所有元素 + */ + public List listGetAll(final String key) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + return jedis.lrange(key, 0, -1); + } + }.getResult(); + } + + /** + * 返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素,key不存在返回空列表 + * + * @param key key + * @param beginIndex 下标开始索引(包含) + * @param endIndex 下标结束索引(不包含) + * @return 指定区间内的元素 + */ + public List listRange(final String key, final long beginIndex, final long endIndex) { + return new Executor>(shardedJedisPool) { + + @Override + List execute() { + return jedis.lrange(key, beginIndex, endIndex - 1); + } + }.getResult(); + } + + /** + * 一次获得多个链表的数据 + * + * @param keys key的数组 + * @return 执行结果 + */ + public Map> batchGetAllList(final List keys) { + return new Executor>>(shardedJedisPool) { + + @Override + Map> execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + Map> result = new HashMap>(); + List>> responses = new ArrayList>>(keys.size()); + for (String key : keys) { + responses.add(pipeline.lrange(key, 0, -1)); + } + pipeline.sync(); + for (int i = 0; i < keys.size(); ++i) { + result.put(keys.get(i), responses.get(i).get()); + } + return result; + } + }.getResult(); + } + + /* ======================================Pub/Sub====================================== */ + + /** + * 将信息 message 发送到指定的频道 channel。 + * 时间复杂度:O(N+M),其中 N 是频道 channel 的订阅者数量,而 M 则是使用模式订阅(subscribed patterns)的客户端的数量。 + * + * @param channel 频道 + * @param message 信息 + * @return 接收到信息 message 的订阅者数量。 + */ + public Long publish(final String channel, final String message) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + Jedis _jedis = jedis.getShard(channel); + return _jedis.publish(channel, message); + } + + }.getResult(); + } + + /** + * 订阅给定的一个频道的信息。 + * + * @param jedisPubSub 监听器 + * @param channel 频道 + */ + public void subscribe(final JedisPubSub jedisPubSub, final String channel) { + new Executor(shardedJedisPool) { + + @Override + Object execute() { + Jedis _jedis = jedis.getShard(channel); + // 注意subscribe是一个阻塞操作,因为当前线程要轮询Redis的响应然后调用subscribe + _jedis.subscribe(jedisPubSub, channel); + return null; + } + }.getResult(); + } + + /** + * 取消订阅 + * + * @param jedisPubSub 监听器 + */ + public void unSubscribe(final JedisPubSub jedisPubSub) { + jedisPubSub.unsubscribe(); + } + + /* ======================================Sorted set================================= */ + + /** + * 将一个 member 元素及其 score 值加入到有序集 key 当中。 + * + * @param key key + * @param score score 值可以是整数值或双精度浮点数。 + * @param member 有序集的成员 + * @return 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。 + */ + public Long addWithSortedSet(final String key, final double score, final String member) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.zadd(key, score, member); + } + }.getResult(); + } + + /** + * 返回指定key的数量 + * @param key + * @return + */ + public Long zcard(String key) { + return new Executor(shardedJedisPool) { + @Override + Long execute() { + return jedis.zcard(key); + } + }.getResult(); + } + + /** + * 将多个 member 元素及其 score 值加入到有序集 key 当中。 + * + * @param key key + * @param scoreMembers score、member的pair + * @return 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。 + */ + public Long addWithSortedSet(final String key, final Map scoreMembers) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.zadd(key, scoreMembers); + } + }.getResult(); + } + + /** + * 返回有序集 key 中, 介于 start 和 end 之间(默认包括等于 start 或 end )的所有的成员。 + * 有序集成员按 score 值递减(从大到小)的次序排列。 + * + * @param key key + * @param start 起始位置 0代表第一位 + * @param end 结束位置 -1代表末尾 + * @return 指定区间内,带有 score 值(可选)的有序集成员的列表 + */ + public Set zrange(final String key, final long start, final long end) { + return new Executor>(shardedJedisPool) { + + @Override + Set execute() { + return jedis.zrange(key, start, end); + } + }.getResult(); + } + + /** + * 删除位置再start到end的元素 + * 有序集成员按 score 值递减(从大到小)的次序排列。 + * + * @param key key + * @param start 起始位置 0代表第一位 + * @param end 结束位置 -1代表查全部 + * @return 指定区间内,带有 score 值(可选)的有序集成员的列表 + */ + public Long zremrangeByRank(final String key, final long start, final long end) { + return new Executor(shardedJedisPool) { + + @Override + Long execute() { + return jedis.zremrangeByRank(key, start, end); + } + }.getResult(); + } + + /** + * 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。 + * 有序集成员按 score 值递减(从大到小)的次序排列。 + * + * @param key key + * @param max score最大值 + * @param min score最小值 + * @return 指定区间内,带有 score 值(可选)的有序集成员的列表 + */ + public Set revrangeByScoreWithSortedSet(final String key, final double max, final double min) { + return new Executor>(shardedJedisPool) { + + @Override + Set execute() { + return jedis.zrevrangeByScore(key, max, min); + } + }.getResult(); + } + + public Set test() { + return new Executor>(shardedJedisPool) { + + @Override + Set execute() { + jedis.lrange("key", 10, 20); +// return jedis.zrevrangeByScore(key, max, min); + return null; + } + }.getResult(); + } + + /** + * 设置byte类型的,需要自己序列化 + * + * @param key + * @param value + * @return + */ + public Long setByte(final byte[] key, final byte[] value, final int timeout) { + return new Executor(shardedJedisPool) { + @Override + Long execute() { + jedis.set(key, value); + return jedis.expire(key, timeout); + + } + }.getResult(); + + } + + /** + * 根据key读取byte类型,需要自己反序列化 + * + * @param key + * @return + */ + public byte[] getByte(final byte[] key) { + + return new Executor(shardedJedisPool) { + @Override + byte[] execute() { + return jedis.get(key); + } + }.getResult(); + } + + /** + * 查询操作是否被限流 + * + * @param actionKey 操作key + * @param period 时间范围(单位秒) + * @param maxCount 最大次数 + * @return 操作是否允许 + */ + public Boolean isActionAllowed(String actionKey, int period, int maxCount) { + return new Executor(shardedJedisPool) { + @Override + Boolean execute() { + ShardedJedisPipeline pipeline = jedis.pipelined(); + // value中存放纳秒级的时间戳 + long nowTs = System.nanoTime(); + // 记录本次操作行为 + pipeline.zadd(actionKey, nowTs, "" + nowTs); + // 移除时间窗口外的行为 + double v = (nowTs - period * 1000 * 1000 * 1000); + pipeline.zremrangeByScore(actionKey, 0, v); + // 查找时间窗口中的行为数量 + Response count = pipeline.zcard(actionKey); + // 重置时间窗口 + pipeline.expire(actionKey, period + 1); + pipeline.sync(); + return count.get() <= maxCount; + } + }.getResult(); + } + + + + /* ======================================Other====================================== */ + + /** + * 设置数据源 + * + * @param shardedJedisPool 数据源 + */ + public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) { + this.shardedJedisPool = shardedJedisPool; + } + + public void setShardedJedisPoolMap(Map shardedJedisPoolMap) { + this.shardedJedisPoolMap = shardedJedisPoolMap; + } + + /** + * 构造Pair键值对 + * + * @param key key + * @param value value + * @return 键值对 + */ + public Pair makePair(K key, V value) { + return new Pair(key, value); + } + + /** + * 键值对 + * + * @param key + * @param value + * @author fengjc + * @version V1.0 + */ + public class Pair { + private K key; + private V value; + + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + public K getKey() { + return key; + } + + public void setKey(K key) { + this.key = key; + } + + public V getValue() { + return value; + } + + public void setValue(V value) { + this.value = value; + } + } + + /** + * 指定db getString + * + * @param key + * @param dbIndex + * @return + */ + public String getString(final String key, final Integer dbIndex) { + ShardedJedisPool jedisPool = null; + if (null != shardedJedisPoolMap) { + jedisPool = shardedJedisPoolMap.get(dbIndex); + + } + if (null == jedisPool) { + jedisPool = shardedJedisPool; + } + return new Executor(jedisPool) { + + @Override + String execute() { + return jedis.get(key); + } + }.getResult(); + } + + /** + * 获取分布式加锁 + * + * @param key key + * @param value 锁value值 + * @return 返回true获取锁成功,返回false获取锁失败 + */ + public Boolean lock(String key, String value){ + return new Executor(shardedJedisPool) { + @Override + Boolean execute() { + Long setnx = jedis.setnx(key, value); + return setnx.equals(1L) ; + } + }.getResult(); + + } + + /** + * 获取分布式加锁 + * 注意点 setnx 和 expire 非原子操作 + * @param key key + * @param value 锁value值 + * @param cacheTime 锁持有时间 + * @return 返回true获取锁成功,返回false获取锁失败 + */ + public Boolean lock(String key, String value, int cacheTime){ + return new Executor(shardedJedisPool) { + @Override + Boolean execute() { + Long setnx = jedis.setnx(key, value); + jedis.expire(key, cacheTime); + return setnx.equals(1L) ; + } + }.getResult(); + + } + + /** + * 释放锁 确保释放的是当前线程持有的锁 + * @param key + * @param value + * @return + */ + public Boolean unlock(String key, String value){ + return new Executor(shardedJedisPool) { + @Override + Boolean execute() { + String keyValue = jedis.get(key); + if(StringUtils.isNotBlank(keyValue) && keyValue.equals(value)){ + return jedis.del(key) > 0; + } + return false; + } + }.getResult(); + } + + +} diff --git a/coolstore-partner-dao/coolstore-partner-dao.iml b/coolstore-partner-dao/coolstore-partner-dao.iml new file mode 100644 index 000000000..6371d2466 --- /dev/null +++ b/coolstore-partner-dao/coolstore-partner-dao.iml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/pom.xml b/coolstore-partner-dao/pom.xml new file mode 100644 index 000000000..a498b4666 --- /dev/null +++ b/coolstore-partner-dao/pom.xml @@ -0,0 +1,59 @@ + + + + coolstore-partner-manage + com.coolstore + 1.0.0 + + 4.0.0 + + coolstore-partner-dao + + + 1.1.20 + 2.1.0 + UTF-8 + UTF-8 + 1.8 + 8 + 8 + + + + + + com.coolstore + coolstore-partner-model + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.coolstore + coolstore-partner-common + + + mysql + mysql-connector-java + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + org.mybatis.generator + mybatis-generator-core + 1.3.7 + test + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseConfigDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseConfigDAO.java new file mode 100644 index 000000000..27b0a4324 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/EnterpriseConfigDAO.java @@ -0,0 +1,44 @@ +package com.cool.store.dao; + +import com.cool.store.mapper.EnterpriseConfigMapper; +import com.cool.store.model.entity.EnterpriseConfigDO; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author zhangchenbiao + * @FileName: EnterpriseConfigDAO + * @Description: + * @date 2023-05-18 11:15 + */ +@Service +public class EnterpriseConfigDAO { + + @Resource + private EnterpriseConfigMapper enterpriseConfigMapper; + + + public EnterpriseConfigDO selectByEnterpriseId(String enterpriseId) { + if(StringUtils.isBlank(enterpriseId)){ + return null; + } + return enterpriseConfigMapper.selectByEnterpriseId(enterpriseId); + } + + public EnterpriseConfigDO getDbInfoByDbName(String dbName) { + if(StringUtils.isBlank(dbName)){ + return null; + } + return enterpriseConfigMapper.getDbInfoByDbName(dbName); + } + + public List getDistinctDbServer() { + return enterpriseConfigMapper.getDistinctDbServer(); + } + + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseConfigMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseConfigMapper.java new file mode 100644 index 000000000..5b96ea6a0 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseConfigMapper.java @@ -0,0 +1,34 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.EnterpriseConfigDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author zhangchenbiao + * @date 2023-05-18 11:09 + */ +public interface EnterpriseConfigMapper { + + /** + * 根据企业id获取config + * @param enterpriseId + * @return + */ + EnterpriseConfigDO selectByEnterpriseId(@Param("enterpriseId") String enterpriseId); + + /** + * 获取dbServer + * @return + */ + List getDistinctDbServer(); + + /** + * 根据dbName 获取数据库信息 + * @param dbName + * @return + */ + EnterpriseConfigDO getDbInfoByDbName(@Param("dbName")String dbName); + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java new file mode 100644 index 000000000..8d660cbb6 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.EnterpriseUserDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 02:58 + */ +public interface EnterpriseUserMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 02:58 + */ + int insertSelective(@Param("record") EnterpriseUserDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 02:58 + */ + int updateByPrimaryKeySelective(@Param("record") EnterpriseUserDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java new file mode 100644 index 000000000..33987d2fa --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/EnterpriseUserRoleMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.EnterpriseUserRoleDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 02:59 + */ +public interface EnterpriseUserRoleMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 02:59 + */ + int insertSelective(@Param("record") EnterpriseUserRoleDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 02:59 + */ + int updateByPrimaryKeySelective(@Param("record") EnterpriseUserRoleDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java new file mode 100644 index 000000000..918319844 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/RegionMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.RegionDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 02:59 + */ +public interface RegionMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 02:59 + */ + int insertSelective(@Param("record") RegionDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 02:59 + */ + int updateByPrimaryKeySelective(@Param("record") RegionDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysDepartmentMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysDepartmentMapper.java new file mode 100644 index 000000000..3048ea450 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysDepartmentMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.SysDepartmentDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 03:00 + */ +public interface SysDepartmentMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 03:00 + */ + int insertSelective(@Param("record") SysDepartmentDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 03:00 + */ + int updateByPrimaryKeySelective(@Param("record") SysDepartmentDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java new file mode 100644 index 000000000..baea9a6fb --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.SysRoleDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 03:00 + */ +public interface SysRoleMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 03:00 + */ + int insertSelective(@Param("record") SysRoleDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 03:00 + */ + int updateByPrimaryKeySelective(@Param("record") SysRoleDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMenuMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMenuMapper.java new file mode 100644 index 000000000..0dcbf4999 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/SysRoleMenuMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.SysRoleMenuDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 03:01 + */ +public interface SysRoleMenuMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 03:01 + */ + int insertSelective(@Param("record") SysRoleMenuDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 03:01 + */ + int updateByPrimaryKeySelective(@Param("record") SysRoleMenuDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java new file mode 100644 index 000000000..6b41118e8 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.UserAuthMappingDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 02:54 + */ +public interface UserAuthMappingMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 02:54 + */ + int insertSelective(@Param("record") UserAuthMappingDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 02:54 + */ + int updateByPrimaryKeySelective(@Param("record") UserAuthMappingDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java new file mode 100644 index 000000000..721d5b918 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserRegionMappingMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.model.entity.UserRegionMappingDO; +import org.apache.ibatis.annotations.Param; + +/** + * @author zhangchenbiao + * @date 2023-05-19 03:00 + */ +public interface UserRegionMappingMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-05-19 03:00 + */ + int insertSelective(@Param("record") UserRegionMappingDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-05-19 03:00 + */ + int updateByPrimaryKeySelective(@Param("record") UserRegionMappingDO record, @Param("enterpriseId") String enterpriseId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseConfigMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseConfigMapper.xml new file mode 100644 index 000000000..e48cec091 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseConfigMapper.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, current_package, enterprise_id, staff_count, db_source_name, db_server, db_port, + db_name, db_user, db_pwd, license, license_expires, license_type, ding_corp_id, ding_corp_secret, + create_time, create_user, main_corp_id, app_type, permanent_code, agentid, cool_college_enterprise_id, + cool_college_secret + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml new file mode 100644 index 000000000..fee91ca39 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserMapper.xml @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, user_id, name, tel, work_place, remark, mobile, email, org_email, active, order_in_depts, + main_admin, is_admin, is_boss, dingId, unionid, is_hide, position, avatar, extattr, + is_enterprise, roles, is_leader, face_url, create_time, language, user_status, third_oa_unique_flag, + subordinate_change, update_time, subordinate_range + + + is_leader_in_depts, department, jobnumber, monitored_departments, departments, user_region_ids + + + insert into enterprise_user_${enterpriseId} + + + user_id, + + + name, + + + tel, + + + work_place, + + + remark, + + + mobile, + + + email, + + + org_email, + + + active, + + + order_in_depts, + + + main_admin, + + + is_admin, + + + is_boss, + + + dingId, + + + unionid, + + + is_hide, + + + position, + + + avatar, + + + extattr, + + + is_enterprise, + + + roles, + + + is_leader, + + + face_url, + + + create_time, + + + language, + + + user_status, + + + third_oa_unique_flag, + + + subordinate_change, + + + update_time, + + + subordinate_range, + + + is_leader_in_depts, + + + department, + + + jobnumber, + + + monitored_departments, + + + departments, + + + user_region_ids, + + + + + #{record.userId}, + + + #{record.name}, + + + #{record.tel}, + + + #{record.workPlace}, + + + #{record.remark}, + + + #{record.mobile}, + + + #{record.email}, + + + #{record.orgEmail}, + + + #{record.active}, + + + #{record.orderInDepts}, + + + #{record.mainAdmin}, + + + #{record.isAdmin}, + + + #{record.isBoss}, + + + #{record.dingid}, + + + #{record.unionid}, + + + #{record.isHide}, + + + #{record.position}, + + + #{record.avatar}, + + + #{record.extattr}, + + + #{record.isEnterprise}, + + + #{record.roles}, + + + #{record.isLeader}, + + + #{record.faceUrl}, + + + #{record.createTime}, + + + #{record.language}, + + + #{record.userStatus}, + + + #{record.thirdOaUniqueFlag}, + + + #{record.subordinateChange}, + + + #{record.updateTime}, + + + #{record.subordinateRange}, + + + #{record.isLeaderInDepts}, + + + #{record.department}, + + + #{record.jobnumber}, + + + #{record.monitoredDepartments}, + + + #{record.departments}, + + + #{record.userRegionIds}, + + + + + update enterprise_user_${enterpriseId} + + + user_id = #{record.userId}, + + + name = #{record.name}, + + + tel = #{record.tel}, + + + work_place = #{record.workPlace}, + + + remark = #{record.remark}, + + + mobile = #{record.mobile}, + + + email = #{record.email}, + + + org_email = #{record.orgEmail}, + + + active = #{record.active}, + + + order_in_depts = #{record.orderInDepts}, + + + main_admin = #{record.mainAdmin}, + + + is_admin = #{record.isAdmin}, + + + is_boss = #{record.isBoss}, + + + dingId = #{record.dingid}, + + + unionid = #{record.unionid}, + + + is_hide = #{record.isHide}, + + + position = #{record.position}, + + + avatar = #{record.avatar}, + + + extattr = #{record.extattr}, + + + is_enterprise = #{record.isEnterprise}, + + + roles = #{record.roles}, + + + is_leader = #{record.isLeader}, + + + face_url = #{record.faceUrl}, + + + create_time = #{record.createTime}, + + + language = #{record.language}, + + + user_status = #{record.userStatus}, + + + third_oa_unique_flag = #{record.thirdOaUniqueFlag}, + + + subordinate_change = #{record.subordinateChange}, + + + update_time = #{record.updateTime}, + + + subordinate_range = #{record.subordinateRange}, + + + is_leader_in_depts = #{record.isLeaderInDepts}, + + + department = #{record.department}, + + + jobnumber = #{record.jobnumber}, + + + monitored_departments = #{record.monitoredDepartments}, + + + departments = #{record.departments}, + + + user_region_ids = #{record.userRegionIds}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml new file mode 100644 index 000000000..cc6840109 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/EnterpriseUserRoleMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + id, role_id, user_id, create_time, update_time + + + insert into enterprise_user_role_${enterpriseId} + + + role_id, + + + user_id, + + + create_time, + + + update_time, + + + + + #{record.roleId}, + + + #{record.userId}, + + + #{record.createTime}, + + + #{record.updateTime}, + + + + + update enterprise_user_role_${enterpriseId} + + + role_id = #{record.roleId}, + + + user_id = #{record.userId}, + + + create_time = #{record.createTime}, + + + update_time = #{record.updateTime}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml new file mode 100644 index 000000000..496901fb3 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/RegionMapper.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id, region_id, name, parent_id, group_id, create_time, create_name, update_time, + update_name, vds_group_corp_id, syn_ding_dept_id, region_type, region_path, deleted, + store_num, store_id, unclassified_flag, order_num, third_dept_id + + + insert into region_${enterpriseId} + + + region_id, + + + name, + + + parent_id, + + + group_id, + + + create_time, + + + create_name, + + + update_time, + + + update_name, + + + vds_group_corp_id, + + + syn_ding_dept_id, + + + region_type, + + + region_path, + + + deleted, + + + store_num, + + + store_id, + + + unclassified_flag, + + + order_num, + + + third_dept_id, + + + + + #{record.regionId}, + + + #{record.name}, + + + #{record.parentId}, + + + #{record.groupId}, + + + #{record.createTime}, + + + #{record.createName}, + + + #{record.updateTime}, + + + #{record.updateName}, + + + #{record.vdsGroupCorpId}, + + + #{record.synDingDeptId}, + + + #{record.regionType}, + + + #{record.regionPath}, + + + #{record.deleted}, + + + #{record.storeNum}, + + + #{record.storeId}, + + + #{record.unclassifiedFlag}, + + + #{record.orderNum}, + + + #{record.thirdDeptId}, + + + + + update region_${enterpriseId} + + + region_id = #{record.regionId}, + + + name = #{record.name}, + + + parent_id = #{record.parentId}, + + + group_id = #{record.groupId}, + + + create_time = #{record.createTime}, + + + create_name = #{record.createName}, + + + update_time = #{record.updateTime}, + + + update_name = #{record.updateName}, + + + vds_group_corp_id = #{record.vdsGroupCorpId}, + + + syn_ding_dept_id = #{record.synDingDeptId}, + + + region_type = #{record.regionType}, + + + region_path = #{record.regionPath}, + + + deleted = #{record.deleted}, + + + store_num = #{record.storeNum}, + + + store_id = #{record.storeId}, + + + unclassified_flag = #{record.unclassifiedFlag}, + + + order_num = #{record.orderNum}, + + + third_dept_id = #{record.thirdDeptId}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/SysDepartmentMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/SysDepartmentMapper.xml new file mode 100644 index 000000000..7190d935d --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/SysDepartmentMapper.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + id, name, parent_id, depart_order, create_dept_group, auto_add_user, dep_Hiding, + dept_perimits, user_perimits, outer_dept, outer_permit_depts, outer_permit_users, + org_dept_owner, dept_manager_userid_list, user_count, unactive_user_count + + + parent_ids, sub_ids + + + insert into sys_department_${enterpriseId} + + + name, + + + parent_id, + + + depart_order, + + + create_dept_group, + + + auto_add_user, + + + dep_Hiding, + + + dept_perimits, + + + user_perimits, + + + outer_dept, + + + outer_permit_depts, + + + outer_permit_users, + + + org_dept_owner, + + + dept_manager_userid_list, + + + user_count, + + + unactive_user_count, + + + parent_ids, + + + sub_ids, + + + + + #{record.name}, + + + #{record.parentId}, + + + #{record.departOrder}, + + + #{record.createDeptGroup}, + + + #{record.autoAddUser}, + + + #{record.depHiding}, + + + #{record.deptPerimits}, + + + #{record.userPerimits}, + + + #{record.outerDept}, + + + #{record.outerPermitDepts}, + + + #{record.outerPermitUsers}, + + + #{record.orgDeptOwner}, + + + #{record.deptManagerUseridList}, + + + #{record.userCount}, + + + #{record.unactiveUserCount}, + + + #{record.parentIds}, + + + #{record.subIds}, + + + + + update sys_department_${enterpriseId} + + + name = #{record.name}, + + + parent_id = #{record.parentId}, + + + depart_order = #{record.departOrder}, + + + create_dept_group = #{record.createDeptGroup}, + + + auto_add_user = #{record.autoAddUser}, + + + dep_Hiding = #{record.depHiding}, + + + dept_perimits = #{record.deptPerimits}, + + + user_perimits = #{record.userPerimits}, + + + outer_dept = #{record.outerDept}, + + + outer_permit_depts = #{record.outerPermitDepts}, + + + outer_permit_users = #{record.outerPermitUsers}, + + + org_dept_owner = #{record.orgDeptOwner}, + + + dept_manager_userid_list = #{record.deptManagerUseridList}, + + + user_count = #{record.userCount}, + + + unactive_user_count = #{record.unactiveUserCount}, + + + parent_ids = #{record.parentIds}, + + + sub_ids = #{record.subIds}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml new file mode 100644 index 000000000..bfe1100c9 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + id, role_name, is_internal, role_auth, source, position_type, app_menu, syn_ding_role_id, + priority, create_time, update_time, role_enum, create_user, update_user, third_unique_id + + + insert into sys_role_${enterpriseId} + + + role_name, + + + is_internal, + + + role_auth, + + + source, + + + position_type, + + + app_menu, + + + syn_ding_role_id, + + + priority, + + + create_time, + + + update_time, + + + role_enum, + + + create_user, + + + update_user, + + + third_unique_id, + + + + + #{record.roleName}, + + + #{record.isInternal}, + + + #{record.roleAuth}, + + + #{record.source}, + + + #{record.positionType}, + + + #{record.appMenu}, + + + #{record.synDingRoleId}, + + + #{record.priority}, + + + #{record.createTime}, + + + #{record.updateTime}, + + + #{record.roleEnum}, + + + #{record.createUser}, + + + #{record.updateUser}, + + + #{record.thirdUniqueId}, + + + + + update sys_role_${enterpriseId} + + + role_name = #{record.roleName}, + + + is_internal = #{record.isInternal}, + + + role_auth = #{record.roleAuth}, + + + source = #{record.source}, + + + position_type = #{record.positionType}, + + + app_menu = #{record.appMenu}, + + + syn_ding_role_id = #{record.synDingRoleId}, + + + priority = #{record.priority}, + + + create_time = #{record.createTime}, + + + update_time = #{record.updateTime}, + + + role_enum = #{record.roleEnum}, + + + create_user = #{record.createUser}, + + + update_user = #{record.updateUser}, + + + third_unique_id = #{record.thirdUniqueId}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/SysRoleMenuMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMenuMapper.xml new file mode 100644 index 000000000..cae140a4c --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + id, menu_id, role_id, platform + + + insert into sys_role_menu_${enterpriseId} + + + menu_id, + + + role_id, + + + platform, + + + + + #{record.menuId}, + + + #{record.roleId}, + + + #{record.platform}, + + + + + update sys_role_menu_${enterpriseId} + + + menu_id = #{record.menuId}, + + + role_id = #{record.roleId}, + + + platform = #{record.platform}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml new file mode 100644 index 000000000..dad666347 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + id, user_id, mapping_id, type, source, create_id, create_time, update_id, update_time + + + insert into user_auth_mapping_${enterpriseId} + + + user_id, + + + mapping_id, + + + type, + + + source, + + + create_id, + + + create_time, + + + update_id, + + + update_time, + + + + + #{record.userId}, + + + #{record.mappingId}, + + + #{record.type}, + + + #{record.source}, + + + #{record.createId}, + + + #{record.createTime}, + + + #{record.updateId}, + + + #{record.updateTime}, + + + + + update user_auth_mapping_${enterpriseId} + + + user_id = #{record.userId}, + + + mapping_id = #{record.mappingId}, + + + type = #{record.type}, + + + source = #{record.source}, + + + create_id = #{record.createId}, + + + create_time = #{record.createTime}, + + + update_id = #{record.updateId}, + + + update_time = #{record.updateTime}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml new file mode 100644 index 000000000..768551133 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/UserRegionMappingMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + id, region_id, user_id, create_id, create_time, update_id, update_time + + + insert into user_region_mapping_${enterpriseId} + + + region_id, + + + user_id, + + + create_id, + + + create_time, + + + update_id, + + + update_time, + + + + + #{record.regionId}, + + + #{record.userId}, + + + #{record.createId}, + + + #{record.createTime}, + + + #{record.updateId}, + + + #{record.updateTime}, + + + + + update user_region_mapping_${enterpriseId} + + + region_id = #{record.regionId}, + + + user_id = #{record.userId}, + + + create_id = #{record.createId}, + + + create_time = #{record.createTime}, + + + update_id = #{record.updateId}, + + + update_time = #{record.updateTime}, + + + where id = #{record.id} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/test/java/generator/GeneratorCodeMain.java b/coolstore-partner-dao/src/test/java/generator/GeneratorCodeMain.java new file mode 100644 index 000000000..b03b91133 --- /dev/null +++ b/coolstore-partner-dao/src/test/java/generator/GeneratorCodeMain.java @@ -0,0 +1,35 @@ +package generator; + +import org.mybatis.generator.api.MyBatisGenerator; +import org.mybatis.generator.config.Configuration; +import org.mybatis.generator.config.xml.ConfigurationParser; +import org.mybatis.generator.internal.DefaultShellCallback; + +import java.util.ArrayList; +import java.util.List; + +public class GeneratorCodeMain { + + public static void generator() { + List warnings = new ArrayList(); + try { + // 解析 + ConfigurationParser cp = new ConfigurationParser(warnings); + Configuration config = cp.parseConfiguration(GeneratorCodeMain.class.getResourceAsStream("/mybatis-generator.xml")); + // 是否覆盖 + DefaultShellCallback dsc = new DefaultShellCallback(false); + MyBatisGenerator mg = new MyBatisGenerator(config, dsc, warnings); + mg.generate(null); + } catch (Exception e) { + e.printStackTrace(); + } + } + /** + * @param args + */ + public static void main(String[] args) { + GeneratorCodeMain.generator(); + System.out.println("done!"); + } + +} diff --git a/coolstore-partner-dao/src/test/java/generator/defined/MyCommentGenerator.java b/coolstore-partner-dao/src/test/java/generator/defined/MyCommentGenerator.java new file mode 100644 index 000000000..5e50368c6 --- /dev/null +++ b/coolstore-partner-dao/src/test/java/generator/defined/MyCommentGenerator.java @@ -0,0 +1,116 @@ +package generator.defined; + +import org.mybatis.generator.api.CommentGenerator; +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.dom.java.Field; +import org.mybatis.generator.api.dom.java.Method; +import org.mybatis.generator.api.dom.java.TopLevelClass; +import org.mybatis.generator.api.dom.xml.XmlElement; +import org.mybatis.generator.internal.DefaultCommentGenerator; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +/** + * @author zhangchenbiao + * @FileName: MyCommentGenerator + * @Description: + * @date 2021-11-18 11:09 + */ +public class MyCommentGenerator extends DefaultCommentGenerator implements CommentGenerator { + private String author; + /** + * 当前时间 + */ + private String currentDateStr; + public static final ThreadLocal authorName = new ThreadLocal(); + + public MyCommentGenerator() { + currentDateStr = (new SimpleDateFormat("yyyy-MM-dd hh:mm")).format(new Date()); + } + + + @Override + public void addConfigurationProperties(Properties properties) { + author = properties.getProperty("author"); + authorName.set(author); + } + + /** + * 字段注释 + * @param field + * @param introspectedTable + * @param introspectedColumn + */ + @Override + public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { + String remarks = introspectedColumn.getRemarks(); + field.addAnnotation("@ApiModelProperty(\""+ remarks +"\")"); + } + + @Override + public void addFieldComment(Field field, IntrospectedTable introspectedTable) { + + } + + @Override + public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + String remarks = introspectedTable.getRemarks(); + topLevelClass.addJavaDocLine("/**"); + topLevelClass.addJavaDocLine(" * " + remarks); + topLevelClass.addJavaDocLine(" * @author " + author); + topLevelClass.addJavaDocLine(" * @date " + currentDateStr); + topLevelClass.addJavaDocLine(" */"); + } + + @Override + public void addSetterComment(Method method, + IntrospectedTable introspectedTable, + IntrospectedColumn introspectedColumn) { + + } + + @Override + public void addGeneralMethodComment(Method method, + IntrospectedTable introspectedTable) { + StringBuilder sb = new StringBuilder(); + + method.addJavaDocLine("/**"); + method.addJavaDocLine(" *"); + sb.append(" * " + MethodName.getMethodComment(method.getName())); + method.addJavaDocLine(sb.toString()); + method.addJavaDocLine(" * dateTime:" +currentDateStr); + method.addJavaDocLine(" */"); + } + + @Override + public void addComment(XmlElement xmlElement) { + + } + + public enum MethodName{ + INSERT_SELECTIVE("insertSelective","默认插入方法,只会给有值的字段赋值\n\t * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null"), + SELECT_BY_PRIMARY_KEY("selectByPrimaryKey","默认查询方法,通过主键获取所有字段的值"), + UPDATE_BY_PRIMARY_KEY_SELECTIVE("updateByPrimaryKeySelective","默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的"), + DELETE_BY_PRIMARY_KEY("deleteByPrimaryKey","默认更新方法,根据主键物理删除"),; + private String methodName; + private String comment; + + MethodName(String methodName, String comment) { + this.methodName = methodName; + this.comment = comment; + } + + public static String getMethodComment(String methodName){ + for (MethodName value : MethodName.values()) { + if(value.methodName.equals(methodName)){ + return value.comment; + } + } + return null; + } + } + +} diff --git a/coolstore-partner-dao/src/test/java/generator/defined/MyIntrospectedTableMyBatis3Impl.java b/coolstore-partner-dao/src/test/java/generator/defined/MyIntrospectedTableMyBatis3Impl.java new file mode 100644 index 000000000..8963b5269 --- /dev/null +++ b/coolstore-partner-dao/src/test/java/generator/defined/MyIntrospectedTableMyBatis3Impl.java @@ -0,0 +1,517 @@ +package generator.defined; + +import org.apache.commons.lang3.StringUtils; +import org.mybatis.generator.api.CommentGenerator; +import org.mybatis.generator.api.FullyQualifiedTable; +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.ProgressCallback; +import org.mybatis.generator.api.dom.java.*; +import org.mybatis.generator.api.dom.xml.Attribute; +import org.mybatis.generator.api.dom.xml.TextElement; +import org.mybatis.generator.api.dom.xml.XmlElement; +import org.mybatis.generator.codegen.AbstractJavaClientGenerator; +import org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl; +import org.mybatis.generator.codegen.mybatis3.ListUtilities; +import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities; +import org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator; +import org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator; +import org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator; +import org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.InsertSelectiveElementGenerator; +import org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.UpdateByPrimaryKeySelectiveElementGenerator; +import org.mybatis.generator.config.GeneratedKey; +import org.mybatis.generator.config.PropertyRegistry; +import org.mybatis.generator.internal.util.JavaBeansUtil; + +import java.util.ArrayList; +import java.util.List; + +import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; +import static org.mybatis.generator.internal.util.messages.Messages.getString; + +/** + * @author zhangchenbiao + * @FileName: MyIntrospectedTableMyBatis3Impl + * @Description: + * @date 2021-11-18 15:38 + */ +public class MyIntrospectedTableMyBatis3Impl extends IntrospectedTableMyBatis3Impl { + + private String enterpriseIdTableSuffix = "_${enterpriseId}"; + + @Override + public String getFullyQualifiedTableNameAtRuntime() { + return getTableName(); + } + + @Override + public String getAliasedFullyQualifiedTableNameAtRuntime() { + return getTableName(); + } + + private String getTableName() { + String tableName = this.getTableConfiguration().getTableName(); + String tableSuffix = tableName.substring(tableName.lastIndexOf("_") + 1); + if(StringUtils.isNotBlank(tableSuffix) && tableSuffix.length() == 32){ + //企业库 + return tableName.substring(0, tableName.lastIndexOf("_")) + enterpriseIdTableSuffix; + } + //平台库 + return tableName; + } + + private String getTableNameFromConfigFile() { + String tableName = getTableName(); + if(tableName.contains(enterpriseIdTableSuffix)){ + tableName = tableName.replace(enterpriseIdTableSuffix,""); + } + return JavaBeansUtil.getCamelCaseString(tableName,true); + } + + private boolean isConfigTable() { + String tableName = this.getTableConfiguration().getTableName(); + String tableSuffix = tableName.substring(tableName.lastIndexOf("_") + 1); + if(StringUtils.isNotBlank(tableSuffix) && tableSuffix.length() == 32){ + //企业库 + return false; + } + //平台库 + return true; + } + + @Override + protected String calculateMyBatis3XmlMapperFileName() { + StringBuilder sb = new StringBuilder(); + sb.append(getTableNameFromConfigFile()); + sb.append("Mapper.xml"); //$NON-NLS-1$ + return sb.toString(); + } + + @Override + protected void calculateJavaClientAttributes() { + if (context.getJavaClientGeneratorConfiguration() == null) { + return; + } + + StringBuilder sb = new StringBuilder(); + sb.append(calculateJavaClientImplementationPackage()); + sb.append('.'); + sb.append(getTableNameFromConfigFile()); + sb.append("DAOImpl"); //$NON-NLS-1$ + setDAOImplementationType(sb.toString()); + + sb.setLength(0); + sb.append(calculateJavaClientInterfacePackage()); + sb.append('.'); + sb.append(getTableNameFromConfigFile()); + sb.append("DAO"); //$NON-NLS-1$ + setDAOInterfaceType(sb.toString()); + + sb.setLength(0); + sb.append(calculateJavaClientInterfacePackage()); + sb.append('.'); + if (stringHasValue(tableConfiguration.getMapperName())) { + sb.append(tableConfiguration.getMapperName()); + } else { + if (stringHasValue(fullyQualifiedTable.getDomainObjectSubPackage())) { + sb.append(fullyQualifiedTable.getDomainObjectSubPackage()); + sb.append('.'); + } + sb.append(getTableNameFromConfigFile()); + sb.append("Mapper"); //$NON-NLS-1$ + } + setMyBatis3JavaMapperType(sb.toString()); + + sb.setLength(0); + sb.append(calculateJavaClientInterfacePackage()); + sb.append('.'); + if (stringHasValue(tableConfiguration.getSqlProviderName())) { + sb.append(tableConfiguration.getSqlProviderName()); + } else { + if (stringHasValue(fullyQualifiedTable.getDomainObjectSubPackage())) { + sb.append(fullyQualifiedTable.getDomainObjectSubPackage()); + sb.append('.'); + } + sb.append(getTableNameFromConfigFile()); + sb.append("SqlProvider"); //$NON-NLS-1$ + } + setMyBatis3SqlProviderType(sb.toString()); + + sb.setLength(0); + sb.append(calculateJavaClientInterfacePackage()); + sb.append('.'); + sb.append(getTableNameFromConfigFile()); + sb.append("DynamicSqlSupport"); //$NON-NLS-1$ + setMyBatisDynamicSqlSupportType(sb.toString()); + } + + @Override + protected void calculateModelAttributes() { + String pakkage = calculateJavaModelPackage(); + + StringBuilder sb = new StringBuilder(); + sb.append(pakkage); + sb.append('.'); + sb.append(getTableNameFromConfigFile()); + sb.append("Key"); //$NON-NLS-1$ + setPrimaryKeyType(sb.toString()); + + sb.setLength(0); + sb.append(pakkage); + sb.append('.'); + sb.append(getTableNameFromConfigFile() + "DO"); + setBaseRecordType(sb.toString()); + + sb.setLength(0); + sb.append(pakkage); + sb.append('.'); + sb.append(getTableNameFromConfigFile()); + sb.append("WithBLOBs"); //$NON-NLS-1$ + setRecordWithBLOBsType(sb.toString()); + + sb.setLength(0); + sb.append(pakkage); + sb.append('.'); + sb.append(getTableNameFromConfigFile()); + sb.append("Example"); //$NON-NLS-1$ + setExampleType(sb.toString()); + } + + @Override + protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, + List warnings, + ProgressCallback progressCallback) { + xmlMapperGenerator = new MyXMLMapperGenerator(); + + initializeAbstractGenerator(xmlMapperGenerator, warnings, progressCallback); + } + + public class MyXMLMapperGenerator extends XMLMapperGenerator { + + public MyXMLMapperGenerator() { + super(); + } + + @Override + protected XmlElement getSqlMapElement() { + FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable(); + progressCallback.startTask(getString( + "Progress.12", table.toString())); //$NON-NLS-1$ + XmlElement answer = new XmlElement("mapper"); //$NON-NLS-1$ + String namespace = introspectedTable.getMyBatis3SqlMapNamespace(); + answer.addAttribute(new Attribute("namespace", //$NON-NLS-1$ + namespace)); + + context.getCommentGenerator().addRootComment(answer); + addResultMapWithoutBLOBsElement(answer); + addResultMapWithBLOBsElement(answer); + addExampleWhereClauseElement(answer); + addMyBatis3UpdateByExampleWhereClauseElement(answer); + addBaseColumnListElement(answer); + addBlobColumnListElement(answer); + addInsertSelectiveElement(answer); + addUpdateByPrimaryKeySelectiveElement(answer); + return answer; + } + + @Override + protected void addInsertSelectiveElement(XmlElement parentElement) { + if (introspectedTable.getRules().generateInsertSelective()) { + AbstractXmlElementGenerator elementGenerator = new MyInsertSelectiveElementGenerator(); + initializeAndExecuteGenerator(elementGenerator, parentElement); + } + } + + @Override + protected void addUpdateByPrimaryKeySelectiveElement(XmlElement parentElement) { + if (introspectedTable.getRules().generateUpdateByPrimaryKeySelective()) { + AbstractXmlElementGenerator elementGenerator = new MyUpdateByPrimaryKeySelectiveElementGenerator(); + initializeAndExecuteGenerator(elementGenerator, parentElement); + } + } + } + @Override + protected AbstractJavaClientGenerator createJavaClientGenerator() { + if (context.getJavaClientGeneratorConfiguration() == null) { + return null; + } + AbstractJavaClientGenerator javaGenerator; + javaGenerator = new MyJavaMapperGenerator(); + + return javaGenerator; + } + + public class MyJavaMapperGenerator extends JavaMapperGenerator { + + @Override + public List getCompilationUnits() { + boolean isConfig = isConfigTable(); + progressCallback.startTask(getString("Progress.17", //$NON-NLS-1$ + introspectedTable.getFullyQualifiedTable().toString())); + CommentGenerator commentGenerator = context.getCommentGenerator(); + + FullyQualifiedJavaType type = new FullyQualifiedJavaType( + introspectedTable.getMyBatis3JavaMapperType()); + Interface interfaze = new Interface(type); + interfaze.setVisibility(JavaVisibility.PUBLIC); + commentGenerator.addJavaFileComment(interfaze); + + String rootInterface = introspectedTable + .getTableConfigurationProperty(PropertyRegistry.ANY_ROOT_INTERFACE); + if (!stringHasValue(rootInterface)) { + rootInterface = context.getJavaClientGeneratorConfiguration() + .getProperty(PropertyRegistry.ANY_ROOT_INTERFACE); + } + + if (stringHasValue(rootInterface)) { + FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType( + rootInterface); + interfaze.addSuperInterface(fqjt); + interfaze.addImportedType(fqjt); + } + if(!isConfig){ + interfaze.addImportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param")); + } + addInsertSelectiveMethod(interfaze); + addUpdateByPrimaryKeySelectiveMethod(interfaze); + List methods = interfaze.getMethods(); + for (Method method : methods) { + List parameters = method.getParameters(); + for (Parameter parameter : parameters) { + if(!isConfig){ + String name = parameter.getName(); + parameter.addAnnotation("@Param(\""+ name+"\")"); + } + } + if(!isConfig){ + Parameter enterpriseId = new Parameter(FullyQualifiedJavaType.getStringInstance(), "enterpriseId"); + enterpriseId.addAnnotation("@Param(\"enterpriseId\")"); + method.addParameter(enterpriseId); + } + } + + List answer = new ArrayList(); + if (context.getPlugins().clientGenerated(interfaze, null, + introspectedTable)) { + answer.add(interfaze); + } + + List extraCompilationUnits = getExtraCompilationUnits(); + if (extraCompilationUnits != null) { + answer.addAll(extraCompilationUnits); + } + + return answer; + } + } + + public class MyInsertSelectiveElementGenerator extends InsertSelectiveElementGenerator{ + + public MyInsertSelectiveElementGenerator() { + super(); + } + + @Override + public void addElements(XmlElement parentElement) { + boolean isConfig = isConfigTable(); + XmlElement answer = new XmlElement("insert"); //$NON-NLS-1$ + + answer.addAttribute(new Attribute( + "id", introspectedTable.getInsertSelectiveStatementId())); //$NON-NLS-1$ + + /* + FullyQualifiedJavaType parameterType = introspectedTable.getRules() + .calculateAllFieldsClass(); + answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$ + parameterType.getFullyQualifiedName()));*/ + + context.getCommentGenerator().addComment(answer); + + GeneratedKey gk = introspectedTable.getGeneratedKey(); + if (gk != null) { + IntrospectedColumn introspectedColumn = introspectedTable + .getColumn(gk.getColumn()); + /*if (introspectedColumn != null) { + if (gk.isJdbcStandard()) { + answer.addAttribute(new Attribute("useGeneratedKeys", "true")); //$NON-NLS-1$ //$NON-NLS-2$ + answer.addAttribute(new Attribute("keyProperty", introspectedColumn.getJavaProperty())); //$NON-NLS-1$ + answer.addAttribute(new Attribute("keyColumn", introspectedColumn.getActualColumnName())); //$NON-NLS-1$ + } else { + answer.addElement(getSelectKey(introspectedColumn, gk)); + } + }*/ + if(introspectedColumn != null){ + answer.addAttribute(new Attribute("useGeneratedKeys", "true")); //$NON-NLS-1$ //$NON-NLS-2$ + answer.addAttribute(new Attribute("keyProperty", "record."+introspectedColumn.getJavaProperty())); //$NON-NLS-1$ + answer.addAttribute(new Attribute("keyColumn", introspectedColumn.getActualColumnName())); //$NON-NLS-1$ + } + } + + StringBuilder sb = new StringBuilder(); + + sb.append("insert into "); //$NON-NLS-1$ + sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime()); + answer.addElement(new TextElement(sb.toString())); + + XmlElement insertTrimElement = new XmlElement("trim"); //$NON-NLS-1$ + insertTrimElement.addAttribute(new Attribute("prefix", "(")); //$NON-NLS-1$ //$NON-NLS-2$ + insertTrimElement.addAttribute(new Attribute("suffix", ")")); //$NON-NLS-1$ //$NON-NLS-2$ + insertTrimElement.addAttribute(new Attribute("suffixOverrides", ",")); //$NON-NLS-1$ //$NON-NLS-2$ + answer.addElement(insertTrimElement); + + XmlElement valuesTrimElement = new XmlElement("trim"); //$NON-NLS-1$ + valuesTrimElement.addAttribute(new Attribute("prefix", "values (")); //$NON-NLS-1$ //$NON-NLS-2$ + valuesTrimElement.addAttribute(new Attribute("suffix", ")")); //$NON-NLS-1$ //$NON-NLS-2$ + valuesTrimElement.addAttribute(new Attribute("suffixOverrides", ",")); //$NON-NLS-1$ //$NON-NLS-2$ + answer.addElement(valuesTrimElement); + + for (IntrospectedColumn introspectedColumn : ListUtilities.removeIdentityAndGeneratedAlwaysColumns(introspectedTable.getAllColumns())) { + + if (introspectedColumn.isSequenceColumn() || introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) { + sb.setLength(0); + sb.append(MyBatis3FormattingUtilities + .getEscapedColumnName(introspectedColumn)); + sb.append(','); + insertTrimElement.addElement(new TextElement(sb.toString())); + + sb.setLength(0); + sb.append(MyBatis3FormattingUtilities + .getParameterClause(introspectedColumn)); + sb.append(','); + valuesTrimElement.addElement(new TextElement(sb.toString())); + + continue; + } + + sb.setLength(0); + if(!isConfig){ + sb.append("record."); + } + sb.append(introspectedColumn.getJavaProperty()); + sb.append(" != null"); //$NON-NLS-1$ + XmlElement insertNotNullElement = new XmlElement("if"); //$NON-NLS-1$ + insertNotNullElement.addAttribute(new Attribute( + "test", sb.toString())); //$NON-NLS-1$ + + sb.setLength(0); + sb.append(MyBatis3FormattingUtilities + .getEscapedColumnName(introspectedColumn)); + sb.append(','); + insertNotNullElement.addElement(new TextElement(sb.toString())); + insertTrimElement.addElement(insertNotNullElement); + + sb.setLength(0); + if(!isConfig){ + sb.append("record."); + } + sb.append(introspectedColumn.getJavaProperty()); + sb.append(" != null"); //$NON-NLS-1$ + XmlElement valuesNotNullElement = new XmlElement("if"); //$NON-NLS-1$ + valuesNotNullElement.addAttribute(new Attribute( + "test", sb.toString())); //$NON-NLS-1$ + + sb.setLength(0); + if(isConfig){ + sb.append("#{"+introspectedColumn.getJavaProperty() + "}"); + }else{ + sb.append("#{record."+introspectedColumn.getJavaProperty() + "}"); + } + sb.append(','); + valuesNotNullElement.addElement(new TextElement(sb.toString())); + valuesTrimElement.addElement(valuesNotNullElement); + } + + if (context.getPlugins().sqlMapInsertSelectiveElementGenerated(answer, introspectedTable)) { + parentElement.addElement(answer); + } + } + } + + public class MyUpdateByPrimaryKeySelectiveElementGenerator extends UpdateByPrimaryKeySelectiveElementGenerator{ + public MyUpdateByPrimaryKeySelectiveElementGenerator() { + super(); + } + + @Override + public void addElements(XmlElement parentElement) { + boolean isConfig = isConfigTable(); + XmlElement answer = new XmlElement("update"); //$NON-NLS-1$ + + answer.addAttribute(new Attribute( + "id", introspectedTable.getUpdateByPrimaryKeySelectiveStatementId())); //$NON-NLS-1$ + + String parameterType; + + if (introspectedTable.getRules().generateRecordWithBLOBsClass()) { + parameterType = introspectedTable.getRecordWithBLOBsType(); + } else { + parameterType = introspectedTable.getBaseRecordType(); + } + + /*answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$ + parameterType));*/ + + context.getCommentGenerator().addComment(answer); + + StringBuilder sb = new StringBuilder(); + + sb.append("update "); //$NON-NLS-1$ + sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime()); + answer.addElement(new TextElement(sb.toString())); + + XmlElement dynamicElement = new XmlElement("set"); //$NON-NLS-1$ + answer.addElement(dynamicElement); + + for (IntrospectedColumn introspectedColumn : ListUtilities.removeGeneratedAlwaysColumns(introspectedTable.getNonPrimaryKeyColumns())) { + sb.setLength(0); + if(!isConfig){ + sb.append("record."); + } + sb.append(introspectedColumn.getJavaProperty()); + sb.append(" != null"); //$NON-NLS-1$ + XmlElement isNotNullElement = new XmlElement("if"); //$NON-NLS-1$ + isNotNullElement.addAttribute(new Attribute("test", sb.toString())); //$NON-NLS-1$ + dynamicElement.addElement(isNotNullElement); + + sb.setLength(0); + sb.append(MyBatis3FormattingUtilities + .getEscapedColumnName(introspectedColumn)); + sb.append(" = "); + if(!isConfig){ + sb.append("#{record."+introspectedColumn.getJavaProperty() + "}"); + }else{ + sb.append("#{"+introspectedColumn.getJavaProperty() + "}"); + } + sb.append(','); + + isNotNullElement.addElement(new TextElement(sb.toString())); + } + + boolean and = false; + for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) { + sb.setLength(0); + if (and) { + sb.append(" and "); //$NON-NLS-1$ + } else { + sb.append("where "); //$NON-NLS-1$ + and = true; + } + + sb.append(MyBatis3FormattingUtilities + .getEscapedColumnName(introspectedColumn)); + sb.append(" = "); + if(isConfig){ + sb.append("#{"+introspectedColumn.getJavaProperty() + "}"); + }else{ + sb.append("#{record."+introspectedColumn.getJavaProperty() + "}"); + } + answer.addElement(new TextElement(sb.toString())); + } + + if (context.getPlugins() + .sqlMapUpdateByPrimaryKeySelectiveElementGenerated(answer, + introspectedTable)) { + parentElement.addElement(answer); + } + } + } +} diff --git a/coolstore-partner-dao/src/test/java/generator/defined/MyPluginAdapter.java b/coolstore-partner-dao/src/test/java/generator/defined/MyPluginAdapter.java new file mode 100644 index 000000000..b5a3fe009 --- /dev/null +++ b/coolstore-partner-dao/src/test/java/generator/defined/MyPluginAdapter.java @@ -0,0 +1,190 @@ +package generator.defined; + +import org.apache.commons.lang3.StringUtils; +import org.mybatis.generator.api.IntrospectedColumn; +import org.mybatis.generator.api.IntrospectedTable; +import org.mybatis.generator.api.PluginAdapter; +import org.mybatis.generator.api.dom.java.*; +import org.mybatis.generator.api.dom.xml.Document; +import org.mybatis.generator.api.dom.xml.XmlElement; +import org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator; + +import java.sql.Types; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + + +/** + * @author zhangchenbiao + * @FileName: MyPluginAdapter + * @Description: 自定义生成器 + * @date 2021-11-18 14:11 + */ +public class MyPluginAdapter extends PluginAdapter { + + @Override + public boolean validate(List list) { + return true; + } + + /** + * model新增import + * @param topLevelClass + * @param introspectedTable + * @return + */ + @Override + public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + topLevelClass.addImportedType("java.io.Serializable"); + topLevelClass.addImportedType("lombok.Data"); + topLevelClass.addImportedType("lombok.Builder"); + topLevelClass.addImportedType("lombok.NoArgsConstructor"); + topLevelClass.addImportedType("lombok.AllArgsConstructor"); + topLevelClass.addImportedType("io.swagger.annotations.ApiModelProperty"); + topLevelClass.addAnnotation("@Data"); + topLevelClass.addAnnotation("@Builder"); + topLevelClass.addAnnotation("@NoArgsConstructor"); + topLevelClass.addAnnotation("@AllArgsConstructor"); + topLevelClass.addSuperInterface(new FullyQualifiedJavaType("java.io.Serializable")); + return true; + } + + /** + * model不生成set方法 + * @param method + * @param topLevelClass + * @param introspectedColumn + * @param introspectedTable + * @param modelClassType + * @return + */ + @Override + public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { + return false; + } + + /** + * model不生成get方法 + * @param method + * @param topLevelClass + * @param introspectedColumn + * @param introspectedTable + * @param modelClassType + * @return + */ + @Override + public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { + return false; + } + + /** + * sql文件 新增动态sql + * @param document + * @param introspectedTable + * @return + */ + @Override + public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) { + AbstractXmlElementGenerator elementGenerator = new CustomAbstractXmlElementGenerator(); + elementGenerator.setContext(context); + elementGenerator.setIntrospectedTable(introspectedTable); + elementGenerator.addElements(document.getRootElement()); + return super.sqlMapDocumentGenerated(document, introspectedTable); + } + + /** + * mapper文件备注 + * @param interfaze + * @param topLevelClass + * @param introspectedTable + * @return + */ + @Override + public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { + interfaze.addJavaDocLine("/**"); + interfaze.addJavaDocLine(" * @author zhangchenbiao" ); + interfaze.addJavaDocLine(" * @date " + (new SimpleDateFormat("yyyy-MM-dd hh:mm")).format(new Date())); + interfaze.addJavaDocLine(" */"); + return super.clientGenerated(interfaze, topLevelClass, introspectedTable); + } + + /** + * sql新增动态sql + */ + public class CustomAbstractXmlElementGenerator extends AbstractXmlElementGenerator { + + @Override + public void addElements(XmlElement parentElement) { + /*String tableName =getTableName(); + // 增加base_query + XmlElement sql = new XmlElement("sql"); + sql.addAttribute(new Attribute("id", "dynamicQuery")); + //在这里添加where条件 + XmlElement selectTrimElement = new XmlElement("trim"); //设置trim标签 + selectTrimElement.addAttribute(new Attribute("prefix", "WHERE")); + selectTrimElement.addAttribute(new Attribute("prefixOverrides", "AND | OR")); //添加where和and + StringBuilder sb = new StringBuilder(); + for(IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) { + XmlElement selectNotNullElement = new XmlElement("if"); //$NON-NLS-1$ + sb.setLength(0); + sb.append("null != "); + sb.append(introspectedColumn.getJavaProperty()); + selectNotNullElement.addAttribute(new Attribute("test", sb.toString())); + sb.setLength(0); + // 添加and + sb.append(" and "); + // 添加别名t + sb.append("t."); + sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn)); + // 添加等号 + sb.append(" = "); + sb.append("#{"+ introspectedColumn.getJavaProperty() +"}"); + selectNotNullElement.addElement(new TextElement(sb.toString())); + selectTrimElement.addElement(selectNotNullElement); + } + + //sql.addElement(selectTrimElement); + parentElement.addElement(sql); + + // 公用include + XmlElement include = new XmlElement("include"); + include.addAttribute(new Attribute("refid", "dynamicQuery"));*/ + + } + + private String getTableName() { + String tableName = introspectedTable.getTableConfiguration().getTableName(); + String tableSuffix = tableName.substring(tableName.lastIndexOf("_") + 1); + if(StringUtils.isNotBlank(tableSuffix) && tableSuffix.length() == 32){ + //企业库 + return tableName.substring(0, tableName.lastIndexOf("_")) + "_${enterpriseId}"; + } + //平台库 + return tableName; + } + + } + + /** + * 对数据库中的tinyint->byte 处理为 tinyint->integer + * @param field + * @param topLevelClass + * @param introspectedColumn + * @param introspectedTable + * @param modelClassType + * @return + */ + @Override + public boolean modelFieldGenerated(Field field, + TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, + IntrospectedTable introspectedTable, + ModelClassType modelClassType){ + int jdbcType = introspectedColumn.getJdbcType(); + if(jdbcType == Types.TINYINT){ + field.setType(new FullyQualifiedJavaType(Integer.class.getName())); + } + return true; + } + +} diff --git a/coolstore-partner-dao/src/test/resources/mybatis-generator.properties b/coolstore-partner-dao/src/test/resources/mybatis-generator.properties new file mode 100644 index 000000000..e3ea012ed --- /dev/null +++ b/coolstore-partner-dao/src/test/resources/mybatis-generator.properties @@ -0,0 +1,6 @@ +jdbc.driver = com.mysql.cj.jdbc.Driver +jdbc.url = jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_base?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +jdbc.user= coolstore +jdbc.password = CSCErYcXniNYm7bT + +table.name = sys_role_menu_e88b6a2bc1334164b54977a4dbfe5d9d \ No newline at end of file diff --git a/coolstore-partner-dao/src/test/resources/mybatis-generator.xml b/coolstore-partner-dao/src/test/resources/mybatis-generator.xml new file mode 100644 index 000000000..b5e2299ed --- /dev/null +++ b/coolstore-partner-dao/src/test/resources/mybatis-generator.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/coolstore-partner-manage.iml b/coolstore-partner-manage.iml new file mode 100644 index 000000000..c035f0b00 --- /dev/null +++ b/coolstore-partner-manage.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-model/coolstore-partner-model.iml b/coolstore-partner-model/coolstore-partner-model.iml new file mode 100644 index 000000000..8bec2a814 --- /dev/null +++ b/coolstore-partner-model/coolstore-partner-model.iml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-model/pom.xml b/coolstore-partner-model/pom.xml new file mode 100644 index 000000000..128d075e3 --- /dev/null +++ b/coolstore-partner-model/pom.xml @@ -0,0 +1,30 @@ + + + + coolstore-partner-manage + com.coolstore + 1.0.0 + + 4.0.0 + + coolstore-partner-model + + + 8 + 8 + + + + + com.coolstore + coolstore-partner-common + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/dto/DatasourceInfoDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/dto/DatasourceInfoDTO.java new file mode 100644 index 000000000..bae572937 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/dto/DatasourceInfoDTO.java @@ -0,0 +1,56 @@ +package com.cool.store.model.dto; + +import com.cool.store.model.entity.EnterpriseConfigDO; +import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhangchenbiao + * @FileName: DatasourceInfoDTO + * @Description: + * @date 2023-05-18 14:28 + */ +@Data +public class DatasourceInfoDTO { + + /** + * serverurl + */ + private String dbServer; + + /** + * 端口 + */ + private Integer dbPort; + + /** + * 数据库用户 + */ + private String dbUser; + + /** + * 数据库密码 + */ + private String dbPwd; + + + public static List convertList(List configList){ + if (CollectionUtils.isEmpty(configList)) { + return null; + } + List resultList = new ArrayList<>(); + for (EnterpriseConfigDO enterpriseConfig : configList) { + DatasourceInfoDTO datasource = new DatasourceInfoDTO(); + datasource.setDbServer(enterpriseConfig.getDbServer()); + datasource.setDbPort(enterpriseConfig.getDbPort()); + datasource.setDbUser(enterpriseConfig.getDbUser()); + datasource.setDbPwd(enterpriseConfig.getDbPwd()); + resultList.add(datasource); + } + return resultList; + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseConfigDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseConfigDO.java new file mode 100644 index 000000000..c946a0eed --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseConfigDO.java @@ -0,0 +1,134 @@ +package com.cool.store.model.entity; + +import java.io.Serializable; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author zhangchenbiao + * @date 2023-05-18 11:09 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EnterpriseConfigDO implements Serializable { + /** + * 自增主键 + */ + private Long id; + + /** + * 当前套餐 + */ + private Long currentPackage; + + /** + * 企业id + */ + private String enterpriseId; + + /** + * 员工人数 + */ + private Integer staffCount; + + /** + * 数据库名称 + */ + private String dbSourceName; + + /** + * 数据库服务器 + */ + private String dbServer; + + /** + * + */ + private Integer dbPort; + + /** + * 数据库名称 + */ + private String dbName; + + /** + * 数据库用户 + */ + private String dbUser; + + /** + * 数据库密码 + */ + private String dbPwd; + + /** + * 授权私钥 + */ + private String license; + + /** + * 授权到期 + */ + private Date licenseExpires; + + /** + * 授权类型 + */ + private Integer licenseType; + + /** + * 钉钉业务id + */ + private String dingCorpId; + + /** + * 钉钉秘钥 + */ + private String dingCorpSecret; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 创建人 + */ + private String createUser; + + /** + * 主应用Id + */ + private String mainCorpId; + + /** + * 来源类型:默认dingding钉钉,qw企业微信 mobile + */ + private String appType; + + /** + * 授权码 + */ + private String permanentCode; + + /** + * 应用id + */ + private String agentid; + + /** + * 开通酷学院企业映射的企业id + */ + private String coolCollegeEnterpriseId; + + /** + * 开通酷学院企业返回的企业秘钥 + */ + private String coolCollegeSecret; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseUserDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseUserDO.java new file mode 100644 index 000000000..addce26fc --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseUserDO.java @@ -0,0 +1,131 @@ +package com.cool.store.model.entity; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author zhangchenbiao + * @date 2023-05-19 02:58 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EnterpriseUserDO implements Serializable { + @ApiModelProperty("用户主键id") + private String id; + + @ApiModelProperty("钉钉用户id") + private String userId; + + @ApiModelProperty("") + private String name; + + @ApiModelProperty("分机号") + private String tel; + + @ApiModelProperty("") + private String workPlace; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("员工的电子邮箱") + private String email; + + @ApiModelProperty("员工的企业邮箱") + private String orgEmail; + + @ApiModelProperty("是否已经激活, true表示已激活, false表示未激活") + private Boolean active; + + @ApiModelProperty("") + private String orderInDepts; + + @ApiModelProperty("是否是主管理员,0:否,1:是") + private Integer mainAdmin; + + @ApiModelProperty("是否为企业的管理员, true表示是, false表示不是") + private Boolean isAdmin; + + @ApiModelProperty("是否为企业的老板, true表示是, false表示不是") + private Boolean isBoss; + + @ApiModelProperty("钉钉Id,在钉钉全局范围内标识用户的身份,但用户可以自行修改一次") + private String dingid; + + @ApiModelProperty("在当前isv全局范围内唯一标识一个用户的身份,用户无法修改") + private String unionid; + + @ApiModelProperty("是否号码隐藏, true表示隐藏, false表示不隐藏") + private Boolean isHide; + + @ApiModelProperty("") + private String position; + + @ApiModelProperty("头像url") + private String avatar; + + @ApiModelProperty("扩展属性,可以设置多种属性(但手机上最多只能显示10个扩展属性,具体显示哪些属性,请到OA管理后台->设置->通讯录信息设置和OA管理后台->设置->手机端显示信息设置)性") + private String extattr; + + @ApiModelProperty("") + private Boolean isEnterprise; + + @ApiModelProperty("") + private String roles; + + @ApiModelProperty("是否是部门的主管, true表示是, false表示不是") + private Boolean isLeader; + + @ApiModelProperty("人脸照片url") + private String faceUrl; + + @ApiModelProperty("用户创建时间") + private Date createTime; + + @ApiModelProperty("用户语言环境:en_us/英语_美国,zh_cn/中文_简体,zh_hk/中文_繁体_HK") + private String language; + + @ApiModelProperty("用户状态 0待审核 1正常 2冻结") + private Integer userStatus; + + @ApiModelProperty("第三方OA系统唯一标识") + private String thirdOaUniqueFlag; + + @ApiModelProperty("下级是否变动,0 没变动,1 变动") + private Integer subordinateChange; + + @ApiModelProperty("修改时间") + private Date updateTime; + + @ApiModelProperty("管辖用户范围:self-仅自己,all-全部人员,define-自定义") + private String subordinateRange; + + @ApiModelProperty("") + private String isLeaderInDepts; + + @ApiModelProperty("") + private String department; + + @ApiModelProperty("工号") + private String jobnumber; + + @ApiModelProperty("") + private String monitoredDepartments; + + @ApiModelProperty("部门全路径") + private String departments; + + @ApiModelProperty("部门集合(region_ids)") + private String userRegionIds; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseUserRoleDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseUserRoleDO.java new file mode 100644 index 000000000..b40b42544 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/EnterpriseUserRoleDO.java @@ -0,0 +1,35 @@ +package com.cool.store.model.entity; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author zhangchenbiao + * @date 2023-05-19 02:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EnterpriseUserRoleDO implements Serializable { + @ApiModelProperty("主键id") + private Integer id; + + @ApiModelProperty("角色id") + private Long roleId; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/RegionDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/RegionDO.java new file mode 100644 index 000000000..ab3ad29ab --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/RegionDO.java @@ -0,0 +1,76 @@ +package com.cool.store.model.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-05-19 02:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RegionDO implements Serializable { + @ApiModelProperty("自增ID") + private Long id; + + @ApiModelProperty("区域ID") + private String regionId; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("父区域id") + private Long parentId; + + @ApiModelProperty("阿里云分组id") + private String groupId; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("创建人") + private String createName; + + @ApiModelProperty("更新时间") + private Long updateTime; + + @ApiModelProperty("更新人") + private String updateName; + + @ApiModelProperty("vds分组id") + private String vdsGroupCorpId; + + @ApiModelProperty("dinging部门id") + private String synDingDeptId; + + @ApiModelProperty("区域类型 root 根目录 path 区域 store 门店") + private String regionType; + + @ApiModelProperty("区域路径") + private String regionPath; + + @ApiModelProperty("删除标记") + private Boolean deleted; + + @ApiModelProperty("门店数量") + private Integer storeNum; + + @ApiModelProperty("门店ID") + private String storeId; + + @ApiModelProperty("未分组标志 0 分组 1 未分组") + private Integer unclassifiedFlag; + + @ApiModelProperty("排序") + private Integer orderNum; + + @ApiModelProperty("第三方唯一id") + private String thirdDeptId; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysDepartmentDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysDepartmentDO.java new file mode 100644 index 000000000..e815ea6b3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysDepartmentDO.java @@ -0,0 +1,73 @@ +package com.cool.store.model.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-05-19 03:00 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDepartmentDO implements Serializable { + @ApiModelProperty("主键id") + private String id; + + @ApiModelProperty("部门名称") + private String name; + + @ApiModelProperty("parent_id") + private String parentId; + + @ApiModelProperty("在父部门中的次序值") + private Integer departOrder; + + @ApiModelProperty("是否同步创建一个关联此部门的企业群, true表示是, false表示不是") + private Boolean createDeptGroup; + + @ApiModelProperty("当群已经创建后,是否有新人加入部门会自动加入该群, true表示是, false表示不是") + private Boolean autoAddUser; + + @ApiModelProperty("是否隐藏部门, true表示隐藏, false表示显示") + private Boolean depHiding; + + @ApiModelProperty("可以查看指定隐藏部门的其他部门列表,如果部门隐藏,则此值生效,取值为其他的部门id组成的的字符串,使用|符号进行分割") + private String deptPerimits; + + @ApiModelProperty("可以查看指定隐藏部门的其他人员列表,如果部门隐藏,则此值生效,取值为其他的人员userid组成的的字符串,使用|符号进行分割") + private String userPerimits; + + @ApiModelProperty("是否本部门的员工仅可见员工自己, 为true时,本部门员工默认只能看到员工自己") + private Boolean outerDept; + + @ApiModelProperty("本部门的员工仅可见员工自己为true时,可以配置额外可见部门,值为部门id组成的的字符串,使用|符号进行分割") + private String outerPermitDepts; + + @ApiModelProperty("本部门的员工仅可见员工自己为true时,可以配置额外可见人员,值为userid组成的的字符串,使用| 符号进行分割") + private String outerPermitUsers; + + @ApiModelProperty("企业群群主") + private String orgDeptOwner; + + @ApiModelProperty("部门的主管列表,取值为由主管的userid组成的字符串,不同的userid使用|符号进行分割") + private String deptManagerUseridList; + + @ApiModelProperty("部门下总人数(包括子部门)") + private Integer userCount; + + @ApiModelProperty("部门下未激活总人数(包括子部门)") + private Integer unactiveUserCount; + + @ApiModelProperty("部门所有父级部门id, 不包括自己, 以/分隔") + private String parentIds; + + @ApiModelProperty("部门所有子部门id,以英文逗号分隔") + private String subIds; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysRoleDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysRoleDO.java new file mode 100644 index 000000000..ef512e4b1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysRoleDO.java @@ -0,0 +1,65 @@ +package com.cool.store.model.entity; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author zhangchenbiao + * @date 2023-05-19 03:00 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleDO implements Serializable { + @ApiModelProperty("自增id") + private Long id; + + @ApiModelProperty("") + private String roleName; + + @ApiModelProperty("是否预制") + private Boolean isInternal; + + @ApiModelProperty("角色权限范围all(全企业数据)include_subordinate(所在组织架构包含下级) not_include_subordinate(所在的组织架构不包含下级) personal (仅自己的数据) ") + private String roleAuth; + + @ApiModelProperty("岗位来源:(create:自建岗位, sync:从钉钉同步的角色,sync_position从钉钉同步的职位, ehr 从第三方ehr同步的)") + private String source; + + @ApiModelProperty("职位类型:store_outside-店外,store_inside-店内") + private String positionType; + + @ApiModelProperty("移动端菜单") + private String appMenu; + + @ApiModelProperty("钉钉角色id") + private Long synDingRoleId; + + @ApiModelProperty("角色排序 1.管理员 1-99.门店职位 100+.钉钉角色") + private Integer priority; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("角色枚举用于判定逻辑") + private String roleEnum; + + @ApiModelProperty("创建人") + private String createUser; + + @ApiModelProperty("更新人") + private String updateUser; + + @ApiModelProperty("第三方唯一id") + private String thirdUniqueId; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysRoleMenuDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysRoleMenuDO.java new file mode 100644 index 000000000..1cda20a1c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/SysRoleMenuDO.java @@ -0,0 +1,31 @@ +package com.cool.store.model.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-05-19 03:01 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleMenuDO implements Serializable { + @ApiModelProperty("自增id") + private Long id; + + @ApiModelProperty("菜单id") + private Long menuId; + + @ApiModelProperty("角色id") + private Long roleId; + + @ApiModelProperty("菜单类型") + private String platform; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/UserAuthMappingDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/UserAuthMappingDO.java new file mode 100644 index 000000000..6edcb14f6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/UserAuthMappingDO.java @@ -0,0 +1,47 @@ +package com.cool.store.model.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-05-19 02:54 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserAuthMappingDO implements Serializable { + + @ApiModelProperty("主键") + private Long id; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("映射主键(区域或者是门店)") + private String mappingId; + + @ApiModelProperty("映射类型 region (区域) store(门店)") + private String type; + + @ApiModelProperty("来源:create-数智门店创建 sync-钉钉同步") + private String source; + + @ApiModelProperty("创建人") + private String createId; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新人") + private String updateId; + + @ApiModelProperty("更新时间") + private Long updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/model/entity/UserRegionMappingDO.java b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/UserRegionMappingDO.java new file mode 100644 index 000000000..e5ee9bc6f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/model/entity/UserRegionMappingDO.java @@ -0,0 +1,40 @@ +package com.cool.store.model.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-05-19 03:00 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserRegionMappingDO implements Serializable { + @ApiModelProperty("主键") + private Integer id; + + @ApiModelProperty("映射主键(区域或者是门店)") + private String regionId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("创建人") + private String createId; + + @ApiModelProperty("创建时间") + private Long createTime; + + @ApiModelProperty("更新人") + private String updateId; + + @ApiModelProperty("更新时间") + private Long updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-service/coolstore-partner-service.iml b/coolstore-partner-service/coolstore-partner-service.iml new file mode 100644 index 000000000..ffa07d6c7 --- /dev/null +++ b/coolstore-partner-service/coolstore-partner-service.iml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-service/pom.xml b/coolstore-partner-service/pom.xml new file mode 100644 index 000000000..c2a516840 --- /dev/null +++ b/coolstore-partner-service/pom.xml @@ -0,0 +1,34 @@ + + + + coolstore-partner-manage + com.coolstore + 1.0.0 + + 4.0.0 + + coolstore-partner-service + + + 8 + 8 + + + + + com.coolstore + coolstore-partner-common + + + com.coolstore + coolstore-partner-dao + + + com.coolstore + coolstore-partner-model + + + + \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseConfigService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseConfigService.java new file mode 100644 index 000000000..62e7ecae6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/EnterpriseConfigService.java @@ -0,0 +1,26 @@ +package com.cool.store.service; + + +import com.cool.store.model.entity.EnterpriseConfigDO; + +import java.util.List; + + +public interface EnterpriseConfigService { + + EnterpriseConfigDO selectByEnterpriseId(String enterpriseId); + + /** + * 根据dbName获取dbServer + * @param dbName + * @return + */ + EnterpriseConfigDO getDbInfoByDbName(String dbName); + + /** + * 获取dbServer + * @return + */ + List getDistinctDbServer(); + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/config/redis/RedisUtilConfig.java b/coolstore-partner-service/src/main/java/com/cool/store/service/config/redis/RedisUtilConfig.java new file mode 100644 index 000000000..09e6cdacf --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/config/redis/RedisUtilConfig.java @@ -0,0 +1,41 @@ +package com.cool.store.service.config.redis; + +import com.cool.store.model.utils.RedisUtilPool; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import redis.clients.jedis.JedisPoolConfig; +import redis.clients.jedis.JedisShardInfo; +import redis.clients.jedis.ShardedJedisPool; + +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName RedisUtilConfig + * @Description 用一句话描述什么 + */ +@Component +public class RedisUtilConfig { + + @Value("${redis.host.uri}") + private String REDIS_HOST_URI; + + @Bean + public RedisUtilPool redisUtilPool() { + + RedisUtilPool redisUtil = new RedisUtilPool(); + + JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); + jedisPoolConfig.setMaxTotal(1024); + jedisPoolConfig.setMaxIdle(200); + jedisPoolConfig.setMaxWaitMillis(1000); + jedisPoolConfig.setTestOnBorrow(false); + + List shards = new ArrayList<>(); + JedisShardInfo jedisShardInfo = new JedisShardInfo(REDIS_HOST_URI); + shards.add(jedisShardInfo); + redisUtil.setShardedJedisPool(new ShardedJedisPool(jedisPoolConfig, shards)); + return redisUtil; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/context/CurrentUser.java b/coolstore-partner-service/src/main/java/com/cool/store/service/context/CurrentUser.java new file mode 100644 index 000000000..c7923b416 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/context/CurrentUser.java @@ -0,0 +1,37 @@ +package com.cool.store.service.context; + +import lombok.Data; + + +@Data +public class CurrentUser { + + private String userId; + + private String enterpriseId; + + private String dingCorpId; + + private String appType; + + private String accessToken; + + /** + * 员工角色 + */ + private String roleIds; + + private String dbName; + + /** + * 钉钉管理员和数智门店无关 + */ + private Boolean isAdmin; + + /** + * 角色权限 + */ + private String roleAuth; + + private String mainCorpId; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/context/DataSourceContext.java b/coolstore-partner-service/src/main/java/com/cool/store/service/context/DataSourceContext.java new file mode 100644 index 000000000..6542a8fa7 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/context/DataSourceContext.java @@ -0,0 +1,31 @@ +package com.cool.store.service.context; + +import java.util.ArrayList; +import java.util.List; + +public class DataSourceContext { + + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + private static List dataSourceIds = new ArrayList<>(); + + public static void setDataSourceType(String dataSourceType) { + CONTEXT_HOLDER.set(dataSourceType); + } + + public static String getDataSourceType() { + return CONTEXT_HOLDER.get(); + } + + public static void clearDataSourceType() { + CONTEXT_HOLDER.remove(); + } + + public static boolean containsDataSource(String dsId) { + return dataSourceIds.contains(dsId); + } + + public static void setDataSourceIds(List dids){ + dataSourceIds = dids; + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/context/UserContext.java b/coolstore-partner-service/src/main/java/com/cool/store/service/context/UserContext.java new file mode 100644 index 000000000..6c71db5f3 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/context/UserContext.java @@ -0,0 +1,30 @@ +package com.cool.store.service.context; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.lang3.StringUtils; + +/** + * + */ +public class UserContext { + + private static final ThreadLocal contextHolder = new ThreadLocal(); + + public static CurrentUser getUser() { + String userStr = contextHolder.get(); + if (StringUtils.isNotBlank(userStr)) { + return JSON.parseObject(userStr, CurrentUser.class); + } + return new CurrentUser(); + } + + public static void setUser(String user) { + contextHolder.set(user); + } + + public static void removeUser(){ + contextHolder.remove(); + } +} + + diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseConfigServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseConfigServiceImpl.java new file mode 100644 index 000000000..cf1a852e9 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseConfigServiceImpl.java @@ -0,0 +1,39 @@ +package com.cool.store.service.impl; + +import com.cool.store.dao.EnterpriseConfigDAO; +import com.cool.store.model.entity.EnterpriseConfigDO; +import com.cool.store.service.EnterpriseConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @ClassName EnterpriseConfigServiceImpl + * @Description 用一句话描述什么 + */ +@Service(value = "enterpriseConfigService") +@Slf4j +public class EnterpriseConfigServiceImpl implements EnterpriseConfigService { + + @Resource + private EnterpriseConfigDAO enterpriseConfigDAO; + + @Override + public EnterpriseConfigDO selectByEnterpriseId(String enterpriseId) { + return enterpriseConfigDAO.selectByEnterpriseId(enterpriseId); + } + + @Override + public EnterpriseConfigDO getDbInfoByDbName(String dbName) { + return enterpriseConfigDAO.getDbInfoByDbName(dbName); + } + + @Override + public List getDistinctDbServer() { + return enterpriseConfigDAO.getDistinctDbServer(); + } + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/utils/DataSourceHelper.java b/coolstore-partner-service/src/main/java/com/cool/store/service/utils/DataSourceHelper.java new file mode 100644 index 000000000..f3f991d29 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/utils/DataSourceHelper.java @@ -0,0 +1,50 @@ +package com.cool.store.service.utils; + +import com.cool.store.service.context.DataSourceContext; +import com.cool.store.service.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(); + } +} diff --git a/coolstore-partner-webb/coolstore-partner-webb.iml b/coolstore-partner-webb/coolstore-partner-webb.iml new file mode 100644 index 000000000..f1752556b --- /dev/null +++ b/coolstore-partner-webb/coolstore-partner-webb.iml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-webb/pom.xml b/coolstore-partner-webb/pom.xml new file mode 100644 index 000000000..3d39208d9 --- /dev/null +++ b/coolstore-partner-webb/pom.xml @@ -0,0 +1,96 @@ + + + + coolstore-partner-manage + com.coolstore + 1.0.0 + + 4.0.0 + + coolstore-partner-webb + + + 8 + 8 + + + + + com.coolstore + coolstore-partner-service + + + org.springframework.boot + spring-boot-starter-web + + + + + + dev + + dev + + + + local + + true + + + local + + + + test + + test + + + + ab + + ab + + + + online + + online + + + + hd + + hd + + + + pre + + pre + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.sonarsource.scanner.maven + sonar-maven-plugin + + + org.jacoco + jacoco-maven-plugin + + + compile + + + \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/PartnerBWebApplication.java b/coolstore-partner-webb/src/main/java/com/cool/store/PartnerBWebApplication.java new file mode 100644 index 000000000..fa45ab139 --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/PartnerBWebApplication.java @@ -0,0 +1,48 @@ +package com.cool.store; + +import com.zaxxer.hikari.HikariDataSource; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.scheduling.annotation.EnableAsync; + +import javax.sql.DataSource; + +/** + * @author zhangchenbiao + * @FileName: PartnerCWebApplication + * @Description: C端web层 + * @date 2023-05-17 11:28 + */ +@SpringBootApplication +@MapperScan("com.cool.store.mapper") +@EnableAsync +@EnableCaching +@ServletComponentScan +public class PartnerBWebApplication { + + public static void main(String[] args) { + SpringApplication.run(PartnerBWebApplication.class, args); + } + + @Bean + @Primary + @ConfigurationProperties("default.datasource") + public DataSourceProperties defaultDataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean + @ConfigurationProperties("spring.datasource.hikari") + public DataSource defaultDataSource() { + DataSource defaultDataSource = defaultDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); + return defaultDataSource; + } + +} diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/config/CommonBeanConfig.java b/coolstore-partner-webb/src/main/java/com/cool/store/config/CommonBeanConfig.java new file mode 100644 index 000000000..2e2f268cb --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/config/CommonBeanConfig.java @@ -0,0 +1,40 @@ +package com.cool.store.config; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.config.datasource.DynamicDataSourceServiceImpl; +import com.cool.store.model.dto.DatasourceInfoDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * @author zhangchenbiao + * @FileName: CommonBeanConfig + * @Description: + * @date 2022-01-25 18:41 + */ +@Slf4j +@Component +public class CommonBeanConfig { + + @Autowired + private DynamicDataSourceServiceImpl dynamicDataSourceServiceImpl; + + + @PostConstruct + public void loadDataSource(){ + List dbServerList = dynamicDataSourceServiceImpl.getDbNodes(); + if (CollectionUtils.isEmpty(dbServerList)) { + return; + } + dbServerList.forEach(node -> { + dynamicDataSourceServiceImpl.createDataSource(node); + }); + log.info("数据源加载完毕:{}", JSONObject.toJSONString(dbServerList)); + } + +} diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/DynamicDataSource.java b/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/DynamicDataSource.java new file mode 100644 index 000000000..eade83d3a --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/DynamicDataSource.java @@ -0,0 +1,105 @@ +package com.cool.store.config.datasource; + +import com.cool.store.model.constants.CommonConstants; +import com.cool.store.service.context.DataSourceContext; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.AbstractDataSource; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; + +@Primary +@Component +public class DynamicDataSource extends AbstractDataSource { + + private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class); + + @Autowired + private DataSource defaultDataSource; + + @Autowired + private DynamicDataSourceServiceImpl dynamicDataSourceService; + + @Override + public Connection getConnection() throws SQLException { + String currentDbName = getCurrentDbName(); + if(CommonConstants.DEFAULT_DB.equals(currentDbName)){ + Connection connection = defaultDataSource.getConnection(); + connection.setCatalog(currentDbName); + return connection; + } + Connection connection = this.determineTargetDataSource().getConnection(); + connection.setCatalog(currentDbName); + return connection; + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + String currentDbName = getCurrentDbName(); + if(CommonConstants.DEFAULT_DB.equals(currentDbName)){ + Connection connection = defaultDataSource.getConnection(); + connection.setCatalog(currentDbName); + return connection; + } + Connection connection = this.determineTargetDataSource().getConnection(username, password); + connection.setCatalog(getCurrentDbName()); + return connection; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return iface.isInstance(this) ? (T) this : this.determineTargetDataSource().unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return iface.isInstance(this) || this.determineTargetDataSource().isWrapperFor(iface); + } + + + protected DataSource determineTargetDataSource() { + DataSource dataSource = null; + Map resolvedDataSources = dynamicDataSourceService.getResolvedDataSources(); + if (resolvedDataSources != null) { + String lookupKey = getDbServerByDbName(); + if (StringUtils.isNotBlank(lookupKey)) { + dataSource = resolvedDataSources.get(lookupKey); + } + } + if (dataSource == null) { + dataSource = defaultDataSource; + } + return dataSource; + } + + /** + * 通过dbName获取dbServer + * + * @return + */ + protected String getDbServerByDbName() { + String dbName = getCurrentDbName(); + return dynamicDataSourceService.getDbServerByDbName(dbName); + } + + /** + * 查询当前线程上下文对应的库名 + * + * @return + */ + protected String getCurrentDbName() { + String dbName = DataSourceContext.getDataSourceType(); + if (StringUtils.isBlank(dbName)) { + dbName = CommonConstants.DEFAULT_DB; + } + return dbName; + } + +} diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/DynamicDataSourceServiceImpl.java b/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/DynamicDataSourceServiceImpl.java new file mode 100644 index 000000000..3ebffb86a --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/DynamicDataSourceServiceImpl.java @@ -0,0 +1,133 @@ +package com.cool.store.config.datasource; + +import com.cool.store.model.constants.CommonConstants; +import com.cool.store.model.dto.DatasourceInfoDTO; +import com.cool.store.model.entity.EnterpriseConfigDO; +import com.cool.store.model.utils.RedisUtilPool; +import com.cool.store.service.EnterpriseConfigService; +import com.cool.store.service.context.DataSourceContext; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; +import java.text.MessageFormat; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @ClassName DynamicDataSourceServiceImpl + * @Description 用一句话描述什么 + */ +@Service +@Slf4j +public class DynamicDataSourceServiceImpl { + + private static int defaultMaxPoolSize = 150; + + private static String dbUrl = "jdbc:mysql://{0}:{1}/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true"; + + @Autowired + private RedisUtilPool redisUtilPool; + + @Autowired + private MyHikariConfig myHikariConfig; + + @Autowired + private EnterpriseConfigService enterpriseConfigService; + + /** + * 数据库实例和数据源的映射 + */ + private ConcurrentHashMap resolvedDataSources = new ConcurrentHashMap(); + + /** + * dbName 和 serverUrl的映射 + */ + private ConcurrentHashMap dbNameUrlServerMap = new ConcurrentHashMap(); + + /** + * 查询所有的企业数据库实例节点配置信息 + * + * @return + */ + public List getDbNodes() { + List configList = enterpriseConfigService.getDistinctDbServer(); + return DatasourceInfoDTO.convertList(configList); + } + + /** + * 根据dbName查询dbServer + * + * @param dbName + * @return + */ + public String getDbServerByDbName(String dbName) { + if(CommonConstants.DEFAULT_DB.equals(dbName)){ + return null; + } + String dbServerUrl = dbNameUrlServerMap.get(dbName); + if(StringUtils.isBlank(dbServerUrl)){ + Page localPage = PageHelper.getLocalPage(); + if(Objects.nonNull(localPage)){ + PageHelper.clearPage(); + } + String currentDbName = DataSourceContext.getDataSourceType(); + EnterpriseConfigDO config = enterpriseConfigService.getDbInfoByDbName(dbName); + dbServerUrl = config.getDbServer(); + if(StringUtils.isNotBlank(currentDbName)){ + DataSourceContext.setDataSourceType(currentDbName); + } + if(Objects.nonNull(localPage)){ + //上下文中的东西及时还回去 + PageHelper.startPage(localPage.getPageNum(), localPage.getPageSize()); + } + dbNameUrlServerMap.put(dbName, dbServerUrl); + } + return dbServerUrl; + } + + public void createDataSource(DatasourceInfoDTO datasource) { + DataSource dataSource = buildDataSourceByConfig(datasource); + if (dataSource != null) { + this.resolvedDataSources.putIfAbsent(datasource.getDbServer(), dataSource); + } + } + + public Map getResolvedDataSources() { + return resolvedDataSources; + } + + + /** + * build datasource + * @param dbServerUrl + * @return + */ + private DataSource buildDataSourceByConfig(DatasourceInfoDTO datasource) { + HikariConfig hikariConfig = new HikariConfig(); + String url = MessageFormat.format(dbUrl, datasource.getDbServer(), String.valueOf(datasource.getDbPort())); + hikariConfig.setDriverClassName(myHikariConfig.getDriverClassName()); + hikariConfig.setMinimumIdle(myHikariConfig.getMinimumIdle()); + hikariConfig.setMaximumPoolSize(myHikariConfig.getMaximumPoolSize()); + hikariConfig.setMaxLifetime(myHikariConfig.getMaxLifetime()); + hikariConfig.setConnectionTimeout(myHikariConfig.getConnectionTimeout()); + hikariConfig.setIdleTimeout(myHikariConfig.getIdleTimeout()); + hikariConfig.setJdbcUrl(url); + hikariConfig.setUsername(datasource.getDbUser()); + hikariConfig.setPassword(datasource.getDbPwd()); + hikariConfig.setMaximumPoolSize(defaultMaxPoolSize); + String poolName = "HikariCP_" + datasource.getDbServer(); + hikariConfig.setPoolName(poolName); + HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig); + log.info("{} dataSource is {}, maxPoolSize={}", poolName, hikariDataSource, hikariDataSource.getMaximumPoolSize()); + return hikariDataSource; + } +} diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/MyHikariConfig.java b/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/MyHikariConfig.java new file mode 100644 index 000000000..72e591bdb --- /dev/null +++ b/coolstore-partner-webb/src/main/java/com/cool/store/config/datasource/MyHikariConfig.java @@ -0,0 +1,10 @@ +package com.cool.store.config.datasource; + +import com.zaxxer.hikari.HikariConfig; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("spring.datasource.hikari") +public class MyHikariConfig extends HikariConfig { +} diff --git a/coolstore-partner-webb/src/main/resources/application-ab.properties b/coolstore-partner-webb/src/main/resources/application-ab.properties new file mode 100644 index 000000000..c4833f1a2 --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-ab.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://tzk.coolcollege.cn:2188 +com.alipay.sofa.rpc.bolt.port=31010 diff --git a/coolstore-partner-webb/src/main/resources/application-dev.properties b/coolstore-partner-webb/src/main/resources/application-dev.properties new file mode 100644 index 000000000..361d20713 --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-dev.properties @@ -0,0 +1,41 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +#default.datasource.url=jdbc:mysql://dstore-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT +#default.datasource.url=jdbc:mysql://127.0.0.1:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +#default.datasource.username=root +#default.datasource.password=root + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://dzk.coolcollege.cn:2188 +com.alipay.sofa.rpc.bolt.port=31010 \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/resources/application-hd.properties b/coolstore-partner-webb/src/main/resources/application-hd.properties new file mode 100644 index 000000000..d0f112448 --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-hd.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://store-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=store-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://10.7.53.199:2188 +com.alipay.sofa.rpc.bolt.port=31010 \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/resources/application-local.properties b/coolstore-partner-webb/src/main/resources/application-local.properties new file mode 100644 index 000000000..98f915351 --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-local.properties @@ -0,0 +1,44 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +#default.datasource.url=jdbc:mysql://dstore-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT +#default.datasource.url=jdbc:mysql://127.0.0.1:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +#default.datasource.username=root +#default.datasource.password=root + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +#subtable size +customize_sub_table_size=10 + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://localhost:2181 +com.alipay.sofa.rpc.bolt.port=31010 \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/resources/application-online.properties b/coolstore-partner-webb/src/main/resources/application-online.properties new file mode 100644 index 000000000..4fc5f624d --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-online.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://store-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=store-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://10.6.49.221:2188,10.6.49.222:2188,10.6.49.223:2188 +com.alipay.sofa.rpc.bolt.port=31010 \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/resources/application-pre.properties b/coolstore-partner-webb/src/main/resources/application-pre.properties new file mode 100644 index 000000000..f0b8ab38d --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-pre.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://store-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=store-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://10.7.54.149:2188 +com.alipay.sofa.rpc.bolt.port=31010 \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/resources/application-test.properties b/coolstore-partner-webb/src/main/resources/application-test.properties new file mode 100644 index 000000000..d05b5c20c --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application-test.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://tzk.coolcollege.cn:2188 +com.alipay.sofa.rpc.bolt.port=31010 \ No newline at end of file diff --git a/coolstore-partner-webb/src/main/resources/application.properties b/coolstore-partner-webb/src/main/resources/application.properties new file mode 100644 index 000000000..a8be98017 --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/application.properties @@ -0,0 +1,52 @@ +spring.application.name=coolstore-partner-webb +spring.profiles.active=@profileActive@ + +server.port=31000 +server.servlet.context-path=/partner + +#logback +logging.config=classpath:logback-spring.xml +logging.path=/data/log/partner + +#connection pool config +spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.hikari.cachePrepStmts=true +spring.datasource.hikari.prepStmtCacheSize=250 +spring.datasource.hikari.prepStmtCacheSqlLimit=2048 +spring.datasource.hikari.useServerPrepStmts=true +spring.datasource.hikari.useLocalSessionState=true +spring.datasource.hikari.rewriteBatchedStatements=true +spring.datasource.hikari.cacheResultSetMetadata=true +spring.datasource.hikari.cacheServerConfiguration=true +spring.datasource.hikari.elideSetAutoCommits=true +spring.datasource.hikari.maintainTimeStats=false +spring.datasource.hikari.minimumIdle=10 +spring.datasource.hikari.maximumPoolSize=150 +spring.datasource.hikari.maxLifetime=200000 +spring.datasource.hikari.connectionTimeout=3000 +spring.datasource.hikari.poolName=DefaultHikariCP +spring.datasource.hikari.idleTimeout=300000 +#\u914D\u7F6E\u8FD4\u56DE\u65F6\u95F4\u6233 +spring.jackson.serialization.write-dates-as-timestamps=true +# file size +spring.servlet.multipart.maxFileSize=1024MB +spring.servlet.multipart.maxRequestSize=1024MB +# Max file size. +spring.servlet.multipart.max-file-size=1024MB +# Max request size. +spring.servlet.multipart.max-request-size=1024MB +spring.main.allow-circular-references=true + +allow.upload.image.ext=jpg,jpeg,gif,png,bmp,jfif +allow.upload.file.ext=zip,mp4,pptx,ppt,doc,docx,pdf +allow.upload.video.ext=3gp,asf,avi,dat,dv,flv,f4v,gif,m2t,m3u8,m4v,mj2,mjpeg,mkv,mov,mp4,mpe,mpg,mpeg,mts,ogg,qt,rm,rmvb,swf,ts,vob,wmv,webm +allow.upload.audio.ext=mp3 +allow.upload.image.size=1024 * 1024L * 1024L +allow.upload.file.size=30 * 1024 * 1024L +allow.upload.video.size=1024 * 1024 * 10L +allow.upload.audio.size=1024 * 1024 * 10L + +server.connection-timeout=18000000 +server.tomcat.basedir=/tmp/tomcat/partner-b + +log4j2.formatMsgNoLookups=true diff --git a/coolstore-partner-webb/src/main/resources/logback-spring.xml b/coolstore-partner-webb/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..3e7aeec15 --- /dev/null +++ b/coolstore-partner-webb/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + DEBUG + + + ${log_pattern} + + + + + > + ${logBaseFolder}/${logFileNamePrefix}.%d{yyyy-MM-dd}.log + ${every_his_size} + + + ${log_pattern} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-webc/coolstore-partner-webc.iml b/coolstore-partner-webc/coolstore-partner-webc.iml new file mode 100644 index 000000000..cc4a66ce8 --- /dev/null +++ b/coolstore-partner-webc/coolstore-partner-webc.iml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-webc/pom.xml b/coolstore-partner-webc/pom.xml new file mode 100644 index 000000000..0acf08c8c --- /dev/null +++ b/coolstore-partner-webc/pom.xml @@ -0,0 +1,101 @@ + + + + coolstore-partner-manage + com.coolstore + 1.0.0 + + 4.0.0 + + coolstore-partner-webc + + + 8 + 8 + + + + + com.coolstore + coolstore-partner-service + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter + + + + + + + dev + + dev + + + + local + + true + + + local + + + + test + + test + + + + ab + + ab + + + + online + + online + + + + hd + + hd + + + + pre + + pre + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.sonarsource.scanner.maven + sonar-maven-plugin + + + org.jacoco + jacoco-maven-plugin + + + compile + + + \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/PartnerCWebApplication.java b/coolstore-partner-webc/src/main/java/com/cool/store/PartnerCWebApplication.java new file mode 100644 index 000000000..fa3ea5955 --- /dev/null +++ b/coolstore-partner-webc/src/main/java/com/cool/store/PartnerCWebApplication.java @@ -0,0 +1,49 @@ +package com.cool.store; + +import com.zaxxer.hikari.HikariDataSource; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.scheduling.annotation.EnableAsync; + +import javax.sql.DataSource; + +/** + * @author zhangchenbiao + * @FileName: PartnerBWebApplication + * @Description: B端web层 + * @date 2023-05-17 11:28 + */ +@SpringBootApplication +@MapperScan("com.cool.store.mapper") +@EnableAsync +@EnableCaching +@ServletComponentScan +public class PartnerCWebApplication { + + public static void main(String[] args) { + SpringApplication.run(PartnerCWebApplication.class, args); + } + + @Bean + @Primary + @ConfigurationProperties("default.datasource") + public DataSourceProperties defaultDataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean + @ConfigurationProperties("spring.datasource.hikari") + public DataSource defaultDataSource() { + DataSource defaultDataSource = defaultDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build(); + return defaultDataSource; + } + +} diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/config/CommonBeanConfig.java b/coolstore-partner-webc/src/main/java/com/cool/store/config/CommonBeanConfig.java new file mode 100644 index 000000000..2e2f268cb --- /dev/null +++ b/coolstore-partner-webc/src/main/java/com/cool/store/config/CommonBeanConfig.java @@ -0,0 +1,40 @@ +package com.cool.store.config; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.config.datasource.DynamicDataSourceServiceImpl; +import com.cool.store.model.dto.DatasourceInfoDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * @author zhangchenbiao + * @FileName: CommonBeanConfig + * @Description: + * @date 2022-01-25 18:41 + */ +@Slf4j +@Component +public class CommonBeanConfig { + + @Autowired + private DynamicDataSourceServiceImpl dynamicDataSourceServiceImpl; + + + @PostConstruct + public void loadDataSource(){ + List dbServerList = dynamicDataSourceServiceImpl.getDbNodes(); + if (CollectionUtils.isEmpty(dbServerList)) { + return; + } + dbServerList.forEach(node -> { + dynamicDataSourceServiceImpl.createDataSource(node); + }); + log.info("数据源加载完毕:{}", JSONObject.toJSONString(dbServerList)); + } + +} diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/DynamicDataSource.java b/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/DynamicDataSource.java new file mode 100644 index 000000000..eade83d3a --- /dev/null +++ b/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/DynamicDataSource.java @@ -0,0 +1,105 @@ +package com.cool.store.config.datasource; + +import com.cool.store.model.constants.CommonConstants; +import com.cool.store.service.context.DataSourceContext; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.AbstractDataSource; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; + +@Primary +@Component +public class DynamicDataSource extends AbstractDataSource { + + private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class); + + @Autowired + private DataSource defaultDataSource; + + @Autowired + private DynamicDataSourceServiceImpl dynamicDataSourceService; + + @Override + public Connection getConnection() throws SQLException { + String currentDbName = getCurrentDbName(); + if(CommonConstants.DEFAULT_DB.equals(currentDbName)){ + Connection connection = defaultDataSource.getConnection(); + connection.setCatalog(currentDbName); + return connection; + } + Connection connection = this.determineTargetDataSource().getConnection(); + connection.setCatalog(currentDbName); + return connection; + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + String currentDbName = getCurrentDbName(); + if(CommonConstants.DEFAULT_DB.equals(currentDbName)){ + Connection connection = defaultDataSource.getConnection(); + connection.setCatalog(currentDbName); + return connection; + } + Connection connection = this.determineTargetDataSource().getConnection(username, password); + connection.setCatalog(getCurrentDbName()); + return connection; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return iface.isInstance(this) ? (T) this : this.determineTargetDataSource().unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return iface.isInstance(this) || this.determineTargetDataSource().isWrapperFor(iface); + } + + + protected DataSource determineTargetDataSource() { + DataSource dataSource = null; + Map resolvedDataSources = dynamicDataSourceService.getResolvedDataSources(); + if (resolvedDataSources != null) { + String lookupKey = getDbServerByDbName(); + if (StringUtils.isNotBlank(lookupKey)) { + dataSource = resolvedDataSources.get(lookupKey); + } + } + if (dataSource == null) { + dataSource = defaultDataSource; + } + return dataSource; + } + + /** + * 通过dbName获取dbServer + * + * @return + */ + protected String getDbServerByDbName() { + String dbName = getCurrentDbName(); + return dynamicDataSourceService.getDbServerByDbName(dbName); + } + + /** + * 查询当前线程上下文对应的库名 + * + * @return + */ + protected String getCurrentDbName() { + String dbName = DataSourceContext.getDataSourceType(); + if (StringUtils.isBlank(dbName)) { + dbName = CommonConstants.DEFAULT_DB; + } + return dbName; + } + +} diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/DynamicDataSourceServiceImpl.java b/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/DynamicDataSourceServiceImpl.java new file mode 100644 index 000000000..3ebffb86a --- /dev/null +++ b/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/DynamicDataSourceServiceImpl.java @@ -0,0 +1,133 @@ +package com.cool.store.config.datasource; + +import com.cool.store.model.constants.CommonConstants; +import com.cool.store.model.dto.DatasourceInfoDTO; +import com.cool.store.model.entity.EnterpriseConfigDO; +import com.cool.store.model.utils.RedisUtilPool; +import com.cool.store.service.EnterpriseConfigService; +import com.cool.store.service.context.DataSourceContext; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; +import java.text.MessageFormat; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @ClassName DynamicDataSourceServiceImpl + * @Description 用一句话描述什么 + */ +@Service +@Slf4j +public class DynamicDataSourceServiceImpl { + + private static int defaultMaxPoolSize = 150; + + private static String dbUrl = "jdbc:mysql://{0}:{1}/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true"; + + @Autowired + private RedisUtilPool redisUtilPool; + + @Autowired + private MyHikariConfig myHikariConfig; + + @Autowired + private EnterpriseConfigService enterpriseConfigService; + + /** + * 数据库实例和数据源的映射 + */ + private ConcurrentHashMap resolvedDataSources = new ConcurrentHashMap(); + + /** + * dbName 和 serverUrl的映射 + */ + private ConcurrentHashMap dbNameUrlServerMap = new ConcurrentHashMap(); + + /** + * 查询所有的企业数据库实例节点配置信息 + * + * @return + */ + public List getDbNodes() { + List configList = enterpriseConfigService.getDistinctDbServer(); + return DatasourceInfoDTO.convertList(configList); + } + + /** + * 根据dbName查询dbServer + * + * @param dbName + * @return + */ + public String getDbServerByDbName(String dbName) { + if(CommonConstants.DEFAULT_DB.equals(dbName)){ + return null; + } + String dbServerUrl = dbNameUrlServerMap.get(dbName); + if(StringUtils.isBlank(dbServerUrl)){ + Page localPage = PageHelper.getLocalPage(); + if(Objects.nonNull(localPage)){ + PageHelper.clearPage(); + } + String currentDbName = DataSourceContext.getDataSourceType(); + EnterpriseConfigDO config = enterpriseConfigService.getDbInfoByDbName(dbName); + dbServerUrl = config.getDbServer(); + if(StringUtils.isNotBlank(currentDbName)){ + DataSourceContext.setDataSourceType(currentDbName); + } + if(Objects.nonNull(localPage)){ + //上下文中的东西及时还回去 + PageHelper.startPage(localPage.getPageNum(), localPage.getPageSize()); + } + dbNameUrlServerMap.put(dbName, dbServerUrl); + } + return dbServerUrl; + } + + public void createDataSource(DatasourceInfoDTO datasource) { + DataSource dataSource = buildDataSourceByConfig(datasource); + if (dataSource != null) { + this.resolvedDataSources.putIfAbsent(datasource.getDbServer(), dataSource); + } + } + + public Map getResolvedDataSources() { + return resolvedDataSources; + } + + + /** + * build datasource + * @param dbServerUrl + * @return + */ + private DataSource buildDataSourceByConfig(DatasourceInfoDTO datasource) { + HikariConfig hikariConfig = new HikariConfig(); + String url = MessageFormat.format(dbUrl, datasource.getDbServer(), String.valueOf(datasource.getDbPort())); + hikariConfig.setDriverClassName(myHikariConfig.getDriverClassName()); + hikariConfig.setMinimumIdle(myHikariConfig.getMinimumIdle()); + hikariConfig.setMaximumPoolSize(myHikariConfig.getMaximumPoolSize()); + hikariConfig.setMaxLifetime(myHikariConfig.getMaxLifetime()); + hikariConfig.setConnectionTimeout(myHikariConfig.getConnectionTimeout()); + hikariConfig.setIdleTimeout(myHikariConfig.getIdleTimeout()); + hikariConfig.setJdbcUrl(url); + hikariConfig.setUsername(datasource.getDbUser()); + hikariConfig.setPassword(datasource.getDbPwd()); + hikariConfig.setMaximumPoolSize(defaultMaxPoolSize); + String poolName = "HikariCP_" + datasource.getDbServer(); + hikariConfig.setPoolName(poolName); + HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig); + log.info("{} dataSource is {}, maxPoolSize={}", poolName, hikariDataSource, hikariDataSource.getMaximumPoolSize()); + return hikariDataSource; + } +} diff --git a/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/MyHikariConfig.java b/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/MyHikariConfig.java new file mode 100644 index 000000000..72e591bdb --- /dev/null +++ b/coolstore-partner-webc/src/main/java/com/cool/store/config/datasource/MyHikariConfig.java @@ -0,0 +1,10 @@ +package com.cool.store.config.datasource; + +import com.zaxxer.hikari.HikariConfig; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("spring.datasource.hikari") +public class MyHikariConfig extends HikariConfig { +} diff --git a/coolstore-partner-webc/src/main/resources/application-ab.properties b/coolstore-partner-webc/src/main/resources/application-ab.properties new file mode 100644 index 000000000..a2876bfc7 --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-ab.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://tzk.coolcollege.cn:2188 +com.alipay.sofa.rpc.bolt.port=30910 diff --git a/coolstore-partner-webc/src/main/resources/application-dev.properties b/coolstore-partner-webc/src/main/resources/application-dev.properties new file mode 100644 index 000000000..c3074e3eb --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-dev.properties @@ -0,0 +1,41 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +#default.datasource.url=jdbc:mysql://dstore-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT +#default.datasource.url=jdbc:mysql://127.0.0.1:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +#default.datasource.username=root +#default.datasource.password=root + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://dzk.coolcollege.cn:2188 +com.alipay.sofa.rpc.bolt.port=30910 \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/resources/application-hd.properties b/coolstore-partner-webc/src/main/resources/application-hd.properties new file mode 100644 index 000000000..7db4976d1 --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-hd.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://store-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=store-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://10.7.53.199:2188 +com.alipay.sofa.rpc.bolt.port=30910 \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/resources/application-local.properties b/coolstore-partner-webc/src/main/resources/application-local.properties new file mode 100644 index 000000000..a6c973431 --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-local.properties @@ -0,0 +1,44 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +#default.datasource.url=jdbc:mysql://dstore-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT +#default.datasource.url=jdbc:mysql://127.0.0.1:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +#default.datasource.username=root +#default.datasource.password=root + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +#subtable size +customize_sub_table_size=10 + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://localhost:2181 +com.alipay.sofa.rpc.bolt.port=30910 \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/resources/application-online.properties b/coolstore-partner-webc/src/main/resources/application-online.properties new file mode 100644 index 000000000..dfa30f41a --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-online.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://store-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=store-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://10.6.49.221:2188,10.6.49.222:2188,10.6.49.223:2188 +com.alipay.sofa.rpc.bolt.port=30910 \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/resources/application-pre.properties b/coolstore-partner-webc/src/main/resources/application-pre.properties new file mode 100644 index 000000000..e16191656 --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-pre.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://store-coolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=store-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@store-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://10.7.54.149:2188 +com.alipay.sofa.rpc.bolt.port=30910 \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/resources/application-test.properties b/coolstore-partner-webc/src/main/resources/application-test.properties new file mode 100644 index 000000000..095a3a09a --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application-test.properties @@ -0,0 +1,37 @@ +#mysql config +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_config?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&serverTimezone=Asia/Shanghai +default.datasource.username=coolstore +default.datasource.password=CSCErYcXniNYm7bT + +#redis +spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com +spring.redis.port=6379 +spring.redis.password=Cx111111 +spring.redis.database=0 +spring.redis.timeout=2000ms +spring.redis.lettuce.pool.max-wait=100ms +spring.redis.lettuce.pool.max-active=1024 +spring.redis.lettuce.pool.max-idle=200 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.shutdown-timeout=100ms +redis.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/0 +redis.isv.host.uri=http://userInfo:Cx111111@tstore-coolcollege.redis.rds.aliyuncs.com:6379/2 + +#pagehelper +pagehelper.helper-dialect=mysql +pagehelper.reasonable=false +pagehelper.returnPageInfo=check +pagehelper.support-methods-arguments=false +pagehelper.params=count=countSql +pagehelper.page-size-zero=true + +spring.mvc.async.request-timeout=60000 + +# mybatis config +mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml + +mybatis.configuration.call-setters-on-nulls=true +mybatis.configuration.map-underscore-to-camel-case=true + +com.alipay.sofa.rpc.registry.address=zookeeper://tzk.coolcollege.cn:2188 +com.alipay.sofa.rpc.bolt.port=30910 \ No newline at end of file diff --git a/coolstore-partner-webc/src/main/resources/application.properties b/coolstore-partner-webc/src/main/resources/application.properties new file mode 100644 index 000000000..ab2696d52 --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/application.properties @@ -0,0 +1,52 @@ +spring.application.name=coolstore-partner-webc +spring.profiles.active=@profileActive@ + +server.port=30900 +server.servlet.context-path=/partner + +#logback +logging.config=classpath:logback-spring.xml +logging.path=/data/log/partner + +#connection pool config +spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.hikari.cachePrepStmts=true +spring.datasource.hikari.prepStmtCacheSize=250 +spring.datasource.hikari.prepStmtCacheSqlLimit=2048 +spring.datasource.hikari.useServerPrepStmts=true +spring.datasource.hikari.useLocalSessionState=true +spring.datasource.hikari.rewriteBatchedStatements=true +spring.datasource.hikari.cacheResultSetMetadata=true +spring.datasource.hikari.cacheServerConfiguration=true +spring.datasource.hikari.elideSetAutoCommits=true +spring.datasource.hikari.maintainTimeStats=false +spring.datasource.hikari.minimumIdle=10 +spring.datasource.hikari.maximumPoolSize=150 +spring.datasource.hikari.maxLifetime=200000 +spring.datasource.hikari.connectionTimeout=3000 +spring.datasource.hikari.poolName=DefaultHikariCP +spring.datasource.hikari.idleTimeout=300000 +#\u914D\u7F6E\u8FD4\u56DE\u65F6\u95F4\u6233 +spring.jackson.serialization.write-dates-as-timestamps=true +# file size +spring.servlet.multipart.maxFileSize=1024MB +spring.servlet.multipart.maxRequestSize=1024MB +# Max file size. +spring.servlet.multipart.max-file-size=1024MB +# Max request size. +spring.servlet.multipart.max-request-size=1024MB +spring.main.allow-circular-references=true + +allow.upload.image.ext=jpg,jpeg,gif,png,bmp,jfif +allow.upload.file.ext=zip,mp4,pptx,ppt,doc,docx,pdf +allow.upload.video.ext=3gp,asf,avi,dat,dv,flv,f4v,gif,m2t,m3u8,m4v,mj2,mjpeg,mkv,mov,mp4,mpe,mpg,mpeg,mts,ogg,qt,rm,rmvb,swf,ts,vob,wmv,webm +allow.upload.audio.ext=mp3 +allow.upload.image.size=1024 * 1024L * 1024L +allow.upload.file.size=30 * 1024 * 1024L +allow.upload.video.size=1024 * 1024 * 10L +allow.upload.audio.size=1024 * 1024 * 10L + +server.connection-timeout=18000000 +server.tomcat.basedir=/tmp/tomcat/partner-c + +log4j2.formatMsgNoLookups=true diff --git a/coolstore-partner-webc/src/main/resources/logback-spring.xml b/coolstore-partner-webc/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..9d68b0b0e --- /dev/null +++ b/coolstore-partner-webc/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + DEBUG + + + ${log_pattern} + + + + + > + ${logBaseFolder}/${logFileNamePrefix}.%d{yyyy-MM-dd}.log + ${every_his_size} + + + ${log_pattern} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..64a376ae2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,192 @@ + + + 4.0.0 + + com.coolstore + coolstore-partner-manage + pom + 1.0.0 + + coolstore-partner-webb + coolstore-partner-common + coolstore-partner-webc + coolstore-partner-dao + coolstore-partner-model + coolstore-partner-service + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.11 + + + + 8 + 8 + + + + + + + com.coolstore + coolstore-partner-common + 1.0.0 + + + com.coolstore + coolstore-partner-webc + 1.0.0 + + + com.coolstore + coolstore-partner-webb + 1.0.0 + + + com.coolstore + coolstore-partner-service + 1.0.0 + + + com.coolstore + coolstore-partner-model + 1.0.0 + + + com.coolstore + coolstore-partner-dao + 1.0.0 + + + org.springframework.boot + spring-boot-starter-jdbc + 3.0.2 + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.6 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + mysql + mysql-connector-java + 8.0.18 + + + org.projectlombok + lombok + 1.18.6 + + + com.alibaba + fastjson + 1.2.60 + + + org.apache.commons + commons-collections4 + 4.1 + + + org.apache.commons + commons-pool2 + 2.8.0 + + + redis.clients + jedis + 2.8.0 + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.4 + + + + + + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + 3.5.0.1254 + + + verify + + sonar + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.2 + + + prepare-agent + + prepare-agent + + + + prepare-agent-integration + + prepare-agent-integration + + + + jacoco-site + + report + + + + + + + + + + + + nexus + collcollege + http://nexus.coolcollege.cn/repository/maven-public/ + + + + + + nexus + collcollege + http://nexus.coolcollege.cn/repository/maven-public/ + + + + + nexus + nexus snapshot + http://nexus.coolcollege.cn/repository/maven-snapshots/ + + + nexus + nexus release + http://nexus.coolcollege.cn/repository/maven-releases/ + + + + \ No newline at end of file