renren-fast 开源项目常用代码积累
- 采用的 MyBatis-Plus,Service层的对象 具有 批量插入、全字段插入 等方法
// 注意,批量操作时,必须设定 ID为用户输入,不然 会传入空值,造成出错
@TableId(type = IdType.INPUT)
后来发现,在 spring-boot 的配置文件中,也有整个项目的配置信息,不过没有测试过:
在 src/main/resource/application.yml 文件中,可以找到如下内容:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
- 查询列表
List<ESCExamquesaskEntity> list = escExamquesaskService.selectList(
Condition.create()
.setSqlSelect("*")
.eq("ExamStudentID", examStudentID)
);
- 2个对象属性快速复制
BeanUtils.copyProperties(escSE, se);
- Logger 日志记录
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Logger logger = LoggerFactory.getLogger(getClass());
logger.error("redis error", e);
- 跨域设置位置
config/ CorsConfig.java
项目地址:
https://gitee.com/renrenio/renren-fast-vue
Element-UI
http://element-cn.eleme.io/#/zh-CN/component/message-box
打包
npm run build sudo cnpm install -g gulp
前期知识准备:
JavaScript: (基础)JSON, 对象,和数组,【深:面向对象】
vue 基本知识
vue-cli
element-ui: 基本控件使用
导入模块
import AddOrUpdate from './user-add-or-update'
注意路径。
Mock模拟数据配置
模拟数据接口文档地址:
创建调用接口是不断变化的时间数据接口, 在 mock/index.js 中编写
// 返回压裂监测工程曲线数据 Mock.mock(new RegExp('/dss/data/get-monitor-data'), 'get', (opts) => { opts['data'] = opts.body ? JSON.parse(opts.body) : null delete opts.body var data = []; for (let i = 0; i < 4; i++) { data.push(({ 'name': 'name' + (i+1), 'value': Mock.Random.integer(60,100), 'time': new Date().getTime() })); } var res = { "msg": "success", "code": 0, "data": data }; return res; })
mock/index.js, 第2个参数代表功能状态, true 代表使用模拟数据,false 代表不使用模拟数据
全部替换后,即可访问模拟数据啦
// tips // 1. 开启/关闭[业务模块]拦截, 通过调用fnCreate方法[isOpen参数]设置. // 2. 开启/关闭[业务模块中某个请求]拦截, 通过函数返回对象中的[isOpen属性]设置. fnCreate(common, true) fnCreate(jobSchedule, true) fnCreate(oss, true) fnCreate(sysConfig, true) fnCreate(sysLog, true) fnCreate(sysMenu, true) fnCreate(sysRole, true) fnCreate(sysUser, true)
地址信息在modules 中,例如: mock/modules/sys-user.js
查看文件中 url 即可获得请求数据的模拟地址。
url: '/sys/user/list',
系统中的配置:系统为什么会匹配到模拟数据,是因为在 入口js 文件中,有判断是否是生成环境
/src/main.js
// 非生产环境, 适配mockjs模拟数据 // api: https://github.com/nuysoft/Mock if (process.env.NODE_ENV !== 'production') { require('@/mock') }
发布版下采用模拟数据
src/main.js 配置,不管什么模式都调用模拟数据接口
// 非生产环境, 适配mockjs模拟数据 // api: https://github.com/nuysoft/Mock // if (process.env.NODE_ENV !== 'production') { // require('@/mock') // } // 不管是开发版本还是发布版本,都使用模拟数据 require('@/mock')
staic/init.js 配置,打包使用外部库
L12 行 js: [ // 插件 - mockjs window.SITE_CONFIG.cdnUrl + '/static/plugins/mock-1.0.0-beta3/mock-min.js',
打包后,可使用 http-server 搭建本地服务器,测试发布版的效果
http-server, hs
去除不必要插件
build\webpack.base.conf.js externals: { mockjs: 'Mock', // echarts: 'echarts', // ueditor: 'UE' }
超时时间设置
this.$http({ url: this.$http.adornUrl('/ges/examstudent/synclist'), method: 'post', data: this.$http.adornData(examStudentIds, false), timeout: 1000 * 60 * 60 // 超时时间设为60分钟,避免数据量太大,超时失败 }).then(({data}) => { this.loading.close()
知识点积累
this.$http({ url: this.$http.adornUrl(`/ges/examstudent/changetotransable`), method: 'post', data: this.$http.adornData({ 'deviceid': this.dataForm.deviceid, 'appid': this.dataForm.appid, }) }).then(({data}) => { if (data && data.code === 0) { this.$message({ message: '操作成功', type: 'success', duration: 1500, onClose: () => { this.visible = false this.$emit('refreshDataList') } }) } else { this.$message.error(data.msg) } })
分页获取数据
this.$http({ url: this.$http.adornUrl('/ges/examstudent/transablelists'), method: 'get', params: this.$http.adornParams({ 'page': this.pageIndex, 'limit': this.pageSize, }) }).then(({data}) => { if (data && data.code === 0) { this.dataList = data.page.list this.totalPage = data.page.totalCount } else { this.dataList = [] this.totalPage = 0 } this.dataListLoading = false })
下一刻执行时间:
this.$nextTick(() => { for (var i = 0 ; i < data.page.list.length; i++) { this.$refs.multipleTable.toggleRowSelection(data.page.list[0]); } })
提示框
this.$alert(`考生下载成功`, '提示', { confirmButtonText: '确定' }).then(() => { this.visible = false this.$router.push({ name: 'ges-download' }) }).catch(() => {})
确认框
this.$confirm(`确定清空所有考生可下载状态吗?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { this.$http({ url: this.$http.adornUrl('/ges/examstudent/transcancel'), method: 'post', }).then(({data}) => { if (data && data.code === 0) { this.getDataList() } }); }).catch(() => {})
全局加载框
this.loading = this.$loading({ lock: true, text: '正在清空所有考生可下载状态,请稍后...', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' }); // 关闭加载框 this.loading.close();
树形组件加载代码
import { treeDataTranslate } from '@/utils' 在完成后调用转换函数,转换树形表格 this.dataList = treeDataTranslate(this.dataList, 'menuId')
下拉框选项
<el-form-item> 状态: <el-select v-model="dataForm.selectStatus.value" placeholder="请选择"> <el-option v-for="item in dataForm.selectStatus.options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> dataForm: { userName: '', selectStatus: { options: [{ value: 0, label: '待发布' }, { value: 1, label: '待整改' }, { value: 2, label: '待复查' }, { value: 3, label: '整改完成' }], value: '' }, },
self.$scopedSlots.default is not a function
<el-table key='examstudentresitTable' ref="table" ...
参考
https://blog.csdn.net/beichen3997/article/details/80605699
找不到热力图
Error: Component series.heatmap not exists. Load it first
【解决办法】下载完整版 echart.js
https://blog.csdn.net/m0_37987521/article/details/79937755
批量勾选表格中所有行
<el-table ref="table" :data="dataList" border stripe v-loading="dataListLoading" @selection-change="selectionChangeHandle" style="width: 100%;"> this.$nextTick(() => { for (var i = 0 ; i < data.page.list.length; i++) { this.$refs.table.toggleRowSelection(data.page.list[i]); } })
UEditor 编辑器
/static/plugins/ueditor-1.4.3.3/ueditor.config.js
资料
Ueditor的配置及使用
http://www.cnblogs.com/cryst/p/5984894.html
在获取编辑器对象的时候来操作
this.ue = ueditor.getEditor(this.ueId, { // serverUrl: '', // 服务器统一请求接口路径 zIndex: 3000, toolbars: [[ 'fullscreen', '|', 'undo', 'redo', '|', 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|', 'print', ]] })
renren-fast 演示地址
http://fast.demo.renren.io/#/login
renren-fast 前端框架代码
https://github.com/daxiongYang/renren-fast-vue
Element-UI框架指南(先看这个)
http://element.eleme.io/#/zh-CN/component/installation
湖南的技术团队
Redis 缓存
使用起来相当方便,安装好 Redis,开放端口,修改配置文件(地址、密码等)即可。
测试用例:
io/renren/RedisTest.java
contextLoads
Redis 缓存的优点
速度快、缓存、支持持久化、数据库等
https://blog.csdn.net/m0_37450089/article/details/78740692
Windows 下的安装
https://github.com/MicrosoftArchive/redis/releases
参考博客:http://www.cnblogs.com/jaign/articles/7920588.html
Mac 下安装 rdm 管理工具
可视化工具现在是收费的啦~ 不能使用。可以用下面这个
https://download.csdn.net/download/a491022039/9954157
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null brew cask install rdm
不能远程访问
1. 开通远程访问功能
http://www.cnblogs.com/liusxg/p/5712493.html
作为服务运行的Redis配置文件,通常为redis.windows-service.conf,而不是redis.windows.conf。小心不要选错了。
2. 本地安装: Mac 下安装 redis
mac系统安装redis
https://www.cnblogs.com/feijl/p/6879929.html
启动Redis
本地,打开终端,输入命令:
redis-server
存储关联对象
public class MapDeviceInfo extends HashMap<String, DeviceInfo> { } MapDeviceInfo map = redisUtils.get(KEY_DEVICEINFO, MapDeviceInfo.class); map = new MapDeviceInfo(); redisUtils.set(KEY_DEVICEINFO, map);
资料
对于数据缓存不是所有东西都缓存到redis就是好的,而是要针对一些改动不大或者访问率大的数据进行缓存来减少关系型数据库的压力。
https://www.cnblogs.com/cuihongyu3503319/p/7641085.html
其他技术点
wagon 部署 https://segmentfault.com/a/1190000009849487
MyBatis-plus http://mp.baomidou.com/#/
项目属性修改
项目根路径修改
src/main/resources/application.yml
发布版本,连接MSSQL, 启动失败
c.alibaba.druid.filter.stat.StatFilter : merge sql error, dbType sqlserver, druid-1.1.10, sql : null
【解决办法】
application-prod.yml: 修改如下属性: #validation-query: SELECT 1 FROM DUAL merge-sql: false
启动地址
API接口生成文档地址
http://localhost:8080/es-server-rrf/swagger-ui.html
http://192.168.1.114:8080/es-server-rrf/swagger-ui.html
后台管理系统地址
http://localhost:8080/es-server-rrf/swagger/index.html#/
http://192.168.1.114:8080/es-server-rrf/swagger/index.html#/
考前练习地址
http://localhost:8080/es-server/swagger-ui.html
http://localhost:8080/ee-server/swagger/index.html#/
知识点积累
查询数量
count = userService.selectCount( Condition.create() .eq("mobile", form.getMobile())); if (count > 0) { return R.error().put("msg", "手机号已被注册"); }
对象方式查询数据
public UserEntity queryByDeviceId(String deviceid, String mobile) { UserEntity userEntity = new UserEntity(); userEntity.setDeviceid(deviceid); userEntity.setMobile(mobile); return baseMapper.selectOne(userEntity); }
关键字过滤
import org.apache.commons.lang.StringUtils; @Override public PageUtils queryPage(Map<String, Object> params) { String username = (String)params.get("username"); Long createUserId = (Long)params.get("createUserId"); Page<SysUserEntity> page = this.selectPage( new Query<SysUserEntity>(params).getPage(), new EntityWrapper<SysUserEntity>() .like(StringUtils.isNotBlank(username),"username", username) .eq(createUserId != null,"create_user_id", createUserId) ); return new PageUtils(page); }
快速打印对象的所有属性值
import org.apache.commons.lang.builder.ToStringBuilder; ToStringBuilder.reflectionToString(e)
保存数据库日志
@SysLog("删除用户")
在 controller 类前面添加如上注解, 切面程序会自动解析
src/main/java/io/renren/common/aspect/SysLogAspect.java
抛出异常
登录用户拦截位置: io.renren.modules.app.resolver.LoginUserHandlerMethodArgumentResolver throw new RRException("此用户已被禁用,如有疑问请联系管理员!");
忽略数据中的字段(包括插入、更新)(无法更新标识列 'exam_id')
@TableField(exist = false)
如果表中字段是自增字段,建议设置为 插入更新状态
@TableField(fill = FieldFill.INSERT) private Integer questionId;
1. 采用的 MyBatis-Plus,Service层的对象 具有 批量插入、全字段插入 等方法
// 注意,批量操作时,必须设定 ID为用户输入,不然 会传入空值,造成出错 @TableId(type = IdType.INPUT)
后来发现,在 spring-boot 的配置文件中,也有整个项目的配置信息,不过没有测试过:
在 src/main/resource/application.yml 文件中,可以找到如下内容:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 0
2. 查询列表
List<ESCExamquesaskEntity> list = escExamquesaskService.selectList( Condition.create() .setSqlSelect("*") .eq("ExamStudentID", examStudentID) );
3. 2个对象属性快速复制
import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(escSE, se);
SQLServer2012不能使用批量插入语句
MybatisPlusException: Error: Cannot execute insertBatch Method. Cause Caused by: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果。
将
this.insertBatch(list);
改成
this.insert(sysUserRoleEntity);
解决。
获取配置参数
public class ConfigConstant { /** * 题目开放比例 */ public final static String QUESTION_OPEN_RATE_CONFIG_KEY = "QUESTION-OPEN-RATE"; ... @Autowired private SysConfigService sysConfigService; String strRate = sysConfigService.getValue(ConfigConstant.QUESTION_OPEN_RATE_CONFIG_KEY);
4. Logger 日志记录
import org.slf4j.Logger; import org.slf4j.LoggerFactory; private Logger logger = LoggerFactory.getLogger(getClass()); logger.error("redis error", e);
5. 跨域设置位置
config/ CorsConfig.java
6. springboot 中传输数组参考代码
// 设置传输完成的考生状态为已经传输完毕状态 @PostMapping("/transfinish") public R transfinish(@RequestBody String[] examStudentIds) { List<ExamstudentEntity> stuList = examstudentService.selectBatchIds( Arrays.asList(examStudentIds));
在 swagger 中测试时,输入的 内容,直接输入字符串即可。【注意】不要添加 [], "" 这些内容
/ges/examstudentresit/finish: get: tags: - 补考管理 summary: 更新到技术中心 produces: - application/json parameters: - name: body description: 补考考生ID列表 in: body type: array items: type: string required: true responses: '200': schema: $ref: '#/definitions/R'
数据源监测页面
类似于:
http://localhost:8080/renren-fast/druid/
默认只能用局域网打开地址
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。
https://www.cnblogs.com/wuyun-blog/p/5679073.html
主要参数:
test-on-borrow:false
不检测池里连接的可用性
设置往连接池归还连接时是否检查连接有效性,true时,每次都检查;false时,不检查
【总结】 监控sql语句执行性能
资料
Druid 介绍及配置
https://www.cnblogs.com/niejunlei/p/5977895.html
官网上列举出来的 常见问题
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
使用Druid监控SQL执行状态
https://blog.csdn.net/flyfish778/article/details/53470683/
代码生成器
renren-generator
可以更改配置文件,修改生成文件属性
// SQL Server 的连接 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://192.168.1.10:1433;databasename=db username: sa password: 123456 // MySQL 的连接 driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.1.10:3306/cd?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8 username: root password: root
调试小技巧
解决mac启动springboot 很慢的情况
https://www.jianshu.com/p/8cb039cd41e8
etc/hosts
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost Hi-MacdeMac-mini.local 255.255.255.255 broadcasthost ::1 localhost Hi-MacdeMac-mini.local
数据库连接
Sql Server 2012
下载驱动程序
https://www.microsoft.com/zh-cn/download/details.aspx?id=11774
本地安装,进入 jre8 目录下
mvn install:install-file -Dfile=sqljdbc42.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.2
maven 配置项,重新更新 maven 依赖
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version>4.2</version> </dependency>
无法更新标识列
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 无法更新标识列 'question_id'。
原因: 字段设置了自增属性
解决办法: 删除此字段,然后,再重新添加1个同名字段即可
解决办法2: 在实体类中删除此字段,不与数据库进行更新。
自定义分页
思路:全部获取数据之后,再创建分页对象
Page<ESCExamarrangeModel> page = new Query<ESCExamarrangeModel>(params).getPage(); page.setRecords(this.baseMapper.selectArrangeListPage(page, arrange)); page.setTotal(areaList.size()); PageUtils pageUtils = new PageUtils(page); return R.ok().put("page", pageUtils);
100台同时访问时出错
偶尔发生,后面再测没有发现
org.apache.http.MalformedChunkCodingException: Unexpected content at the end of chunk at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:257) at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:225) at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:184)
网上资料,应该是HTTP传输中数据量太大引起的错误
操作数类型冲突: varbinary 与 float 不兼容
float类型的字段不能存null
https://blog.csdn.net/siyi1219/article/details/81199111
启动
mvn spring-boot:run
部署
打包成jar方式【推荐】
mvn package java -jar es-server-rrf.jar
服务器的端口位于 application.yml 中
打包成war的形式
项目根目录
mvn clean package -f pom-war.xml
拷贝已生成的 target 目录下的 renren-fast.war 包到 tomcat 发布目录即可
mac 下查看启动信息:
sudo sh catalina.sh run
测试地址,管理页面显示地址:
当然,也可以尝试生成 jar 包,通过 java 来进行运行。
多数据库连接
【注意】一定要去掉默认配置的事务管理器,不然切换数据源时,后面的数据源只允许进行 读操作,不能删除、更新!
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) @Import({DynamicDataSourceConfig.class})
【特别鸣谢】
https://blog.csdn.net/MuuMo/article/details/81180020
,虽然描述的文字没起到帮助,看到贴出的代码,尝试性地去掉事务管理器,结果成功啦!
在常量
io.renren.datasources. DataSourceNames
添加 数据源 标志
String FIRST = "first"; String SECOND = "second"; String THIRD = "third"; String FOUTH = "fouth";
添加切面检测程序。切面程序,在对应这个包中,直接建好类即可。(好像会自动扫描,并执行。真是方便呀)
io.renren.datasources.aspect
代码类似于:
package io.renren.datasources.aspect; import io.renren.datasources.DataSourceNames; import io.renren.datasources.DynamicDataSource; import io.renren.datasources.annotation.DataSource; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import java.lang.reflect.Method; /** * 多数据源,切面处理类 * @author chenshun * @email sunlightcs@gmail.com * @date 2017/9/16 22:20 */ @Aspect @Component public class ESTAspect implements Ordered { protected Logger logger = LoggerFactory.getLogger(getClass()); // 所有 esc 下的都以 ExamCenter 数据库为操作数据库 @Pointcut("execution(* io.renren.modules.est.dao.*.*(..))") public void estPointCut() { } @Around("estPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); DataSource ds = method.getAnnotation(DataSource.class); DynamicDataSource.setDataSource(DataSourceNames.THIRD); logger.debug("set datasource is " + DataSourceNames.THIRD); try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); logger.debug("clean datasource"); } } @Override public int getOrder() { return -100; } }
动态数据源设置 io.renren.datasources
@Bean @Primary public DynamicDataSource dataSource( DataSource firstDataSource, DataSource secondDataSource, DataSource thirdDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceNames.FIRST, firstDataSource); targetDataSources.put(DataSourceNames.SECOND, secondDataSource); targetDataSources.put(DataSourceNames.THIRD, thirdDataSource); // 默认数据源,以及可动态设置的数据源 return new DynamicDataSource(firstDataSource, targetDataSources); }
在 yml 文件中添加数据源配置
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver druid: first: #数据源1 url: jdbc:sqlserver://192.168.1.114:1433;databasename=renren_fast username: sa password: 123456 second: #数据源2 url: jdbc:sqlserver://192.168.1.114:1433;databasename=HN-SafeExamCore username: sa password: 123456 third: #数据源3 url: jdbc:sqlserver://192.168.1.114:1433;databasename=renren_fast username: sa password: 123456 fouth: #数据源4 url: jdbc:sqlserver://192.168.1.114:1433;databasename=renren_fast username: sa password: 123456
Java 调用C#Web服务接口
查询用户所对应的菜单
<!-- 查询用户的所有菜单ID --> <select id="queryAllMenuId" resultType="long"> select distinct rm.menu_id from sys_user_role ur LEFT JOIN sys_role_menu rm on ur.role_id = rm.role_id where ur.user_id = #{userId} </select>
多事务管理器
Spring3.0配置多个事务管理器(即操作多个数据源)的方法
https://blog.csdn.net/mmoooodd/article/details/78269169
shared-jdbc
https://github.com/sharding-sphere/sharding-sphere
SpringBoot+Mybatis+druid+Atomikos
3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
https://blog.csdn.net/qq_29242877/article/details/79033287
springboot+druid+mybatis plus的多数据源配置
https://www.jianshu.com/p/ff5af6c59365?utm_source=oschina-app
定时任务执行
1. 在数据库表中插入 schedule_job 记录
2. 给登录用户执行计划的权限
3. 执行 /sys/schedule/run 接口 POST 的方式,传入任务 id,开始执行
这里为执行任务的对象,数据库中有标注此对象的名称、需要调用的方法,以及是否带参等
io.renren.modules.job.task
关于定时任务的配置位于:
io.renren.modules.job.config.ScheduleConfig //延时启动 factory.setStartupDelay(30);
自动执行的定时任务没有执行. 修改后的任务代码是代表每秒钟执行一次
0/3 0 * * * ? ==> 0/1 * * * * ?
一定要注意 记录中 的 status 自动为0,才是自动执行的
问题及解决
java.lang.ClassCastException: io.renren.modules.job.entity.ScheduleJobEntity cannot be cast to io.renren.modules.job.entity.ScheduleJobEntity at io.renren.modules.job.utils.ScheduleJob.executeInternal(ScheduleJob.java:49)
关闭dev-tool,即关闭热部署的功能(如果还不可以,就重新导入maven依赖)
https://www.renren.io/detail/10399
延伸扩展
定时器库,如何使用
org.quartz.core.JobRunShell
其他代码
@PostConstruct
阅读资料
开源项目renren-fast解读,让java不再难懂
https://cloud.tencent.com/developer/news/222766
http://baijiahao.baidu.com/s?id=1601394902050024021&wfr=spider&for=pc
http://baijiahao.baidu.com/s?id=1601503116967379920&wfr=spider&for=pc
多数据源切换
最原始的项目仓库代码
https://github.com/baomidou/dynamic-datasource-spring-boot-starter
利用切面,动态切换
https://blog.csdn.net/u012075383/article/details/79304178
spring-boot+mybatis-plus+SQLServer多数据源配置
https://blog.csdn.net/MuuMo/article/details/81180020
springBoot 动态数据源以及Mybatis多数据源
https://blog.csdn.net/tengxing007/article/details/78424645
Spring Boot + Mybatis多数据源和动态数据源配置
https://blog.csdn.net/neosmith/article/details/61202084
https://blog.csdn.net/kimylrong/article/details/50471097
SpringBoot+MybatisPlus(多数据源和主从分离)
http://www.cnblogs.com/hsbt2333/p/9347249.html
SpringBoot入门之基于Druid配置Mybatis多数据源
https://www.cnblogs.com/5ishare/p/9352046.html
人人专业版
常用代码
带时间的选择框
<el-date-picker v-model="dataForm.productTime" type="datetime" placeholder="选择日期" format="yyyy-MM-dd hh:mm:ss" value-format="yyyy-MM-dd hh:mm:ss"> </el-date-picker> // 验证手机号码 var validateMobile = (rule, value, callback) => { if (!value || value == '') { return callback(new Error(this.$t('validate.required', { 'attr': this.$t('user.mobile') }))) } if (value && !isMobile(value)) { return callback(new Error(this.$t('validate.format', { 'attr': this.$t('user.mobile') }))) } callback() } import Cookies from 'js-cookie' var token = Cookies.get('token')
String title = (String)params.get("title"); String startTime = (String)params.get("startTime"); String endTime = (String)params.get("endTime"); QueryWrapper<ContingencyPlanEntity> wrapper = new QueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(title), "title", title); wrapper.ge(StringUtils.isNotBlank(startTime), "create_date", startTime); wrapper.le(StringUtils.isNotBlank(endTime), "create_date", endTime);
// 过滤时间 <template slot-scope="scope"> {{scope.row.productTime == null ? '' : scope.row.productTime.split(' ')[0]}} </template>
是否需要在创建组件时,请求数据。
data () { /* eslint-disable */ return { // 设置属性 mixinViewModuleOptions: { createdIsNeed: true, // 此页面是否在创建时,调用查询数据列表接口? activatedIsNeed: false, // 此页面是否在激活(进入)时,调用查询数据列表接口? getDataListURL: '', // 数据列表接口,API地址 getDataListIsPage: false, // 数据列表接口,是否需要分页? deleteURL: '', // 删除接口,API地址 deleteIsBatch: false, // 删除接口,是否需要批量? deleteIsBatchKey: 'id', // 删除接口,批量状态下由那个key进行标记操作?比如:pid,uid... exportURL: '' // 导出接口,API地址 },
后端mybatis 接口编写
<select id="statis" parameterType="Map" resultType="java.util.LinkedHashMap"> select username, sum(worktime) as worktime, sum(oreton) as oreton, sum(mullockton) as mullockton, sum(oreton)+sum(mullockton) as total from tb_driver_daily where 1=1 <if test="sTime != null and sTime.trim() != ''"> and ctime <![CDATA[ >= ]]> #{sTime} </if> <if test="eTime != null and eTime.trim() != ''"> and ctime <![CDATA[ <= ]]> #{eTime} </if> <if test="username != null and username.trim() != ''"> and username regexp #{username} </if> group by username ; </select>
List<?> statis(Map<String, Object> params);
Map<String, Object> params = new HashMap<String, Object>(); params.put("username", username.replaceAll(",", "|")); List<?> list = driverDailyService.statis(params);
测试用例
在有websocket的情况下,启动测试用例
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class DriverDailyServiceTest {
注意添加如下代码:限制只测试web环境
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)