Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
张松 2025-01-03 10:23:51 +08:00
commit 3ef249a5d4
16 changed files with 429 additions and 286 deletions

View File

@ -23,6 +23,11 @@ public class SpringContextUtils implements ApplicationContextAware {
return applicationContext.getBean(name); return applicationContext.getBean(name);
} }
public static Object getSpringBean(Class<?> clazz) {
return applicationContext == null ? null : applicationContext.getBean(clazz);
}
public static <T> T getBean(String name, Class<T> requiredType) { public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType); return applicationContext.getBean(name, requiredType);
} }

View File

@ -1,5 +1,6 @@
package com.sqx.config; package com.sqx.config;
import com.sqx.modules.utils.InvitationCodeUtil;
import com.sqx.sharding.MasterSlaveRules; import com.sqx.sharding.MasterSlaveRules;
import com.sqx.sharding.ShardingDataBase; import com.sqx.sharding.ShardingDataBase;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
@ -8,10 +9,12 @@ import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.api.config.masterslave.MasterSlaveRuleConfiguration; import org.apache.shardingsphere.api.config.masterslave.MasterSlaveRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.KeyGeneratorConfiguration;
import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration; import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration; import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration; import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration;
import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import org.codehaus.groovy.util.StringUtil;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -47,6 +50,11 @@ public class ShardingConfig {
*/ */
private String showSql; private String showSql;
/**
* 广播表
*/
private Set<String> broadcastTables;
/** /**
* 中心库的节点 * 中心库的节点
*/ */
@ -103,6 +111,9 @@ public class ShardingConfig {
// 配置数据库主从 // 配置数据库主从
shardingRuleConfig.setMasterSlaveRuleConfigs(masterSlaveRuleConfigs()); shardingRuleConfig.setMasterSlaveRuleConfigs(masterSlaveRuleConfigs());
// 配置广播表
shardingRuleConfig.setBroadcastTables(broadcastTables);
// 配置表的切分策略 // 配置表的切分策略
shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs()); shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs());
@ -131,13 +142,30 @@ public class ShardingConfig {
String.format(centerTablesDataNode, centerTable)); String.format(centerTablesDataNode, centerTable));
sets.add(tableRuleConfig); sets.add(tableRuleConfig);
} }
if ("prod".equals(activeProfile)) {
// 定义区域表的分库规则 // 定义区域表的分库规则
InlineShardingStrategyConfiguration databaseShardingStrategyConfig = new InlineShardingStrategyConfiguration( InlineShardingStrategyConfiguration databaseShardingStrategyConfig = new InlineShardingStrategyConfiguration(
regionTablesShardingDatabaseColumn, regionTablesShardingDatabaseAlgorithm); regionTablesShardingDatabaseColumn, regionTablesShardingDatabaseAlgorithm);
for (String regionTable : regionTables) { for (String regionTable : regionTables) {
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(regionTable, String.format(regionTablesDataNode, regionTable)); TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(regionTable, String.format(regionTablesDataNode, regionTable));
tableRuleConfig.setDatabaseShardingStrategyConfig(databaseShardingStrategyConfig); tableRuleConfig.setDatabaseShardingStrategyConfig(databaseShardingStrategyConfig);
// 设置区域表使用雪花算法生成主键
switch (regionTable){
case "orders":
tableRuleConfig.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "orders_id"));
break;
case "course_collect":
tableRuleConfig.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "course_collect_id"));
break;
case "course_user":
tableRuleConfig.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "course_user_id"));
break;
case "tb_user":
tableRuleConfig.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "user_id"));
break;
default:
tableRuleConfig.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "id"));
break;
}
sets.add(tableRuleConfig); sets.add(tableRuleConfig);
} }
@ -147,20 +175,12 @@ public class ShardingConfig {
for (String regionTable : courseDetails) { for (String regionTable : courseDetails) {
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(regionTable, String.format(regionTablesDataNode, regionTable)); TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(regionTable, String.format(regionTablesDataNode, regionTable));
tableRuleConfig.setDatabaseShardingStrategyConfig(courseDetailsShardingStrategyConfig); tableRuleConfig.setDatabaseShardingStrategyConfig(courseDetailsShardingStrategyConfig);
// 设置区域表使用雪花算法生成主键
KeyGeneratorConfiguration keyGeneratorConfig = new KeyGeneratorConfiguration("SNOWFLAKE", "id");
tableRuleConfig.setKeyGeneratorConfig(keyGeneratorConfig);
sets.add(tableRuleConfig); sets.add(tableRuleConfig);
} }
}else {
for (String centerTable : regionTables) {
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(centerTable,
String.format(centerTablesDataNode, centerTable));
sets.add(tableRuleConfig);
}
for (String centerTable : courseDetails) {
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(centerTable,
String.format(centerTablesDataNode, centerTable));
sets.add(tableRuleConfig);
}
}
return sets; return sets;
} }

