瀏覽代碼

立方体重构

rsbi 4 年之前
父節點
當前提交
c2382375bd

+ 19 - 0
src/common/biConfig.js

@@ -67,4 +67,23 @@ export const newGuid = ()=>
       //  guid += "-";
     }
     return guid;    
+}
+//在textarea光标处插入文本
+export const insertText2focus = (obj,str) => {
+	str = str + " ";
+	obj.focus();
+	if (document.selection) {
+		var sel = document.selection.createRange();
+		sel.text = str;
+	} else if (typeof obj.selectionStart == 'number' && typeof obj.selectionEnd == 'number') {
+		var startPos = obj.selectionStart,
+			endPos = obj.selectionEnd,
+			cursorPos = startPos,
+			tmpStr = obj.value;
+		obj.value = tmpStr.substring(0, startPos) + "" + str + tmpStr.substring(endPos, tmpStr.length);
+		cursorPos += str.length;
+		obj.selectionStart = obj.selectionEnd = cursorPos;
+	} else {
+		obj.value += str;
+	}
 }

+ 85 - 3
src/view/model/Cube.vue

@@ -1,5 +1,67 @@
 <template>
-  <div> cube </div>
+  <div>
+    <div class="btn-group optbtncls" role="group">
+      <button
+        type="button"
+        class="btn btn-outline btn-default"
+        title="新增"
+        @click="addCube(false)"
+      >
+        <i class="glyphicon glyphicon-plus" aria-hidden="true"></i>
+      </button>
+      <button
+        type="button"
+        class="btn btn-outline btn-default"
+        title="修改"
+        @click="addCube(true)"
+      >
+        <i class="glyphicon glyphicon-edit" aria-hidden="true"></i>
+      </button>
+      <button
+        type="button"
+        class="btn btn-outline btn-default"
+        title="删除"
+        @click="delCube()"
+      >
+        <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
+      </button>
+    </div>
+    <el-table
+        :data="tableData"
+        @row-click="selectme"
+        border
+        style="width: 100%"
+        header-row-class-name="tableHeadbg"
+      >
+        <el-table-column label="" width="45">
+          <template slot-scope="scope">
+            <el-radio v-model="checked" name="myselect" :label="scope.row.cubeId"
+              >&nbsp;</el-radio
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="cubeId"
+          label="标识"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="cubeName"
+          label="立方体名称"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="desc"
+          label="立方体说明"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="dsetName"
+          label="数据集"
+        ></el-table-column>
+      </el-table>
+  </div>
 </template>
 
 <script>
@@ -11,17 +73,37 @@ export default {
    name: 'cube',
   data() {
     return {
+      tableData:[],
+      checked:null
     }
   },
   components: {
 		
 	},
   mounted() {
-    
+    this.loadData();
   },
   computed: {},
   methods: {
-	 
+	 loadData(){
+      ajax({
+        url:"model/listCube.action",
+        data:{},
+        success:(r)=>{
+          this.tableData = r.rows;
+        }
+      });
+    },
+    selectme(a, b){
+      this.checked = a.cubeId;
+    },
+    addCube(isupdate){
+      let o = this.$parent.$parent.$parent;
+      let oper =  o.$refs['cubeOper'];
+      o.cubeOperTitle = isupdate===false?"创建立方体":"编辑立方体";
+      oper.showDailog();
+      //o.$refs["dsetAddForm"].addDset(isupdate, this.checked);
+    }
   }
 };
 </script>

+ 39 - 0
src/view/model/CubeAdd.vue

@@ -0,0 +1,39 @@
+<template>
+  <div>
+    ccc
+  </div>
+</template>
+
+<script>
+import { baseUrl, ajax } from "@/common/biConfig";
+import operationDailog from '@/components/OperationDailog'
+import $ from "jquery"
+
+export default {
+   name: 'cubeAdd',
+  data() {
+    return {
+      base:{
+        cubeId:null,
+        cubeName:null,
+        desc:null,
+        dsetId:null,
+        dsetName:null
+      }
+    }
+  },
+  components: {
+		
+	},
+  mounted() {
+  },
+  computed: {},
+  methods: {
+
+  }
+};
+</script>
+
+<style lang="less" scoped>
+@import "../../style/mixin";
+</style>

+ 58 - 5
src/view/model/DsetAdd.vue

@@ -1,5 +1,4 @@
 <template>
-  <div>
     <el-form :model="dset" :rules="rules" ref="dsetForm">
       <el-tabs v-model="active" type="card">
         <el-tab-pane label="基本信息" name="base">
@@ -160,10 +159,48 @@
             </el-table-column>
           </el-table>
         </el-tab-pane>
