renren-fast 开源项目常用代码积累

  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
  1. 查询列表
List<ESCExamquesaskEntity> list = escExamquesaskService.selectList(
        Condition.create()
        .setSqlSelect("*")
        .eq("ExamStudentID", examStudentID)
        );
  1. 2个对象属性快速复制
BeanUtils.copyProperties(escSE, se);
  1. Logger 日志记录
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private Logger logger = LoggerFactory.getLogger(getClass());

logger.error("redis error", e);
  1. 跨域设置位置
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模拟数据配置

模拟数据接口文档地址:

http://mockjs.com/0.1/#

 

创建调用接口是不断变化的时间数据接口, 在 mock/index.js 中编写

 

// 返回压裂监测工程曲线数据
Mock.mock(new RegExp('/dss/data/get-monitor-data'), 'get', (opts) => {
    opts['data'] = opts.body&nbsp;? JSON.parse(opts.body)&nbsp;: 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;
})

 

 

http://mockjs.com/

 

 

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&nbsp;!== 'production') {
  require('@/mock')
}

发布版下采用模拟数据

src/main.js 配置,不管什么模式都调用模拟数据接口

// 非生产环境, 适配mockjs模拟数据                 // api: https://github.com/nuysoft/Mock
// if (process.env.NODE_ENV&nbsp;!== '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(() => {
&nbsp; for (var i = 0&nbsp;; i < data.page.list.length; i++) {
&nbsp; &nbsp; this.$refs.multipleTable.toggleRowSelection(data.page.list[0]);
&nbsp; }
})

提示框

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"
 &nbsp;:data="dataList"
  border
  stripe
  v-loading="dataListLoading"
  @selection-change="selectionChangeHandle"
  style="width: 100%;">


this.$nextTick(() => {
  for (var i = 0&nbsp;; 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', 
            ]]
          })
 

https://www.renren.io/guide/

https://www.renren.io/

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&nbsp;; 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  &nbsp;: merge sql error, dbType sqlserver, druid-1.1.10, sql&nbsp;: 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&nbsp;!= 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

测试地址,管理页面显示地址:

http://localhost:8080/

 

当然,也可以尝试生成 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 &&&nbsp;!isMobile(value)) {
          return callback(new Error(this.$t('validate.format', { 'attr': this.$t('user.mobile') })))
        }
        callback()
      }


import&nbsp;Cookies&nbsp;from&nbsp;'js-cookie'
var&nbsp;token&nbsp;=&nbsp;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&nbsp;? ''&nbsp;: 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&nbsp;!= null and sTime.trim()&nbsp;!= ''">
        and ctime <![CDATA[ >= ]]> #{sTime}
    </if>
    <if test="eTime&nbsp;!= null and eTime.trim()&nbsp;!= ''">
        and ctime <![CDATA[ <= ]]> #{eTime}
    </if>
    <if test="username&nbsp;!= null and username.trim()&nbsp;!= ''">
        and username regexp #{username}
    </if>
    group by username&nbsp;;
</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)

 
posted @ 2018-09-13 15:24  lvye1221  阅读(198)  评论(0编辑  收藏  举报