2018-8-27 星期一
1.菜单管理、部门管理中id列的可见性设置问题:jquery.treegrid.extension.js ,详情见PDF。
2.展示通知:解决关闭单项通知按钮无效问题。
请确保使用带有 data-dismiss="alert" data 属性的 <button> 元素。
<!-- class="alert alert-dismissable" 可取消警告 配合按钮-->
<div class="alert" style="padding: 0px; margin-bottom: 5px">
<div class="alert-dismissable">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
<strong>${notice.title}</strong>
<div>${notice.content}</div>
<small pattern="yyyy-MM-dd HH:mm:ss">${notice.updatetime}</small>
<!-- 下划线 -->
<hr class="simpleTagLabel">
</div>
</div>
2018-8-28 星期二
1.通用表格展示列生成
{title: '', field: '', visible: true, align: 'canter', valign: 'middle'},
2.产品名映射表
模块:产品名映射表模块基本功能实现
查看产品名映射:自定义mapper,数据从视图ProductNameMappingTable中获取。
添加、修改、删除产品名映射:采用BaseMapper,与数据表ProductNameData建立对应关系。
需要注意的是:
1. 视图中不存在主键这一字段,修改、删除操作的依赖字段为productId,使用EntityWarpper条件构造器进行操作即可。
2. 由于视图和数据表的联动关系在数据库中已经存在,若插入一条数据库中产品编号未存在的数据到视图中,此操作无效。
3. 在产品名映射上,搜索条件整合,可通过产品编号、标准名、别名等多个字段进行视图内的数据查询。现阶段搜索条件不存在多选,如需请参照产品基础信息模块。
4. 产品信息验证逻辑迁移至添加页面映射界面,编辑页面中产品编号已经设置为不可更改。
坐标:ProductNameMappingController.java
/**
* @Author jiangyanfei
* @Description 产品信息检查 -- 查询视图所关联表中当前操作数据是否存在
* @Date 2018/8/28
* @Param [productNameData]
* @return boolean
**/
public boolean checkProductInfo(ProductNameData productNameData){
ProductInfo productInfo = iProductBasicInfoService.getProductInfoByProductId(productNameData.getProductID());
if (productInfo != null) {
return true;
}
return false;
}
坐标:productNameMapping_edit.html
<#input id="productID" name="产品编号" underline="true" value="${productNameMapping.productID}" disabled="disabled" />
2018-8-30 星期四
1.多数据源配置问题
关于多数据源切换问题,在MultiSourceExAop中进行了声明。
1. @DataSource注解只能用于方法,在业务方法名上添加注解,即表示为切换数据源。
2. 多数据源切换逻辑:
//根据注解中name属性的值,从注解中获得数据源类型。
DataSource datasource = currentMethod.getAnnotation(DataSource.class);
if (datasource != null) {
//数据源切换
DataSourceContextHolder.setDataSourceType(datasource.name());
log.debug("设置数据源为:" + datasource.name());
} else {
DataSourceContextHolder.setDataSourceType(mutiDataSourceProperties.getDefaultDataSourceName());
log.debug("设置数据源为:dataSourceCurrent");
}
try {
//正常业务逻辑
return point.proceed();
} finally {
log.debug("清空数据源信息!");
DataSourceContextHolder.clearDataSourceType();
}
可以看出,在切面方法中,每次都会根据注解获取数据源类型,并进行数据源切换。而且,无论业务逻辑是否执行,最终都会清空数据源信息。这里指的清空,是变更为默认数据源类型:MySQL;
3. 方法中嵌套使用多数据源:这里的内外调用方法均添加了@DataSource注解
经过debug发现,DataSourceContextHolder中的线程为单线程,即一次存储单个数据源信息。
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
在嵌套使用多数据源的场景中:存在两种情况。
1. 外调用的数据源切换已完成后内数据源进行数据源切换。
/**
* 获取证券交易列表
*/
@RequestMapping(value = "/list")
@ResponseBody
@DataSource(name = DSEnum.DATA_SOURCE_BIZ) //外调用
public Object list(@RequestParam(value = "condition", defaultValue = "") String condition,
@RequestParam(value = "tradingDay", defaultValue = "") String tradingDay) {
if (condition.equals("") && tradingDay.equals("")) {
return tradingStockMapper.selectPage(new Page<TradingStock>(1, 10), null);
}
//内调用
return iSecurityDealService.getTradingStockList(condition, tradingDay.replaceAll("-+",""));
}
2. 外调用的数据源切换未完成,内数据源的数据源进行切换,此时新建了一个数据库链接。外调用不可正常使用。
/**
* 新增证券交易
*/
@RequestMapping(value = "/add")
@ResponseBody
@DataSource(name = DSEnum.DATA_SOURCE_BIZ) //外调用
public Object add(TradingStock tradingStock) {
//内调用
if (iProductBasicInfoService.getProductInfoByProductId(tradingStock.getProductID()) != null){
tradingStock.setOpdate(new Date());
tradingStock.setAmount((double) (tradingStock.getVolume() * tradingStock.getPrice()));
//外调用未完成业务逻辑 -- 出错
tradingStockMapper.insert(tradingStock);
}
return super.SUCCESS_TIP;
}
4.解决方案:
涉及数据源切换的通用逻辑:ProductInfoCheck,将该方法重写后不添加@DataSource注解,其他方法同理,当外调用已经开启注解进行了数据源切换,内调用的方法就不应该再添加@DataSource注解。但由于该种嵌套切换数据源局限于部分操作,因此可以采用该方法进行解决。AOP作用域为当前切点(方法),之前提到的注释数据源关闭时不恰当的,数据源的连接应根据所需进行开关,避免造成资源浪费。
2.多层目录下SpringBoot扫描不到Dao层接口的问题:
SpringBoot默认的Spring容器初始化Bean加载路径为:与Application启动类同级目录下,以及同级子级目录下。
由于构造三级菜单的缘故,目录名层次为三级,Spring容器扫描不到。
坐标:MybatisPlusConfig.java 配置类 * 变更为 ** 表示多级目录
@MapperScan(basePackages = {"com.quant.qdvp.modular.**.dao", "com.quant.qdvp.common.persistence.dao"})
2018-8-31 星期五
1.add、edit表单id未标识,表单验空出错
Uncaught TypeError: Cannot read property 'resetForm' of undefined...
xxx_add.html、xxx_edit.html中表单id一定要标明。