-        <el-tab-pane label="动态字段" name="dyna"> </el-tab-pane>
+        <el-tab-pane label="动态字段" name="dyna">
+          <div style="padding-bottom:10px;">
+          <button class="btn btn-info btn-xs" type="button" @click="crtdyna(false)">创建</button>
+          </div>
+          <el-table
+            :data="dynamic"
+            border
+            height="380"
+            style="width: 100%"
+            header-row-class-name="tableHeadbg"
+          >
+            <el-table-column
+              align="center"
+              prop="name"
+              label="字段名"
+            ></el-table-column>
+            <el-table-column
+              align="center"
+              prop="expression"
+              label="表达式"
+            ></el-table-column>
+            <el-table-column
+              align="center"
+              prop="type"
+              label="类型"
+            ></el-table-column>
+            
+            <el-table-column
+              align="center"
+              prop="idx"
+              label="操作"
+              width="100"
+            >
+              <template slot-scope="scope">
+                  <a class="btn btn-primary btn-xs" @click="crtdyna(true, scope.row.name)"> 编辑 </a>
+                  <a class="btn btn-danger btn-xs" @click="deleteDyna(scope.row.name)"> 删除 </a>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
       </el-tabs>
     </el-form>
-  </div>
 </template>
 
 <script>
@@ -193,7 +230,8 @@ export default {
       active: "base",
       isupdate: false,
       cols: [],
-      joininfo:[]
+      joininfo:[],
+      dynamic:[]  //动态字段
     };
   },
   components: {
@@ -246,6 +284,7 @@ export default {
             name: ts.dset.name,
             dsid: ts.dset.dsid,
             joininfo: [],
+            dynamic: ts.dynamic
           };
           if (!isupdate) {
             json.dsetId = newGuid();
@@ -292,7 +331,7 @@ export default {
                   priTable: json.master,
                   name: json.name,
                   dsid: json.dsid,
-                  dsetId: json.dsetId,
+                  dsetId: json.dsetId
                 },
                 success: function (resp) {
                   ts.$parent.$parent.$refs["dsetGrid"].loadData();
@@ -372,6 +411,7 @@ export default {
       if (isupdate) {
         this.cols = ds.cols;
         this.joininfo = ds.joininfo;
+        this.dynamic = ds.dynamic?ds.dynamic:[];
       }
       this.active = "base";
       if (isupdate) {
@@ -615,6 +655,19 @@ export default {
     },
     modifyCol(col, tname){
       this.$parent.$parent.$refs['colModifyForm'].modify(col, tname, this.cols, this.joininfo, this.dset.master);
+    },
+    crtdyna(isupdate, col){
+      this.$parent.$parent.$refs['dynaColForm'].createDyna(isupdate, col, this.cols, this.dynamic, this.dset.master);
+    },
+    deleteDyna(col){
+      if(confirm("是否确认?")){
+        this.dynamic.forEach((e,i)=>{
+          if(e.name === col){
+            this.dynamic.splice(i, 1);
+            return false;
+          }
+        });
+      }
     }
   },
 };

+ 1 - 1
src/view/model/DsetColModify.vue

@@ -7,7 +7,7 @@
          <el-form-item label="显示名" label-width="100px">
             <el-input v-model="col.dispName"></el-input>
           </el-form-item>
-          <el-form-item label="字段类型" label-width="100px" prop="linkType">
+          <el-form-item label="字段类型" label-width="100px">
             <el-select v-model="col.type" placeholder="请选择">
               <el-option
                 v-for="item in opts.types"

+ 129 - 3
src/view/model/DsetDynaCol.vue

@@ -1,15 +1,73 @@
 <template>
-  <div> dynacol </div>
+  <el-dialog title="创建表达式(主表)" :visible.sync="show">
+    <el-form :model="dyna" ref="dynaForm" :rules="rule">
+         <el-form-item label="字段名" label-width="100px" prop="name">
+          <el-input v-model="dyna.name" placeholder="英文字符" id="dynaName"></el-input>
+          </el-form-item>
+         <el-form-item label="表达式" label-width="100px" prop="expression">
+            <el-input id="mybds" type="textarea" v-model="dyna.expression"></el-input>
+          </el-form-item>
+          <div style="line-height:25px;">
+          <template v-for="c in cols">
+              <button @click="selectCol(c.name)" style="margin-right:5px;" type="button" :key="c.name" :name="c.name" class="btn btn-primary btn-xs">{{ c.name }}</button>
+          </template>
+          </div>
+          <el-form-item label="字段类型" label-width="100px" prop="type">
+            <el-select v-model="dyna.type" placeholder="请选择">
+              <el-option
+                v-for="item in opts.types"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="save()">确 定</el-button>
+      <el-button @click="show = false">取 消</el-button>
+    </div>
+  </el-dialog>
 </template>
 
 <script>
-import { baseUrl, ajax } from "@/common/biConfig";
+import { baseUrl, ajax, insertText2focus } from "@/common/biConfig";
 import $ from "jquery"
 
 export default {
    name: 'dynaCol',
   data() {
     return {
+      show:false,
+      dyna:{
+        name:"",
+        tname:"",
+        type:"",
+        expression:""
+      },
+      rule:{
+        name: [{ required: true, message: "必填", trigger: "blur" }],
+        expression: [{ required: true, message: "必填", trigger: "blur" }],
+        type: [{ required: true, message: "必填", trigger: "blur" }]
+      },
+      opts:{
+        types:[{
+          value:"String",label:"String"
+        },{
+          value:"Int",label:"Int"
+        },{
+          value:"Double",label:"Double"
+        },{
+          value:"Date",label:"Date"
+        },{
+          value:"Datetime",label:"Datetime"
+        }]
+      },
+      cols:[],
+      dynaCols:[],
+      master:"",
+      isupdate:false
     }
   },
   components: {
@@ -20,7 +78,75 @@ export default {
   },
   computed: {},
   methods: {
-	 
+	 createDyna(isupdate, col, cols, dynaCols, master){
+     let ts = this;
+     this.show = true;
+     if(this.$refs['dynaForm']){
+        this.$refs['dynaForm'].resetFields();
+     }
+     //动态字段只显示主表字段
+     this.cols = [];
+     cols.forEach(e => {
+       if(e.tname === master){
+         ts.cols.push(e);
+       }
+     });
+     this.dynaCols = dynaCols;
+     this.master = master;
+     this.isupdate = isupdate;
+     if(isupdate){
+       setTimeout(()=>$("#dynaName").prop("readOnly","true"), 200); 
+       $(dynaCols).each((a, b)=>{
+         if(b.name === col){
+           ts.dyna = b;
+           ts.dyna.name = b.name;
+           ts.dyna.type = b.type;
+           ts.dyna.expression = b.expression;
+           return false;
+         }
+       });
+     }else{
+       ts.dyna= {name:"", type:"", expression:""};
+       setTimeout(()=>{
+         $("#dynaName").prop("readOnly","")
+       }, 200); 
+     }
+   },
+   save(){
+     let ts = this;
+     this.$refs['dynaForm'].validate(v=>{
+       if(v){
+         if(this.ischinese(ts.dyna.name)){
+           ts.$notify.error("字段名必须是英文字符。");
+           return;
+         }
+         if(ts.isupdate){
+           $(ts.dynaCols).each((a, b)=>{
+            if(b.name === ts.dyna.name){
+              b.name = ts.dyna.name;
+              b.type = ts.dyna.type;
+              b.expression = ts.dyna.expression;
+              return false;
+            }
+          });
+         }else{
+          this.dynaCols.push({name:ts.dyna.name, tname:ts.master,type:ts.dyna.type,expression:ts.dyna.expression});
+         }
+          this.show = false;
+       }
+     });
+    
+   },
+   selectCol(v){
+     insertText2focus(document.getElementById("mybds"), v);
+   },
+   ischinese(a){
+      if (/[\u4E00-\u9FA5]/i.test(a)) {
+        return true;  
+      }else{    
+        return false 
+      }
+    }
   }
 };
 </script>

+ 12 - 3
src/view/model/Index.vue

@@ -27,6 +27,10 @@
     <dsetTableJoin ref="tableJoinForm"></dsetTableJoin>
     <dsetColModify ref="colModifyForm"></dsetColModify>
     <dynaCol ref="dynaColForm"></dynaCol>
+
+    <operationDailog mainDiv="mainDiv" :title="cubeOperTitle" ref="cubeOper" :callback="saveCube">
+      <cubeAdd ref="cubeForm"></cubeAdd>
+    </operationDailog>
   </div>
 </template>
 
@@ -41,13 +45,14 @@ import dsetAdd from "@/view/model/DsetAdd";
 import dsetTableJoin from "@/view/model/DsetTableJoin";
 import dsetColModify from "@/view/model/DsetColModify";
 import dynaCol from "@/view/model/DsetDynaCol";
+import cubeAdd from "@/view/model/CubeAdd";
 
 export default {
   name:"modelIndex",
   data() {
     return {
-      dsetOperTitle:""
-
+      dsetOperTitle:"",
+      cubeOperTitle:""
     };
   },
   components: {
@@ -58,7 +63,8 @@ export default {
     dsetAdd,
     dsetTableJoin,
     dsetColModify,
-    dynaCol
+    dynaCol,
+    cubeAdd
   },
   mounted() {},
   computed: {},
@@ -75,6 +81,9 @@ export default {
       let update = this.$refs['dsetGrid'].isupdate;
       return this.$refs['dsetAddForm'].saveDset(update);
     },
+    saveCube(){
+      alert(1);
+    }
   },
   watch: {},
 };