View File

@ -0,0 +1,114 @@
package com.sqx.config;
/**
* 描述: Twitter的分布式自增ID雪花算法snowflake (Java版)
**/
public class SnowFlake {
/**
* 起始的时间戳
*/
private final static long START_STMP = 1480166465631L;
/**
* 每一部分占用的位数
*/
private final static long SEQUENCE_BIT = 12; //序列号占用的位数
private final static long MACHINE_BIT = 5; //机器标识占用的位数
private final static long DATACENTER_BIT = 5;//数据中心占用的位数
/**
* 每一部分的最大值
*/
private final static long MAX_DATACENTER_NUM = ~(-1L << DATACENTER_BIT);
private final static long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
/**
* 每一部分向左的位移
*/
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
/**
* 数据中心
*/
private long datacenterId;
/**
* 机器标识
*/
private long machineId;
/**
* 代表了一毫秒内生成的多个id的最新序号
*/
private long sequence = 10000L;
/**
* 上一次时间戳
*/
private long lastStmp = -1L;
public SnowFlake() {
}
public SnowFlake(long datacenterId, long machineId) {
if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
}
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
}
this.datacenterId = datacenterId;
this.machineId = machineId;
}
/**
* 产生下一个ID
*
* @param ifEvenNum 是否偶数 true 时间不连续全是偶数 时间连续 奇数偶数 false 时间不连续 奇偶都有 所以一般建议用false
*/
public synchronized long nextId(boolean ifEvenNum) {
long currStmp = getNewstmp();
if (currStmp < lastStmp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
}
/**
* 时间不连续出来全是偶数
*/
if (ifEvenNum) {
if (currStmp == lastStmp) {
//相同毫秒内序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE;
//同一毫秒的序列数已经达到最大
if (sequence == 0L) {
currStmp = getNextMill();
}
} else {
//不同毫秒内序列号置为0
sequence = 0L;
}
} else {
//相同毫秒内序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE;
}
lastStmp = currStmp;
return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
| datacenterId << DATACENTER_LEFT //数据中心部分
| machineId << MACHINE_LEFT //机器标识部分
| sequence; //序列号部分
}
private long getNextMill() {
long mill = getNewstmp();
while (mill <= lastStmp) {
mill = getNewstmp();
}
return mill;
}
private long getNewstmp() {
return System.currentTimeMillis();
}
}

View File

@ -0,0 +1,24 @@
package com.sqx.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SnowFlakeConfig {
/**
* 数据中心
*/
@Value("${snowflake.datacenterId}")
private String datacenterId;
/**
* 机器标识
*/
@Value("${snowflake.machineId}")
private String machineId;
@Bean(name = "snowFlake")
public SnowFlake snowFlake() {
return new SnowFlake(Long.parseLong(datacenterId), Long.parseLong(machineId));
}
}

View File

@ -1,11 +1,13 @@
package com.sqx.modules.app.controller.app; package com.sqx.modules.app.controller.app;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.pagehelper.PageHelper;
import com.sqx.common.utils.Result; import com.sqx.common.utils.Result;
import com.sqx.modules.announcement.entity.Announcement; import com.sqx.modules.announcement.entity.Announcement;
import com.sqx.modules.announcement.service.AnnouncementService; import com.sqx.modules.announcement.service.AnnouncementService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
@ -21,10 +23,11 @@ public class AppAnnouncementController {
@GetMapping @GetMapping
public Result get() { public Result get() {
List<Announcement> records = announcementService.page(new Page<>(1, 1), new LambdaQueryWrapper<Announcement>() PageHelper.startPage(1,1);
List<Announcement> list = announcementService.list(new LambdaQueryWrapper<Announcement>()
.eq(Announcement::getState, 1) .eq(Announcement::getState, 1)
.orderByDesc(Announcement::getCreateTime)).getRecords(); .orderByDesc(Announcement::getCreateTime));
return Result.success().put("data", records.isEmpty() ? null : records.get(0)); return Result.success().put("data", list.isEmpty() ? null : list.get(0));
} }
} }

