Browse Source

去除查询窗口的whereclause,避免SQL语句泄露。

yangzhijie 4 năm trước cách đây
mục cha
commit
f0381b3143

+ 4 - 0
packages/index.js

@@ -23,6 +23,8 @@ import ProcessReportResultPreview from './process/process-report-result-preview.
 import DocGenerator from './info/doc-generator.js';
 import InfoSearchWidget from './info/info-search-widget.js';
 import SearchWidget from './info/search-widget.js';
+import SearchAutoCompleteWidget from './info/search-auto-complete-widget.js';
+
 
 import PrintEpc from './print/print-epc.js';
 import PrintWidget from './print/print-widget.js';
@@ -74,6 +76,7 @@ const components = [
   DocGenerator,
   InfoSearchWidget,
   SearchWidget,
+  SearchAutoCompleteWidget,
   PrintEpc,
   PrintWidget,
   TreeViewNode,
@@ -147,6 +150,7 @@ export default {
   ProcessReportResultPreview,
   InfoSearchWidget,
   SearchWidget,
+  SearchAutoCompleteWidget,
   PrintEpc,
   PrintWidget,
   TreeViewNode,

+ 8 - 0
packages/info/search-auto-complete-widget.js

@@ -0,0 +1,8 @@
+
+import SearchAutoCompleteWidget from './src/SearchAutoCompleteWidget.vue';
+
+SearchAutoCompleteWidget.install = function(Vue) {
+  Vue.component(SearchAutoCompleteWidget.name, SearchAutoCompleteWidget);
+};
+
+export default SearchAutoCompleteWidget;

+ 2 - 1
packages/info/src/DocGenerator.vue

@@ -6,6 +6,7 @@
         :info-filter-fields="infoFilterFields"
         :show-button="true"
         :is-search-widget="true"
+        :info-window-no="infoWindowDto.no"
         @simple-search="simpleSearch()"
         @complex-search="complexSearch()"
         @refresh-search="queryInfoWindowData"
@@ -200,7 +201,7 @@ export default {
       var _self = this;
 
       var infoQueryParam = this.$refs.docGeneratorGrid.getQueryParam();
-      infoQueryParam.infoFilterFieldValues = _self.$refs.queryCondition.getQueryCondition();            
+      infoQueryParam.condition = _self.$refs.queryCondition.getQueryCondition();            
       _self.$refs.loading.show();
       $.ajax({
         url: Common.getApiURL('InfoWindowResource/queryInfoWindowDataSimple'),

+ 3 - 3
packages/info/src/InfoMultiSearchWidget.vue

@@ -34,7 +34,7 @@
         <!-- <InfoFilter
           ref="info"
           :field-value="fieldValue"
-          :where-clause="whereClause"
+          :where-clause-source="whereClauseSource"
           :is-search-widget="true"
           @data-selected="dataSelected"
           @delete-selected="deleteSelected"
@@ -65,8 +65,8 @@ export default {
       type: Object,
       default: null,
     },
-    'whereClause': {
-      type: String,
+    'whereClauseSource': {
+      type: Object,
       default: null,
     }, 
     'displayName': {

+ 5 - 5
packages/info/src/InfoSearchWidget.vue

@@ -32,7 +32,7 @@
         <!-- <InfoWindow
           v-if="showSubInfoWindow"
           ref="info"
-          :where-clause="whereClause"
+          :where-clause-source="whereClauseSource"
           :field-value="fieldValue"
           :is-search-widget="true"
           @data-selected="dataSelected"
@@ -42,7 +42,7 @@
     <SearchAutoCompleteWidget
       ref="autoComplete"
       :info-window-no="infoWindowNo"
-      :where-clause="whereClause"
+      :where-clause-source="whereClauseSource"
       class="auto-complete"
       @select-data="dataSelected"
     />
@@ -90,9 +90,9 @@ export default {
       type: String,
       default: null,
     }, 
-    'whereClause':
+    'whereClauseSource':
     {
-      type: String,
+      type: Object,
       default: null,
     }, 
   },
@@ -154,7 +154,7 @@ export default {
     },
 
     // 查询条件变化时,重新查询数据
-    whereClause: function () {
+    whereClauseSource: function () {
       this.$refs.info.loadByInfoWindowNo(this.infoWindowNo);
     },
   },

+ 3 - 3
packages/info/src/InfoWindow.vue

@@ -5,7 +5,7 @@
       ref="infoComponent"
       :field-value="fieldValue"
       :info-window="infoWindowDto"
-      :where-clause="whereClause"
+      :where-clause-source="whereClauseSource"
       :is-search-widget="isSearchWidget"
       :parent-model-data="parentModelData"
       :model-data="modelData"
@@ -32,9 +32,9 @@ export default {
   },
 
   props: {
-    'whereClause':
+    'whereClauseSource':
         {
-          type: String,
+          type: Object,
           default: null,
         },
     'isSearchWidget': {

+ 5 - 1
packages/info/src/QueryCondition.vue

@@ -27,7 +27,6 @@
         >
           <QueryConditionSimple
             ref="queryConditionSimple"
-            :info-filter-fields="infoFilterFields"
             :info-buttons="infoButtons"
             :is-search-widget="isSearchWidget"
             :show-button="showButton"
@@ -44,6 +43,7 @@
         >
           <QueryConditionComplex
             ref="queryConditionComplex"
+            :info-window-no="infoWindowNo"
             :filter-fields="filterFields"
             :info-buttons="infoButtons"
             :is-search-widget="isSearchWidget"
@@ -72,6 +72,10 @@ export default {
   },
 
   props: {
+    'infoWindowNo':{
+      type: String,
+      default: null,
+    },
     'infoFilterFields': {
       type: Array,
       default: null,

+ 7 - 3
packages/info/src/QueryConditionComplex.vue

@@ -93,7 +93,7 @@
 
             <InfoSearchWidget
               v-if="item.displayType =='SearchBoxEditor'"
-              :where-clause="item.whereClause"
+              :where-clause-source="{'infoFilterField': {'infoWindowNo': infoWindowNo, 'fieldName' : item.fieldValue}}"
               :info-window-no="item.infoWindowNo"
               :title-name="item.name"
               :field-value="item.fieldValue"
@@ -105,7 +105,7 @@
             <!-- 多选搜索框 number类型-->
             <InfoMultiSearchWidget
               v-if="item.displayType =='MultiSearchBoxEditor'"
-              :where-clause="item.whereClause"
+              :where-clause-source="{'infoFilterField': {'infoWindowNo': infoWindowNo, 'fieldName' : item.fieldValue}}"
               :info-window-no="item.infoWindowNo"
               :field-value="item.fieldValue"
               :display-name="item.listFieldNames"
@@ -201,7 +201,7 @@
             <!--单选number类型-->
             <InfoSearchWidget
               v-if="item.displayType =='SearchBoxEditor'"
-              :where-clause="item.whereClause"
+              :where-clause-source="{'infoFilterField': {'infoWindowNo': infoWindowNo, 'fieldName' : item.fieldValue}}"
               :info-window-no="item.infoWindowNo"
               :title-name="item.name"
               :field-value="item.fieldValue"
@@ -276,6 +276,10 @@ export default {
   },
 
   props: {
+    'infoWindowNo':{
+      type: String,
+      default: null,
+    },
     'filterFields': {
       type: Array,
       default: null,

+ 2 - 13
packages/info/src/QueryConditionSimple.vue

@@ -64,10 +64,6 @@ export default {
   },
 
   props: {
-    'infoFilterFields': {
-      type: Array,
-      default: null,
-    },
     'infoButtons': {
       type: Array,
       default: null,
@@ -131,15 +127,8 @@ export default {
          */
     getQueryCondition: function () {
       var _self = this;
-      var values = [];
-      _self.infoFilterFields.forEach(function (item) {
-        if (item.displayType == 'TextEditor' && item.constraintEnum != 'Between') {
-          item.value.value1 = _self.simpleConditionValue;
-          item.value.fieldName = item.fieldName;
-          values.push(item.value);
-        }
-      });
-      return values;
+      return _self.simpleConditionValue;
+      
     },
   },
 };

+ 38 - 27
packages/info/src/QueryPage.vue

@@ -32,6 +32,7 @@
             :info-buttons="infoWindowDto.infoButtons"
             :is-search-widget="isSearchWidget"
             :show-button="true"
+            :info-window-no="infoWindowDto.no"
             @simple-search="simpleSearch"
             @complex-search="complexSearch"
             @refresh-search="pageSearch"
@@ -216,8 +217,8 @@ export default {
 
   
   props: {
-    'whereClause':{
-      type: String,
+    'whereClauseSource':{
+      type: Object,
       default: null,
     },  
     'isSearchWidget':{
@@ -416,7 +417,7 @@ export default {
         length: _self.pagination.per_page,
         sortClause: '',
         infoFilterFieldValues: _self.$refs.queryCondition.getQueryCondition(),
-        whereClause: _self.whereClause,
+        whereClauseSource: _self.whereClauseSource,
         parentModelData: _self.parentModelData,
         modelData: _self.modelData,
         isSearchWidget: _self.isSearchWidget,
@@ -451,7 +452,7 @@ export default {
         length: _self.pagination.per_page,
         sortClause: '',
         infoFilterFieldValues: _self.$refs.queryCondition.getQueryCondition(),
-        whereClause: _self.whereClause,
+        whereClauseSource: _self.whereClauseSource,
         parentModelData: _self.parentModelData,
         modelData: _self.modelData,
         isSearchWidget: _self.isSearchWidget,
@@ -500,7 +501,7 @@ export default {
         _self.$refs.loading.show();
       }
 
-      _self.infoQueryParam.whereClause = _self.whereClause;
+      _self.infoQueryParam.whereClauseSource = _self.whereClauseSource;
       $.ajax({
         url: Common.getApiURL('InfoWindowResource/queryInfoWindowDataSimple'),
         type: 'post',
@@ -685,7 +686,7 @@ export default {
           var customerWindowRouteUrl = customerWindowDto.routeUrl;
           if (customerWindowRouteUrl != undefined && customerWindowRouteUrl != '') {
             if (customerWindowRouteUrl == 'exportInfoData') {
-              var downloadUrl = Common.getApiURL('exportResource/exportInfoData') + '?infoWindowNo=' + _self.infoWindowDto.no
+              var downloadUrl = Common.getApiURL('exportResource/exportInfoDataComplex') + '?infoWindowNo=' + _self.infoWindowDto.no
                                 + '&recordIds=' + _self.getSelectedRecordIds().join(',')
                                 + '&token=' + Common.getToken();
               window.open(downloadUrl);
@@ -749,31 +750,41 @@ export default {
     executeExport: function () {
       var _self = this;
 
-      var infoFilterFieldValues = _self.$refs.queryCondition.getQueryCondition();
-      var infoFilterFieldValueStrs = JSON.stringify(infoFilterFieldValues);
-
       var isSimpleQuery = _self.$refs.queryCondition.isSimpleQuery();
-
-      var downloadUrl = Common.getApiURL('exportResource/exportInfoData') + '?infoWindowNo=' + _self.infoWindowDto.no
+      if(isSimpleQuery){
+        var condition = _self.$refs.queryCondition.getQueryCondition();
+        var downloadUrl = Common.getApiURL('exportResource/exportInfoDataSimple') + '?infoWindowNo=' + _self.infoWindowDto.no
                 + '&recordIds=' + _self.getSelectedRecordIds().join(',')
                 + '&infoFilterFieldValues=' + _self.uuid
-                + '&simpleSearch=' + isSimpleQuery;
-
-
-      var timeStr = moment().format('_YYYYMMDD_hhmmss');
-      var fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
-      let userStorageDtos = [
-        {
-          key: _self.uuid,
-          value: infoFilterFieldValueStrs,
-        },
-      ];
-      // 组装查询条件,然后放到后台数据库当中
-      UserStorageResource.uploadUserStorage(userStorageDtos).then(successData => {
+                + '&condition=' + condition;
+        var timeStr = moment().format('_YYYYMMDD_hhmmss');
+        var fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
         DownloadService.downloadFile(downloadUrl, fileName);
-      }, errorData => {
-        Common.processException(errorData);
-      });
+      }else{
+        var infoFilterFieldValues = _self.$refs.queryCondition.getQueryCondition();
+        var infoFilterFieldValueStrs = JSON.stringify(infoFilterFieldValues);
+        var downloadUrl = Common.getApiURL('exportResource/exportInfoDataComplex') + '?infoWindowNo=' + _self.infoWindowDto.no
+                + '&recordIds=' + _self.getSelectedRecordIds().join(',')
+                + '&infoFilterFieldValues=' + _self.uuid;
+
+
+        var timeStr = moment().format('_YYYYMMDD_hhmmss');
+        var fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
+        let userStorageDtos = [
+          {
+            key: _self.uuid,
+            value: infoFilterFieldValueStrs,
+          },
+        ];
+        // 组装查询条件,然后放到后台数据库当中
+        UserStorageResource.uploadUserStorage(userStorageDtos).then(successData => {
+          DownloadService.downloadFile(downloadUrl, fileName);
+        }, errorData => {
+          Common.processException(errorData);
+        });
+      }
+
+      
     },
 
 

+ 37 - 58
packages/info/src/SearchAutoCompleteWidget.vue

@@ -45,7 +45,7 @@
 var Common = require('../../common/Common.js').default;
 
 export default {
-
+  name: 'SearchAutoCompleteWidget',
   props: {
     'infoWindowNo':{
       type: String,
@@ -55,8 +55,8 @@ export default {
       type: Number,
       default: null,
     },
-    'whereClause':{
-      type: String,
+    'whereClauseSource':{
+      type: Object,
       default: null,
     },
     'parentModelData': {
@@ -118,9 +118,9 @@ export default {
 
   methods: {
     /**
-             * 向下
-             * @return {void} 
-             */
+     * 向下
+     * @return {void} 
+     */
     selectDown: function () {
       var _self = this;
       var length = _self.infoWindowData.dataList.length;
@@ -130,9 +130,9 @@ export default {
     },
 
     /**
-             * 向上
-             * @return {void} 
-             */
+     * 向上
+     * @return {void} 
+     */
     selectUp: function () {
       var _self = this;
       var length = _self.infoWindowData.dataList.length;
@@ -142,9 +142,9 @@ export default {
     },
 
     /**
-             * 获取当前数据 供外部调用
-             * @return {Object} ModelData
-             */
+     * 获取当前数据 供外部调用
+     * @return {Object} ModelData
+     */
     getSelectData: function () {
       var _self = this;
 
@@ -157,8 +157,8 @@ export default {
     },
 
     /**
-             * 获取第一行数据
-             */
+     * 获取第一行数据
+     */
     getFirstData: function () {
       var _self = this;
       if (_self.infoWindowData != null && _self.infoWindowData.dataList != null && _self.infoWindowData.dataList.length > 0) {
@@ -168,9 +168,9 @@ export default {
     },
 
     /**
-             * 隐藏
-             * @return {[type]} [description]
-             */
+     * 隐藏
+     * @return {[type]} [description]
+     */
     hide: function () {
       var _self = this;
       _self.isShowAuto = false;
@@ -178,17 +178,17 @@ export default {
 
 
     /**
-             * 是否可见
-             * @return {Boolean} [description]
-             */
+     * 是否可见
+     * @return {Boolean} [description]
+     */
     isVisible: function () {
       return this.isShowAuto;
     },
 
     /**
-             * 查询InfoWindowDto
-             * @return {void} 
-             */
+     * 查询InfoWindowDto
+     * @return {void} 
+     */
     getInfoWindowDto: function (resolve, reject) {
       var _self = this;
       $.ajax({
@@ -211,32 +211,10 @@ export default {
     },
 
     /**
-             * 生成查询条件
-             * @param  {String} text 查询条件
-             * @return {Array}      
-             */
-    getSimpleQueryCondition: function (text) {
-      var _self = this;
-      var values = [];
-      if (_self.infoWindowDto.infoFilterFields != undefined) {
-        _self.infoWindowDto.infoFilterFields.forEach(function (item) {
-          if (item.displayType == 'TextEditor') {
-            var value = {
-              fieldName: item.fieldName,
-              value1: text,
-            };
-            values.push(value);
-          }
-        });
-      }
-      return values;
-    },
-
-    /**
-             * 根据条件初始化查询
-             * @param  {String} text 查询条件
-             * @return {void}      
-             */
+     * 根据条件初始化查询
+     * @param  {String} text 查询条件
+     * @return {void}      
+     */
     initSearch: function (text) {
       var _self = this;
       if (text != undefined) {
@@ -256,27 +234,28 @@ export default {
     },
 
     /**
-             * 选择节点
-             * @return {void} 
-             */
+     * 选择节点
+     * @return {void} 
+     */
     selectNode: function (data) {
       this.$emit('selectData', data);
     },
+
+
     /**
-             * 查询infoWindowData
-             * @return {void} 
-             */
+     * 查询infoWindowData
+     * @return {void} 
+     */
     getInfoWindowData: function (text) {
       var _self = this;
-      var infoFilterFieldValues = _self.getSimpleQueryCondition(text);
 
       var infoQueryParam = {
         infoWindowNo: _self.infoWindowNo,
         start: 0,
         length: 10,
         sortClause: '',
-        infoFilterFieldValues: infoFilterFieldValues,
-        whereClause: _self.whereClause,
+        condition: text,
+        whereClauseSource: _self.whereClauseSource,
         modelData: _self.modelData,
         parentModelData: _self.parentModelData,
         isSearchWidget: _self.isSearchWidget,

+ 6 - 6
packages/info/src/SearchWidget.vue

@@ -37,7 +37,7 @@
         <!-- <info
           ref="info"
           :field-value="fieldValue"
-          :where-clause="whereClause"
+          :where-clause-source="whereClauseSource"
           :is-search-widget="true"
           :model-data="modelData"
           @data-selected="dataSelected"
@@ -51,7 +51,7 @@
     <SearchAutoCompleteWidget
       ref="autoComplete"
       :info-window-no="infoWindowNo"
-      :where-clause="whereClause"
+      :where-clause-source="whereClauseSource"
       class="auto-complete"
       @select-data="dataSelected"
     />
@@ -85,7 +85,7 @@ export default {
   // }
   // titleName: 弹出窗口的标题
   // displayName: 文本框中显示的字段
-  // whereClause: 约束条件
+  // whereClauseSource: 约束条件
 
   props: {
     'infoWindowNo':{
@@ -104,8 +104,8 @@ export default {
       type: String,
       default: null,
     },
-    'whereClause':{
-      type: String,
+    'whereClauseSource':{
+      type: Object,
       default: null,
     },
     'readonly': {
@@ -177,7 +177,7 @@ export default {
     },
 
     // 查询条件变化时,重新查询数据
-    whereClause: function () {
+    whereClauseSource: function () {
       this.$refs.info.loadByInfoWindowNo(this.infoWindowNo);
     },
   },

+ 19 - 42
packages/process/src/MultiSearchWidget.vue

@@ -243,9 +243,9 @@ export default {
     },
 
     /**
-                 * 查询InfoWindowDto
-                 * @return {void} 
-                 */
+     * 查询InfoWindowDto
+     * @return {void} 
+     */
     getInfoWindowDto: function () {
       var _self = this;
       $.ajax({
@@ -265,43 +265,20 @@ export default {
       });
     },
 
-    /**
-                 * 生成查询条件
-                 * @param  {String} text 查询条件
-                 * @return {Array}      
-                 */
-    getSimpleQueryCondition: function (text) {
-      var _self = this;
-      var values = [];
-      if (_self.infoWindowDto.infoFilterFields != undefined) {
-        _self.infoWindowDto.infoFilterFields.forEach(function (item) {
-          if (item.displayType == 'TextEditor') {
-            var value = {
-              infoFilterFieldId: item.id,
-              value1: text,
-            };
-            values.push(value);
-          }
-        });
-      }
-      return values;
-    },
 
     /**
-                 * 查询infoWindowData
-                 * @return {void} 
-                 */
+     * 查询infoWindowData
+     * @return {void} 
+     */
     getInfoWindowData: function (text) {
       var _self = this;
 
-      var infoFilterFieldValues = _self.getSimpleQueryCondition(text);
-
       var infoQueryParam = {
         infoWindowNo: _self.infoWindowNo,
         start: 0,
         length: 5,
         sortClause: '',
-        infoFilterFieldValues: infoFilterFieldValues,
+        condition: text,
       };
 
       $.ajax({
@@ -323,9 +300,9 @@ export default {
     },
 
     /**
-                 * 选择数据(自动提示框)
-                 * @return {void} 
-                 */
+     * 选择数据(自动提示框)
+     * @return {void} 
+     */
     selectNode: function (data) {
       var _self = this;
       _self.isShowAuto = false;
@@ -377,15 +354,15 @@ export default {
 
 
       /*var selectDataIds = [];
-                        _self.selectDatas.forEach(function(item){
-                            selectDataIds.push(item.id);
-                        })
-            
-                        var newFieldValue = {
-                            displayValue: selectDataIds,
-                            fieldType: 'MultiSearchBoxEditor'
-                        }
-                        this.$emit("valueChanged", newFieldValue);*/
+        _self.selectDatas.forEach(function(item){
+            selectDataIds.push(item.id);
+        })
+
+        var newFieldValue = {
+            displayValue: selectDataIds,
+            fieldType: 'MultiSearchBoxEditor'
+        }
+        this.$emit("valueChanged", newFieldValue);*/
 
       _self.getSelectDataIds();
       this.$emit('getData', data);

+ 3 - 4
packages/process/src/ProcessReportDynamic.vue

@@ -80,7 +80,8 @@
 
             <MultiSearchWidget
               v-if="item.displayType =='MultiSearchBoxEditor'"
-              :info-window-no="item.infoWindowNo"
+              :info-window-no="item.infoWindowNo"              
+              :where-clause-source="{'processReportParameter': {'processReportNo': processReportDto.no, 'fieldName': item.fieldName}}"
               :field="item"
               :field-value="item.fieldValue"
               class="m-input-group"
@@ -89,7 +90,7 @@
 
             <SearchWidget
               v-if="item.displayType =='SearchBoxEditor'"
-              :where-clause="item.whereClause"
+              :where-clause-source="{'processReportParameter': {'processReportNo': processReportDto.no, 'fieldName': item.fieldName}}"
               :info-window-no="item.infoWindowNo"
               :field="item"
               :field-value="item.fieldValue"
@@ -244,7 +245,6 @@ export default {
               'sortNo': item.sortNo,
               'isShow': item.isShow,
               'constraintEnum': item.constraintEnum,
-              'whereClause': item.whereClause,
               'enumClass': item.enumClass,
               'fieldValue': {
                 'id': '',
@@ -369,7 +369,6 @@ export default {
         'sortNo': parameter.sortNo,
         'isShow': parameter.isShow,
         'constraintEnum': parameter.constraintEnum,
-        'whereClause': parameter.whereClause,
         'enumClass': parameter.enumClass,
         'fieldValue': '',
         'calloutProcessNo': parameter.calloutProcessNo,

+ 4 - 3
packages/process/src/ProcessReportStatic.vue

@@ -83,15 +83,16 @@
 
             <MultiSearchWidget
               v-if="item.displayType =='MultiSearchBoxEditor'"
-              :info-window-no="item.infoWindowNo"
+              :info-window-no="item.infoWindowNo"              
+              :where-clause-source="{'processReportParameter': {'processReportNo': processReportDto.no, 'fieldName': item.fieldName}}"
               :field="item"
               :field-value="item.fieldValue"
               @value-changed="tabValueChanged($event, item)"
             />
 
             <SearchWidget
-              v-if="item.displayType =='SearchBoxEditor'"
-              :where-clause="item.whereClause"
+              v-if="item.displayType =='SearchBoxEditor'"              
+              :where-clause-source="{'processReportParameter': {'processReportNo': processReportDto.no, 'fieldName': item.fieldName}}"
               :info-window-no="item.infoWindowNo"
               :field="item"
               :field-value="item.fieldValue"