# play-week **Repository Path**: pious68/play-week ## Basic Information - **Project Name**: play-week - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-07 - **Last Updated**: 2024-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 1.启动问题 ``` 0.项目的日志打印逻辑 我们编写的log.info/log.warn都会对应一个olda-play-auth-warn-latest.log/olda-play-auth-info-latest.log的日志文件,默认打印到日志文件中而不是控制台。 可以把重要日志打印到error日志中直接查看也可以。 1.nacos中配置正确但是数据库连接不上: ShardingSphere的数据库连接配置是写死在代码中的,DataSourceUtil中修改数据库连接信息,applet和system中都有DataSourceUtil都需要修改。遇到nacos中配置正确但是一致报错连接失败问题,不要思维定势只看配置文件,很多业务代码中写死的也需要再深入研究看看。 spring.cloud.nacos.config.namespace=c4a0b9b2-95b4-4948-8bec-3656d7d606f9 spring.cloud.nacos.discovery.namespace=c4a0b9b2-95b4-4948-8bec-3656d7d606f9 这两个缺一不可!!!否则无法在指定的namespace中发现 2.微信小程序代码调试基础库3.1.5及其以下都没问题,之前的版本也没问题,编译版本选择2.x的也可以,最新的可能会出问题,每次打开微信开发者工具的时候都需要设置基础库版本,否则默认使用最新版本 3. 4.redisson的疑难杂症连接问题去Github上搜索: 服务器Redis用的7.2.4 + 更新pom中redisson版本为3.27.1 + stone-redis中RedissonConfig设置setPingConnectionInterval(1000)和setConnectionMinimumIdleSize(30) ===> MyRedissonLock搭配redisson版本3.13.1没问题,可以抽空研究这个代码,项目中没有使用,可以屏蔽此处代码,然后更新redisson版本为3.27.1,这样既可以解决redisson连接报错的问题,也可以代码不报错 5.真机调试需修改访问ip为192.168.3.6,用localhost和127.0.0.1都会导致真机调试出现Network Error.即修改前端项目setting.js中的baseURL. 在做真机调试的时候更改个人信息的时候注意,个人信息页面下面有个保存按钮!还有个bug:记得最后修改个人简介,否则会导致前面的数据没保存! 6.nacos配置文件中配置数据库连接 7.nacos中lb负载均衡失效的原因/nacos+gateway出现503: 微服务下的每个bootstrap.properties中的namespace都设置为同一个命名空间的id,否则将会导致lb负载均衡失效,会报错503服务不可用。 8.微信服务号无论企业还是个人均需要300元认证费用,不推荐使用 9.配置七牛云对象存储加速域名 项目中使用的oss使用的是1725337761@qq.com这个号(还有一个489866640@qq.com),密码都是JLN520,.@ 按照七牛云步骤操作即可: 1.添加自定义的加速域名(随便起名) 2.验证域名属于自己,域名根目录上次文件/配置解析记录txt以及对应值均可 3.验证之后七牛云生成一个域名,我们将我们第一步自定义域名的解析记录CNAME+七牛云生成的域名即可 10.微信支付 微信支付后发现活动报名人数没有增加,没有增加内网穿透,并设置内网穿透的端口号为网关的端口号,同时检查2个mq服务是否注册到配置中心了,以及mq中微信支付通知地址和applet中是否都正确 统一下单参数和请求都正确但是总是提示签名错误: 断点调试发现商户被限制收款了。 return_msg -> 此商家的收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案。 11.cpu使用率飙高 top ps aux | grep [进程名] 报告当前系统的进程状态的命令 发现是我124.222.68.54服务器上使用docker安装的rocketmq导致cpu达到了400%,而且出现很多次了,不知道什么原因. 12.日志打印问题 打印日志过多,尤其是nacos的日志过多: 1.通过在nacos的日志配置文件中修改打印级别影响的是nacos自身的logs文件夹下的日志大小 2.在nacos配置中设置logging.level参数报错导致程序无法启动 3.修改项目根目录下的log4j2-dev.xml中的打印级别即可 大无语事件:SystemPlayApplication的日志级别设置为warn仍然打印红色日志感觉应该是多个日志依赖冲突了,项目使用的是log4j2-dev.xml,然后把依赖放到所有依赖的最上面就好了! org.springframework.boot spring-boot-starter-log4j2 13.讲师服务器地址: 120.26.121.237:19100/nacos http://week-dev.hzsyoudong.com/login 如果一直报错,可能是队列没有创建,则手动创建。 RabbitMQ: http://49.234.75.101:19000/ admin admin 14.添加新用户 新增加用户需要获取openid:新用户直接登录的时候会调用/weixinLogin接口,然后看打印日志找到open_id然后插入数据库中,和手机号对应就能登录了,后续实现自动注册登录功能。 15.applt启动rabbitmq报错: 修改rabbitmq的用户名密码为pious和123456,用guest报错 mq模块用户名和密码: spring: rabbitmq: host: localhost port: 5672 username: pious password: 123456 virtual-host: play-week connection-timeout: 20000 其他项目用guest没问题,这里为什么用guest报错? 16.分库分表配置断点调试/新增活动断点调试: 16个月份(22年11月到24年2月) * 4个活动activity_00/01/02/03 + bac_activity_00/01/02/03 = 68 ``` ### 2.存在问题 ``` 1.暂时屏蔽钉钉消息与微信模板消息 2.圈子代码多处错误,后续可尝试抽空优化解决问题代码进行服务的部署和上线。 3.现在的分库分表还有个问题就是我们需要手动添加分的库以及分的表,如果新增城市还需要在分库分表配置表中做配置,考虑后续专门组件去做这件事,不需要手动sql了 4.com.olda.play.exception.WechatLoginException: invalid code, rid: 65ec418b-3bdebf35-5071cb7f { "code": "40029", "msg": "invalid code, rid: 65ec8e29-62543331-0e6797fb", "data": null } 5.项目中并没有将活动数据整合到es中 http://localhost:9200/_cluster/health/ 6.TODO 实名认证在dev开发环境下不生效,已经注释掉了,后续可以开发测试 AppletUserBizService ``` ### 3.项目亮点 ``` 1.Spring的SPI机制@EnableAutoConfiguration、spring.factories 2.redisson分布式锁应用: 高并发环境下活动报名超量/超卖问题思考:redisson分布式锁解决 新增活动:策略模式,不同的支付方式不同的策略,如果隶属于某个圈子,则加分布式锁更新圈子活动数量:选型:lock/tryLock 用户加入圈子加分布式锁更新圈子人数 转让圈子加分布式锁 策略模式:抽象策略Stragety + 环境Context + 具体策略Concrete Strategy,算法的实现和算法的责任剥离 活动创建流程: * 1、校验名称是否重复 * 2、保存活动信息 * 3、新增活动问题信息 * 4、插入一条活动用户信息 * 5、更新圈子活动数量 * 6、发布圈子新活动 * 7、通知管理员有新活动创建成功 多渠道消息通知模板方法 * 模板方法 * 1、更新消息发送任务状态为待发送、执行中、发送失败、发送成功、接收成功 * 2、查询接收人用户信息--------构建发送参数 * 3、拼装不同的消息内容--------构建发送参数 * 4、执行消息发送(钩子方法)----仅跟渠道有关系了 * 5、更新任务状态为完成 模板模式抽离公共代码,结合工厂模式实现动静分离,实现多设计模式+泛型的消息通知引擎 3.报名活动核心逻辑: 1.校验是否报过名、人数限制、开始时间 2.插入活动成员信息状态valid为0、保存用户答案数据 3.如果是现场支付/无需支付直接 更新活动人数 + 更新活动成员valid为1 + 消息通知 4.如果是在线支付的话,保存活动成员+答案数据,然后返回前端发起生成订单请求,调用后端接口下单写入订单表+调用微信统一下单接口(传递的参数中需要进行签名,根据传递的参数生成一个签名值)生成预支付ID,然后再次签名将签名数据+预支付ID等信息返回前端,调用JSAPI支付后,通过我们自定义的异步通知接口接收微信支付服务器传递过来的参数,将其发送到mq中,然后payConsume监听消息做消费,包括幂等性校验+微信支付私钥验签,最后更新订单状态: 幂等性问题:如何确保消息可以被成功的消费,且消息正常从队列中移除 也就是如何确保消息可以被成功的消费,且消息正常同队列中移除? 微信支付步骤: 1、创建订单 2、用户在小程序完成支付 3、接收异步通知 4、掉单处理:微信异步支付通知接收服务器运行不正常或者挂掉了,导致我们没有及时收到或者处理成功支付通知消息,导致业务无法正常进行===> 2种方案: ①、小程序服务部署集群化部署(下单服务和异步接收微信支付通知服务是一个服务的话) ②、使用消息队列:独立消息接收服务,接收到微信推送过来的支付消息后立即推送至消息队列服务,且打印日志到日志文件中(备份),消费者服务负责消息的消费,通过调用统一订单查询接口去进行”补单”; 统一下单: 除付款码支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按Native、JSAPI、APP等不同场景生成交易串调起支付。 一定要做避免重复消费处理?如何避免重复消费保证幂等性? 下单的时候在拿到预支付交易会话标识的时候要进行二次签名操作 核心异步通知流程 1、微信服务调用异步通知api:/pay/wxRechargeDeposit 2、服务端:解析支付通知并判断当前支付通知是否已被处理 3、服务端:验签并进行后续业务处理逻辑:更新订单状态/入库join记录/支付结果钉钉/ 定时任务扫表 1.补偿机制: 我们配置的微信支付异步通知接口为olda-play-mq消息队列服务(生产者),因此微信支付异步消息通知成功投递到mq中,然后经由olda-play-applet-service的consumer/PayConsumer监听指定队列消息进行处理支付通知逻辑,根据订单号out_trade_no 去数据库中查询对应的数据,进行幂等校验,签名验签,更改订单状态微信支付订单号+更改报名人数+修改成员表valid为1 2.用mq解决掉单,如果mq挂掉了呢?定时任务扫表-->一般报警机制 + 定时任务扫表 4.地理位置查询:es通过左上角、右下角的点确定矩形 stone-es:文档相关crud测试方法(基于矩形范围查询+基于距离查询) + 索引相关crud测试方法 + spring.factories 具体es的复杂查询再olda-play-applet-service的test目录下: 支付相关测试/es相关测试 9-7、简单整合Elasticearch实现多条件活动列表查询 使用ES去实现基于路径、范围的活动搜索 es-stone封装index/doc的工具类,然后在applet-service的test/dsl和es目录下测试文档和索引相关的CRUD操作 实现了基于路径算法的附近活动查询 5.redis存储活动模板数据 /dynamicTemplate week:dynamic:template 算法的实现和算法的责任剥离 6.数据导出easy Excel @EqualsAndHashCode(callSuper = true) 继承父类的子类,如果callSuper = true,则表示继承的属性也要一致才能返回true 7.基于城市+时间的分库分表: shardingConfig中写死一个库存在2个城市的表数据 【分库规则】 基于城市编码,不同的城市的活动数据会指向到我们配置的数据库中 1、杭州市发起的活动会被存储在ds0库中 2、苏州市发起的活动会被存储在ds1库中 【分表规则】 基于城市编码,不同的城市的活动数据会指向到我们配置的数据库中后 比如如下配置(sharding-algorithm_db_table) 1、杭州市发起的活动会被存储在ds0库中,活动表全部以bas_activity_00开头 2、苏州市发起的活动会被存储在ds1库中,活动表全部以bas_activity_02开头 且在项目中实现了基于月份的复杂分库分表逻辑 分布式系统之间的通讯方式: 1、同步远程RPC调用:dubbo/feign 2、异步基于mq消息通信 无论是否开启web管理端,都需要启动system微服务,否则微信小程序报错此连接不是安全连接 5、杜绝使用select count(*) select count(*) from table;这样不带任何条件的count会引起全表扫描 9-2、问题思考干百万级数据量的查询还走mysql吗 where子句中对于null的判断会导致引擎放弃使用索引而进行全表扫描。 ==>字符串类型尽量设置默认值不要有null值 -->尽量避免在where子句中对字段进行表达式操作 慢sql优化:要尽量避免全表扫描,首先应考虑在 where 及 orderby涉及的列上建立索引 -对字段进行算术运算,会导致索引失效 ==> where id * 1 = 110 索引并不是越多越好,索引虽然可以提高相应的 select 的效率,但同时也降低了insert 及update 的效率, 避免隐式类型转换:where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,所以建议先确定 where中的参数类型,传入正常的查询参数类型。 分片策略 = 分片键 + 分片算法 join.vue的submit()下的Ajax.postJoinActive(data)报名活动joinDynamic,然后调用this.payFee()执行Ajax.postCreateOrder(data)访问pay/generateWeChatOrder接口拿到发起JSAPI支付所需要的对象(这里涉及二次前面,下单需要签名1次拿到预支付ID,这次拿到预支付ID和其他参数再一起生成签名)返回给小程序,小程序发起支付,跳转支付成功与否joinResult页面,具体的微信支付结果通过异步通知mq的方式做更新数据库。 微信登录流程: 1.小程序端调用wxlogin()获取临时登录凭证code 2.调用小程序服务端登录接口(/olda-play-auth/oauth/token) 3.服务端拿code调用auth.cbde2Session接口: 换取用户唯一标识openId、用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号)和会话密钥session_key 4.处理系统用户体系和微信用户体系绑定关系 appid是小程序的唯一标识,openId则是用户之当前小程序的唯一标识. unioinID是用户在开放平台的唯一标识符,用于企业去识别用户在我司的多个微信平台拥有账号用的。 ``` ### 4.Security ``` POST http://localhost:8085/olda-play-auth/oauth/token @EnableAuthorizationServer AuthorizationServerEndpointsConfiguration.class TokenEndpoint @RequestMapping(value = "/oauth/token", method=RequestMethod.POST) 一般来说我们不用Apifox发送请求配置basicAtuh,而是把加密后的在Header中配置Authorization,即获取登录认证的客户端ID * 兼容两种方式获取OAuth2客户端信息(client_id、client_secret) * 方式一:client_id、client_secret放在请求路径中 * 方式二:放在请求头(Request Headers)中的Authorization字段,且经过加密,例如 Basic Y2xpZW50OnNlY3JldA== 明文等于 client:secret 组合模式/适配器模式 http://127.0.0.1:8085/olda-play-system-service/role/query5ysRoleList 携带Authorization:配置token即可访问 刷新token: htp://127.0.0.1:8085/olda-play-auth/oauth/token grant_type refresh_token refresh_token 具体的token值 tokenEndpoint.postAccessToken OAuth2AccessToken token = getTokenGranter().grant(tokenRequest.getGrantType(), tokenRequest); 2种类型的tokenGranters:自定义的WechatTokenGranter + 系统的5个TokenGranter 调用用户登录管理系统接口,返回的deptId、username、userId是我们增强的内容,即使用我们自定义的增强token 根据grant——type匹配授权方式password后生成创建token访问令牌,密码方式的令牌授予方先认证,即先委托身份认证管理器去进行身份认证, 微信登录身份认证: 1.自定义token 2.自定义granter 3.自定义provider 4.添加微信授权模式到oauth2 5.添加微信身份认证管理到认证管理器 ``` ### 5.Starter ```` org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.olda.stone.utils.QiNiuUtils org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.olda.stone.utils.WeekEsIndexUtils,\ com.olda.stone.utils.WeekEsDocumentUtils,\ com.olda.stone.config.ElasticsearchConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.olda.stone.utils.RedisUtil,\ com.olda.stone.config.RedisConfig,\ com.olda.stone.config.RedissonConfig org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.olda.stone.utils.WechatNoticeUtils ```` ### 6.ShardingJdbc读写分离+主从复制 ``` ShardingJdbc读写分离+主从复制:一主三从 服务器ip:120.48.63.226 测试垂直分库的时候: 去slave1、slave2、slave3中分别关闭主从复制! stop slave; 关闭主从同步之后3个节点变成同级节点. docker pull mysql:5.7.31 docker run --name mysqlmaster1 -v /root/docker/database/mysqlmaster/data:/var/lib/mysql -v /root/docker/database/mysqlmaster/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d -p 16000:3306 mysql:5.7.31 docker run --name mysqlslave1 -v /root/docker/database/mysqlslave1/data:/var/lib/mysql -v /root/docker/database/mysqlslave1/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d -p 16001:3306 mysql:5.7.31 docker run --name mysqlslave2 -v /root/docker/database/mysqlslave2/data:/var/lib/mysql -v /root/docker/database/mysqlslave2/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d -p 16002:3306 mysql:5.7.31 docker run --name mysqlslave3 -v /root/docker/database/mysqlslave3/data:/var/lib/mysql -v /root/docker/database/mysqlslave3/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d -p 16003:3306 mysql:5.7.31 上面这么创建会有问题,我们想要创建my.cnf配置文件结果最终会创建出来个文件夹,我们手动改一下重新启动容器即可。 主节点配置文件: [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql !includedir /etc/mysql/conf.d/ character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' server-id=1 log-bin=mysql-bin binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog_format=STATEMENT 主节点执行: docker exec -it mysqlmaster1 /bin/bash mysql -u root -p123456 grant replication slave on *.* to 'slave'@'%' identified by '123123'; show master status; flush privileges; docker restart mysqlmaster1 docker exec -it mysqlmaster1 /bin/bash mysql -u root -p 123456 show master status; 从节点1配置: [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql !includedir /etc/mysql/conf.d/ character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' server-id=2 relay-log=mysql-relay 从节点2配置: [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql !includedir /etc/mysql/conf.d/ character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' server-id=3 relay-log=mysql-relay 从节点3配置: [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql !includedir /etc/mysql/conf.d/ character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' server-id=4 relay-log=mysql-relay docker restart mysqlslave1; docker restart mysqlslave2; docker restart mysqlslave3; 3个从节点中分别执行命令; docker exec -it mysqlslave1 /bin/bash; mysql -u root -p123456 # 复制主机的命令 change master to master_host='120.48.63.226',master_port=16000,master_user='slave',master_password='123123',master_log_file='mysql-bin.000001',master_log_pos=590; start slave; show slave status\G; navicat连接4个库: 测试: create database test; use test; CREATE TABLE `t_teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `number` int(6) NULL DEFAULT NULL COMMENT '教师数量', `att1` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '学校名称', `att2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `att3` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `att4` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `at5` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `create_time` datetime(0) NULL DEFAULT NULL, `creater` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `modifer_time` datetime(0) NULL DEFAULT NULL, `modifer` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 135 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '测试读写分离表' ROW_FORMAT = Dynamic; 3个slave:关闭主从复制读写分离,每个从库执行stop slaves; 测试垂直分库: docker exec -it mysqlslave1 /bin/bash; mysql -uroot -p123456 stop slave; 测试垂直分库:修改数据源配置: ds0库创建sys_user,ds1库创建t_order 我们的目标:对sys_user操作都走ds0库,对t_order操作都走ds1库 测试水平分库?为什么不行 测试分库分表: 3个库分别建2表 根据动态类型分库,根据是否精选完成分片策略 ``` ### 7.SQL语句 ``` Table 'ds0.bas_activity_00_202401' doesn't exist 数据库表不是自动创建的,既然数据是按照年月划分的,那么就先创建对应月份的数据表!!! CREATE TABLE `bas_activity_01_202310` ( `id` bigint(19) NOT NULL AUTO_INCREMENT COMMENT '活动主键', `user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '小程序用户唯一id', `posters_list` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '海报列表(多张海报用,隔开)', `activity_theme` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动主题', `activity_address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动地址(待定-因为要选择地图上的地址,实际开发确认下)', `district` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '区', `start_time` datetime NULL DEFAULT NULL COMMENT '活动开始时间', `end_time` datetime NULL DEFAULT NULL COMMENT '活动结束时间', `is_pay_end` tinyint(1) NULL DEFAULT 0 COMMENT '支付类型的活动结束标志 支付类型的 0-默认 1-待结算 2-结算完成', `cost_type` tinyint(2) NOT NULL COMMENT '0、免费 1、在线支付 2、现场支付', `activity_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '活动单人应支付金额(type为0的时候值为0.00)', `contact` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动负责人联系方式', `primary_classification` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动一级分类', `secondary_classification` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动二级分类', `activity_content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动内容', `activity_content_picture` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '活动内容附带图片列表(多张用,隔开)', `already_join` int(6) NULL DEFAULT 0 COMMENT '活动已经报名人数', `expect_number` int(6) NOT NULL COMMENT '活动期望报名人数', `registration_deadline` datetime NULL DEFAULT NULL COMMENT '活动报名截止时间', `registration_req_questions` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动报名所需问题(多个问题需要用,隔开)', `whether_public` tinyint(1) NULL DEFAULT NULL COMMENT '1、公开 0、不公开', `is_hot` tinyint(1) NULL DEFAULT 0 COMMENT '0 不热门 1-热门', `primary_id` int(10) NOT NULL COMMENT '活动一级分类id', `secondary_id` int(10) NOT NULL COMMENT '活动二级分类id', `latitude` double(20, 10) NULL DEFAULT NULL COMMENT '维度', `longitude` double(20, 10) NULL DEFAULT NULL COMMENT '经度', `city_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '城市编码', `activity_city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动所在城市', `er_code_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '群二维码', `circle_id` bigint(20) NULL DEFAULT 0 COMMENT '圈子id', `circle_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '圈子名称', `platform` int(2) NULL DEFAULT 0 COMMENT '平台', `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标识:0-未删除;1-已删除', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人工号', `create_time` datetime NOT NULL COMMENT '创建时间', `create_user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人昵称', `modify_time` datetime NULL DEFAULT NULL COMMENT '更新时间', `modify_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人工号', `modify_user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人昵称', `activity_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动编号', PRIMARY KEY (`id`) USING BTREE, INDEX `index_activity_theme`(`activity_theme`) USING BTREE, INDEX `index_start_time`(`start_time`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '小程序活动表' ROW_FORMAT = DYNAMIC; ``` ### 8.原生jenkins ``` olda-play-auth-1.0-SNAPSHOT.jar olda-play-gateway-1.0-SNAPSHOT.jar olda-play-system-service-1.0-SNAPSHOT.jar cat system-start.sh #! /bin/sh echo 'start test' source /etc/profile port=8083 # 根据端口号查询对应的pid pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{print $1}'); # 杀掉对应的进程,如果pid不存在则不执行 if [ -n "$pid" ]; then kill -9 $pid; fi echo "pid=$pid" cd /root/olda/week/service/test pwd nohup java -jar olda-play-system-service-1.0-SNAPSHOT.jar --spring.profiles.active=test --server.port=8083 --logging.file=./log/system.log > /dev/null 2>&1 & echo 'end test' —————————————————————————————————————————————————— 查询服务状态: lsof -i tcp:8083 sh system-start.sh lsof -i tcp:8083 ----------------------------------------------------- 1.安装maven配置环境变量 vim /etc/source export MAVEN_HOME=/root/apache-maven-3.5.4 export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin 2.git yum install -y git which -a git/which git ==> /usr/bin/git 3.jenkins https://get.jenkins.io/war-stable/ 直接下载最新版本(需要找到对应的jdk版本),经过测试发现老版本很多bug包括插件不支持等等 jenkins启动脚本: java -jar jenkins.war --httpPort=8088 运行jar命令后更改.jeknis目录下的xml中的镜像地址: 或者将hudson.model.UpdateCenter.xml的地址改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,测试改为http没有用 看控制台打印密码的位置:/root/.jenkins/secrets http://124.222.68.54:8088/restart直接跳过安装插件 ```