View File

@ -2,10 +2,9 @@ package com.sqx.modules.app.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.entity.UserInfo; import com.sqx.modules.app.entity.UserInfo;
import com.sqx.modules.app.service.UserInfoService;
import com.sqx.modules.app.mapper.UserInfoMapper; import com.sqx.modules.app.mapper.UserInfoMapper;
import com.sqx.modules.app.service.UserInfoService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**

View File

@ -45,7 +45,7 @@ public class UserMoneyDetailsServiceImpl extends ServiceImpl<UserMoneyDetailsDao
queryWrapper.in("classify", arrayList); queryWrapper.in("classify", arrayList);
} }
queryWrapper.orderByDesc("create_time"); queryWrapper.orderByDesc("create_time");
return Result.success().put("data", PageUtils.page(new PageInfo<>(baseMapper.selectList(queryWrapper)))); return Result.success().put("data", PageUtils.page(new PageInfo<>(baseMapper.selectList(queryWrapper)),true));
} }
@Override @Override

View File

@ -2,7 +2,8 @@ package com.sqx.modules.discSpinning.controller;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sqx.common.annotation.Debounce; import com.sqx.common.annotation.Debounce;
import com.sqx.common.exception.CzgException; import com.sqx.common.exception.CzgException;
import com.sqx.common.utils.*; import com.sqx.common.utils.*;
@ -27,7 +28,9 @@ import springfox.documentation.annotations.ApiIgnore;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
@RestController @RestController
@ -126,8 +129,10 @@ public class DiscSpinningController {
}) })
@ApiOperation("查询大转盘") @ApiOperation("查询大转盘")
public Result selectDiscSpinning(@RequestParam(required = false, defaultValue = "1") Integer source) { public Result selectDiscSpinning(@RequestParam(required = false, defaultValue = "1") Integer source) {
return Result.success().put("data", discSpinningService.page(new Page<>(1, 20), PageHelper.startPage(1,20);
new QueryWrapper<DiscSpinning>().eq("disc_type", source).orderByAsc("disc_type", "odds"))); return Result.success().put("data", PageUtils.page(new PageInfo<>(discSpinningService.list(
new QueryWrapper<DiscSpinning>().eq("disc_type", source).orderByAsc("disc_type", "odds"))),true)
);
} }

View File

