踩坑記錄_八月篇_3

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一定要標明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章