@ -1,12 +1,12 @@
package com.sqx.modules.invite.controller.app; package com.sqx.modules.invite.controller.app;
import cn.hutool.core.date.DateUtil;
import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig; import cn.hutool.extra.qrcode.QrConfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sqx.common.utils.PageUtils; import com.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result; import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login; import com.sqx.modules.app.annotation.Login;
@ -25,7 +25,6 @@ import com.sqx.modules.invite.service.InviteAwardService;
import com.sqx.modules.invite.service.InviteMoneyService; import com.sqx.modules.invite.service.InviteMoneyService;
import com.sqx.modules.invite.service.InviteService; import com.sqx.modules.invite.service.InviteService;
import com.sqx.modules.urlAddress.service.UrlAddressService; import com.sqx.modules.urlAddress.service.UrlAddressService;
import com.sqx.modules.userSign.entity.UserSignRecord;
import com.sqx.modules.utils.SenInfoCheckUtil; import com.sqx.modules.utils.SenInfoCheckUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -36,7 +35,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -170,7 +168,8 @@ public class AppInviteController {
@GetMapping("/selectInviteAwardList") @GetMapping("/selectInviteAwardList")
@ApiOperation("查询邀请奖励列表") @ApiOperation("查询邀请奖励列表")
public Result selectInviteAwardList(Integer page, Integer limit) { public Result selectInviteAwardList(Integer page, Integer limit) {
return Result.success().put("data", inviteAwardService.page(new Page<>(page, limit), new QueryWrapper<InviteAward>().orderByAsc("invite_count"))); PageHelper.startPage(page,limit);
return Result.success().put("data", PageUtils.page(new PageInfo<>(inviteAwardService.list(new QueryWrapper<InviteAward>().orderByAsc("invite_count"))),true));
} }
@Login @Login

View File

@ -3,8 +3,10 @@ package com.sqx.modules.taskCenter.controller;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sqx.common.annotation.Debounce; import com.sqx.common.annotation.Debounce;
import com.sqx.common.utils.PageUtils;
import com.sqx.common.utils.Result; import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login; import com.sqx.modules.app.annotation.Login;
import com.sqx.modules.taskCenter.entity.TaskCenter; import com.sqx.modules.taskCenter.entity.TaskCenter;
@ -13,7 +15,6 @@ import com.sqx.modules.taskCenter.entity.TaskCenterReward;
import com.sqx.modules.taskCenter.service.TaskCenterRecordService; import com.sqx.modules.taskCenter.service.TaskCenterRecordService;
import com.sqx.modules.taskCenter.service.TaskCenterRewardService; import com.sqx.modules.taskCenter.service.TaskCenterRewardService;
import com.sqx.modules.taskCenter.service.TaskCenterService; import com.sqx.modules.taskCenter.service.TaskCenterService;
import com.sqx.modules.userSign.entity.UserSignRecord;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
@ -74,7 +75,8 @@ public class TaskCenterController {
@GetMapping("/taskCenter/selectTaskCenter") @GetMapping("/taskCenter/selectTaskCenter")
@ApiOperation("查询任务中心") @ApiOperation("查询任务中心")
public Result selectTaskCenter(Integer page, Integer limit) { public Result selectTaskCenter(Integer page, Integer limit) {
return Result.success().put("data", taskCenterService.page(new Page<>(page, limit), new QueryWrapper<TaskCenter>().orderByAsc("sort", "type"))); PageHelper.startPage(page,limit);
return Result.success().put("data", PageUtils.page(new PageInfo<>(taskCenterService.list(new QueryWrapper<TaskCenter>().orderByAsc("sort", "type"))),true));
} }

View File

@ -1,5 +1,10 @@
package com.sqx.modules.utils; package com.sqx.modules.utils;
import com.sqx.common.utils.SpringContextUtils;
import com.sqx.config.SnowFlake;
import java.util.Objects;
/** /**
* 邀请码生成解密工具类 * 邀请码生成解密工具类
* *
@ -122,5 +127,8 @@ public class InvitationCodeUtil {
return res; return res;
} }
// public static String getSnowFlakeId() {
// return String.valueOf(((SnowFlake) Objects.requireNonNull(SpringContextUtils.getSpringBean(SnowFlake.class))).nextId(false));
// }
} }

View File

@ -12,7 +12,7 @@ minimum-idle: 5
# 最大连接数小于等于0会被重置为默认值10大于零小于1会被重置为minimum-idle的值 # 最大连接数小于等于0会被重置为默认值10大于零小于1会被重置为minimum-idle的值
maximum-pool-size: 15 maximum-pool-size: 15
# 空闲连接超时时间默认值60000010分钟大于等于max-lifetime且max-lifetime>0会被重置为0不等于0且小于10秒会被重置为10秒。 # 空闲连接超时时间默认值60000010分钟大于等于max-lifetime且max-lifetime>0会被重置为0不等于0且小于10秒会被重置为10秒。
idle-timeout: 30000 idle-timeout: 20000
# 连接最大存活时间.不等于0且小于30秒会被重置为默认值30分钟.设置应该比mysql设置的超时时间短 # 连接最大存活时间.不等于0且小于30秒会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
max-lifetime: 30000 max-lifetime: 30000
# 连接超时时间:毫秒小于250毫秒否则被重置为默认值30秒 # 连接超时时间:毫秒小于250毫秒否则被重置为默认值30秒
@ -22,13 +22,22 @@ spring:
# sharding-jdbc 配置 # sharding-jdbc 配置
shardingsphere: shardingsphere:
# 显示sharding-jdbc改写的sql语句 # 显示sharding-jdbc改写的sql语句
show-sql: false show-sql: true
center-tables-data-node: duanju.%s center-tables-data-node: duanju.%s
# 区域表的数据源节点
region-tables-data-node: duanju-$->{0..4}.%s
# 区域分库策略的计算字段
region-tables-sharding-database-column: user_id
# 分库的计算方法
region-tables-sharding-database-algorithm: duanju-$->{user_id % 5}
# 短剧集表 拆分
course_details-sharding-database-column: course_id
course_details-sharding-database-algorithm: duanju-$->{course_id % 5}
# 数据源名称 # 数据源名称
datasource: datasource:
# 数据源配置begin duanju:
master-0:
driver-class-name: ${driver-class-name} driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user username: video_user
@ -38,7 +47,59 @@ spring:
idle-timeout: ${idle-timeout} idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime} max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout} connection-timeout: ${connection-timeout}
slave-0: # 数据源配置begin
duanju-0:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju-0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
password: VideoUser@1
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-1:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
password: VideoUser@1
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-2:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju-2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
password: VideoUser@1
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-3:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju-3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
password: VideoUser@1
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-4:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc712o11yndj78x6a6o.mysql.cn-chengdu.rds.aliyuncs.com/duanju-4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
password: VideoUser@1
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-slave:
driver-class-name: ${driver-class-name} driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root username: root
@ -48,13 +109,88 @@ spring:
idle-timeout: ${idle-timeout} idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime} max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout} connection-timeout: ${connection-timeout}
duanju-slave-0:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju-0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root
password: 0fd6497c308ccfa8
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-slave-1:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju-1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root
password: 0fd6497c308ccfa8
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-slave-2:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju-2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root
password: 0fd6497c308ccfa8
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-slave-3:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju-3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root
password: 0fd6497c308ccfa8
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
duanju-slave-4:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://47.122.26.160:3306/duanju-4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: root
password: 0fd6497c308ccfa8
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
# 数据源配置end # 数据源配置end
# 读写分离配置begin # 读写分离配置begin
master-slave-rules: master-slave-rules:
#数据源 #数据源
duanju: duanju:
master-data-source-name: master-0 masterDataSourceName: duanju
slave-data-source-names: slave-0 slaveDataSourceNames:
# - master-0 # - duanju
# - slave-0 - duanju-slave
duanju-0:
masterDataSourceName: duanju-0
slaveDataSourceNames:
# - duanju-0
- duanju-slave-0
duanju-1:
masterDataSourceName: duanju-1
slaveDataSourceNames:
# - duanju-1
- duanju-slave-1
duanju-2:
masterDataSourceName: duanju-2
slaveDataSourceNames:
# - duanju-2
- duanju-slave-2
duanju-3:
masterDataSourceName: duanju-3
slaveDataSourceNames:
# - duanju-3
- duanju-slave-3
duanju-4:
masterDataSourceName: duanju-4
slaveDataSourceNames:
# - duanju-4
- duanju-slave-4

View File

@ -1,184 +0,0 @@
swagger:
enabled: false
pay:
h5BaseUrl: https://dj-h5.hnsiyao.cn/me/detail/detail?allId=
orderNotifyUrl: https://pay.hnsiyao.cn/czg/app/wuyou/notify
extractNotifyUrl: https://pay.hnsiyao.cn/czg/app/wuyou/extractNotify
# 数据源的一些配置
driver-class-name: com.mysql.cj.jdbc.Driver
# 最小空闲连接默认值10小于0或大于maximum-pool-size都会重置为maximum-pool-size
minimum-idle: 5
# 最大连接数小于等于0会被重置为默认值10大于零小于1会被重置为minimum-idle的值
maximum-pool-size: 15
# 空闲连接超时时间默认值60000010分钟大于等于max-lifetime且max-lifetime>0会被重置为0不等于0且小于10秒会被重置为10秒。
idle-timeout: 30000
# 连接最大存活时间.不等于0且小于30秒会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
max-lifetime: 30000
# 连接超时时间:毫秒小于250毫秒否则被重置为默认值30秒
connection-timeout: 30000
spring:
# sharding-jdbc 配置
shardingsphere:
center-tables-data-node: duanju.%s
# 区域表的数据源节点
region-tables-data-node: duanju-$->{0..4}.%s
# 区域分库策略的计算字段
region-tables-sharding-database-column: user_id
# 分库的计算方法
region-tables-sharding-database-algorithm: duanju-$->{Math.abs(user_id) % 5}
# 短剧集表 拆分
course_details-sharding-database-column: course_id
course_details-sharding-database-algorithm: duanju-$->{Math.abs(course_id) % 5}
# 显示sharding-jdbc改写的sql语句
show-sql: false
# 数据源名称
datasource:
master:
driver-class-name: ${driver-class-name}
jdbc-url: jdbc:mysql://rm-gc7xx913734hv5w5q.mysql.cn-chengdu.rds.aliyuncs.com/duanju?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
username: video_user
password: VideoUser@1
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
# 数据源配置begin
master-0:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
master-1:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
master-2:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
master-3:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
master-4:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave-0:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave-1:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave-2:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave-3:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
slave-4:
driver-class-name: ${driver-class-name}
jdbc-url:
username:
password:
minimum-idle: ${minimum-idle}
maximum-pool-size: ${maximum-pool-size}
idle-timeout: ${idle-timeout}
max-lifetime: ${max-lifetime}
connection-timeout: ${connection-timeout}
# 数据源配置end
# 读写分离配置begin
master-slave-rules:
#数据源
duanju:
master-data-source-name: master
slave-data-source-names: slave
duanju-0:
master-data-source-name: master-0
slave-data-source-names: slave-0
duanju-1:
master-data-source-name: master-1
slave-data-source-names: slave-1
duanju-2:
master-data-source-name: master-2
slave-data-source-names: slave-2
duanju-3:
master-data-source-name: master-3
slave-data-source-names: slave-3
duanju-4:
master-data-source-name: master-4
slave-data-source-names: slave-4

View File

@ -12,7 +12,7 @@ minimum-idle: 5
# 最大连接数小于等于0会被重置为默认值10大于零小于1会被重置为minimum-idle的值 # 最大连接数小于等于0会被重置为默认值10大于零小于1会被重置为minimum-idle的值
maximum-pool-size: 15 maximum-pool-size: 15
# 空闲连接超时时间默认值60000010分钟大于等于max-lifetime且max-lifetime>0会被重置为0不等于0且小于10秒会被重置为10秒。 # 空闲连接超时时间默认值60000010分钟大于等于max-lifetime且max-lifetime>0会被重置为0不等于0且小于10秒会被重置为10秒。
idle-timeout: 30000 idle-timeout: 20000
# 连接最大存活时间.不等于0且小于30秒会被重置为默认值30分钟.设置应该比mysql设置的超时时间短 # 连接最大存活时间.不等于0且小于30秒会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
max-lifetime: 30000 max-lifetime: 30000
# 连接超时时间:毫秒小于250毫秒否则被重置为默认值30秒 # 连接超时时间:毫秒小于250毫秒否则被重置为默认值30秒

View File

@ -19,25 +19,33 @@ management:
db: db:
enabled: false #关闭数据库健康检查isV enabled: false #关闭数据库健康检查isV
#mybatis #mybatis
mybatis-plus: pagehelper:
mapper-locations: classpath*:/mapper/**/*.xml offsetAsPageNum: true
#实体扫描多个package用逗号或者分号分隔 rowBoundsWithCount: true
typeAliasesPackage: com.sqx.modules.*.entity helperDialect: mysql
global-config: reasonable: true
#数据库相关配置 supportMethodsArguments: true
db-config: params:
#主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; count: countSql
id-type: AUTO #mybatis-plus:
logic-delete-value: -1 # mapper-locations: classpath*:/mapper/**/*.xml
logic-not-delete-value: 0 # #实体扫描多个package用逗号或者分号分隔
banner: false # typeAliasesPackage: com.sqx.modules.*.entity
#原生配置 # global-config:
configuration: # #数据库相关配置
map-underscore-to-camel-case: true # db-config:
cache-enabled: false # #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
call-setters-on-nulls: true # id-type: AUTO
jdbc-type-for-null: 'null' # logic-delete-value: -1
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # logic-not-delete-value: 0
# banner: false
# #原生配置
# configuration:
# map-underscore-to-camel-case: true
# cache-enabled: false
# call-setters-on-nulls: true
# jdbc-type-for-null: 'null'
## log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
sqx: sqx:
redis: redis:
@ -59,13 +67,18 @@ limit:
urlRate: 10 # 同一用户单url每秒限制次数 urlRate: 10 # 同一用户单url每秒限制次数
ipJumpLimit: 4 # 同一ip每分钟跳动次数 ipJumpLimit: 4 # 同一ip每分钟跳动次数
# 指定sharding-jdbc雪花算法的工作机器ID
snowflake:
datacenterId: 1
machineId: 3
spring: spring:
main: main:
allow-circular-references: true allow-circular-references: true
allow-bean-definition-overriding: true allow-bean-definition-overriding: true
# 环境 dev|test|prod # 环境 dev|test|prod
profiles: profiles:
active: prod active: dev
# jackson时间格式化 # jackson时间格式化
jackson: jackson:
time-zone: GMT+8 time-zone: GMT+8
@ -93,6 +106,9 @@ spring:
# pathmatch: # pathmatch:
# matching-strategy: ant_path_matcher # matching-strategy: ant_path_matcher
shardingsphere: shardingsphere:
#广播表
broadcast-tables:
- course
# 短剧集表 通过course_id 分 # 短剧集表 通过course_id 分
course-details: course-details:
- course_details - course_details
@ -111,15 +127,17 @@ spring:
- user_sign_record - user_sign_record
- invite_achievement - invite_achievement
- invite_money - invite_money
- user_info
- sys_user
#中心表 #中心表
center-tables: center-tables:
- message_info - message_info
- announcement
- schedule_job_log - schedule_job_log
- invite - invite
- msg - msg
- sys_role_menu - sys_role_menu
- sdk_info - sdk_info
- course
- user_integral_details - user_integral_details
- common_info - common_info
- sys_log - sys_log
@ -128,7 +146,6 @@ spring:
- sys_user_role - sys_user_role
- sys_menu - sys_menu
- comment_good - comment_good
- sys_user
- course_comment - course_comment
- banner - banner
- disc_spinning - disc_spinning

View File

@ -5,28 +5,23 @@
<select id="selectCourseByCollect" resultType="com.sqx.modules.course.entity.Course"> <select id="selectCourseByCollect" resultType="com.sqx.modules.course.entity.Course">
SELECT SELECT MAX(u.update_time) AS produceEndTime,
MAX(u.update_time) AS produceEndTime,
c.*, c.*,
d.course_details_name AS courseDetailsName, d.course_details_name AS courseDetailsName,
d.course_details_id AS courseDetailsId, d.course_details_id AS courseDetailsId,
COUNT(d.course_details_id) AS courseDetailsCount COUNT(d.course_details_id) AS courseDetailsCount
FROM FROM course_collect u
course_collect u
LEFT JOIN LEFT JOIN
course c ON u.course_id = c.course_id course c ON u.course_id = c.course_id
LEFT JOIN LEFT JOIN
course_details d ON u.course_details_id = d.course_details_id course_details d ON u.course_details_id = d.course_details_id
LEFT JOIN LEFT JOIN
course_collect cc ON u.course_id = cc.course_id AND cc.user_id = #{userId} AND cc.classify = 3 course_collect cc ON u.course_id = cc.course_id AND cc.user_id = #{userId} AND cc.classify = 3
WHERE WHERE u.user_id = #{userId}
u.user_id = #{userId}
AND u.classify = #{classify} AND u.classify = #{classify}
AND c.course_id IS NOT NULL AND c.course_id IS NOT NULL
GROUP BY GROUP BY u.course_id, c.course_id, d.course_details_name, d.course_details_id
u.course_id, c.course_id, d.course_details_name, d.course_details_id ORDER BY produceEndTime DESC
ORDER BY
produceEndTime DESC;
</select> </select>
</mapper> </mapper>