Browse Source

first commit

sugb 8 months ago
commit
4209b27e6a
100 changed files with 24224 additions and 0 deletions
  1. 23 0
      .dockerignore
  2. 39 0
      .editorconfig
  3. 3 0
      .env
  4. 4 0
      .env.development
  5. 4 0
      .env.production
  6. 4 0
      .env.test
  7. 1 0
      .eslintignore
  8. 1 0
      .gitattributes
  9. 21 0
      .gitignore
  10. 5 0
      .prettierrc
  11. 1 0
      .svn/entries
  12. 1 0
      .svn/format
  13. 35 0
      .svn/pristine/00/0002df5f9dd67510e74926f5c4ff1a795ef81ad0.svn-base
  14. 310 0
      .svn/pristine/00/00fa05a3b51121ac09349e37935b5365cdb270a2.svn-base
  15. 60 0
      .svn/pristine/01/012f37e06908e1503737911d09a11cf5b536a4fd.svn-base
  16. 200 0
      .svn/pristine/01/015dec20b468c7027dc15b8a9d4a55547592a5aa.svn-base
  17. 220 0
      .svn/pristine/01/017ff0297da6c7b3236314dac2acb57a8200637f.svn-base
  18. 696 0
      .svn/pristine/01/01902151a8c8b5015cb2ce3d87ff4a151a0ae60f.svn-base
  19. 60 0
      .svn/pristine/02/021dced811ea26636800b487d941dd723987b247.svn-base
  20. 512 0
      .svn/pristine/03/03c3c71f1aad05f593fc36d13670a8fd903af880.svn-base
  21. 238 0
      .svn/pristine/04/0481f6a3eb9388b0298418fa39904118d0784db2.svn-base
  22. 122 0
      .svn/pristine/04/049f467174104d8be8d2741cea3d4c9f1fd56c9d.svn-base
  23. 246 0
      .svn/pristine/04/04c8839af57c04f8969e2a3a6afb69eae1161d3e.svn-base
  24. 2159 0
      .svn/pristine/05/056a4b65377cfa6e5a5b393939fe1f34bd6a0279.svn-base
  25. 180 0
      .svn/pristine/05/056e2acaa77d91fb44794ee2a42045a51f2d0944.svn-base
  26. 281 0
      .svn/pristine/05/05bf65c6708478c544595c996048d04d5adad5fb.svn-base
  27. BIN
      .svn/pristine/05/05da0700774afe0d25b0e4437e1fd8f1b0a99c4a.svn-base
  28. 28 0
      .svn/pristine/05/05f76ee0d71ed6c3594a8f9df4490402c166d866.svn-base
  29. 147 0
      .svn/pristine/06/06263dceafb3969b4e4a01e983b3a43661ea40cb.svn-base
  30. 84 0
      .svn/pristine/06/069e7ab8fb6b0318e9aaa519293de2d8808c4037.svn-base
  31. 137 0
      .svn/pristine/07/0726a481f3bbb8673312e627943e929329e839a1.svn-base
  32. 10 0
      .svn/pristine/07/0728422c4490323a307deb4ec594feb408ef5699.svn-base
  33. 128 0
      .svn/pristine/07/074bf6a554e321b421458ce694ea530001d75b66.svn-base
  34. 35 0
      .svn/pristine/07/074d21d9955a167ce9d2fa4bffd165f2e9d1bd02.svn-base
  35. 12 0
      .svn/pristine/07/07560f287bfe2a2a158cd1933a22d1224c13e6d0.svn-base
  36. 24 0
      .svn/pristine/08/0861c7777a35128b0a3353d6132abe4a103f4ef0.svn-base
  37. 246 0
      .svn/pristine/08/08c6731efc7221fbc2557612030fa258240c2138.svn-base
  38. 423 0
      .svn/pristine/08/08d179dd4c373efdaaeb7c0e49dadd0d6e934a9c.svn-base
  39. 192 0
      .svn/pristine/08/08f4f0f3e754f3fc0162eda71bf0b4def648127e.svn-base
  40. BIN
      .svn/pristine/09/091455cdc6f194a4489f195ec445491e245c449f.svn-base
  41. 19 0
      .svn/pristine/09/09985e4ccde8ff8b5b933dc427fb821545035013.svn-base
  42. 559 0
      .svn/pristine/09/0999385bdfde902516210fc804e368375f22f762.svn-base
  43. 49 0
      .svn/pristine/09/099ff37e45457e6f9834ac069c7bc98e44c5a5a4.svn-base
  44. 59 0
      .svn/pristine/09/09e205ef68adef95e9935160fad2f2ee92b3ee10.svn-base
  45. 182 0
      .svn/pristine/0a/0a05c8cc87d9349a35536878cbe47d4834e7e67c.svn-base
  46. 285 0
      .svn/pristine/0a/0a4d9c2d5fc7b69160e2530b47b8095eadd7fabf.svn-base
  47. 123 0
      .svn/pristine/0b/0b33348dc03e390f6dd6e3cffcbafd0d572b715a.svn-base
  48. 84 0
      .svn/pristine/0b/0b3870c71d399f23d73eada7fa0e54ed1b76bba4.svn-base
  49. 325 0
      .svn/pristine/0b/0b699409959c1a3a9e992bd40fa5ce3302e4582d.svn-base
  50. 220 0
      .svn/pristine/0c/0c5a19c28252a41c94454c99ce21245b7a830893.svn-base
  51. 623 0
      .svn/pristine/0c/0c6e2a5a7bdfce32227ea50464d4b826cd50cb58.svn-base
  52. 110 0
      .svn/pristine/0d/0d6673bf2784b1438584ac143e7750ab434e4dcc.svn-base
  53. 103 0
      .svn/pristine/0d/0d66f409a972a7bbaaffc33242d6865881a2aef4.svn-base
  54. 60 0
      .svn/pristine/0d/0de3463a7ccc561c64550b2493afef0412bcfc01.svn-base
  55. 162 0
      .svn/pristine/0d/0de50984826d71b4eeb3165b9e6d585496e51e86.svn-base
  56. 136 0
      .svn/pristine/0e/0e1a6e6fda09d38a50a2222cc57c22661cca85c0.svn-base
  57. 123 0
      .svn/pristine/0e/0e45702626a54c1b69afc5e14494dc7017ca5a1e.svn-base
  58. 101 0
      .svn/pristine/0e/0e6f13de28d50bfecab5a70b4be45bb50fb2a2f2.svn-base
  59. 425 0
      .svn/pristine/0e/0ea9a36275b9a6327c00e6df29af58fe713d12f8.svn-base
  60. 164 0
      .svn/pristine/0f/0f085b39194988c0e27888a8be77566119959130.svn-base
  61. 289 0
      .svn/pristine/0f/0f787dbfd811fd604dfb31513e7a417d2d85205d.svn-base
  62. 67 0
      .svn/pristine/0f/0fc6b26a3b674d59327371bcb796334fce68635b.svn-base
  63. 288 0
      .svn/pristine/10/100d729eb43efe5488b3c8d955b0611aeb386af2.svn-base
  64. 41 0
      .svn/pristine/10/1018cfbfea91d2dbb5bedd9a587a7beddcd8d83b.svn-base
  65. BIN
      .svn/pristine/11/112f3023fb56d82571a0d71a6d16ce7d0c0d822a.svn-base
  66. 23 0
      .svn/pristine/11/1131f881b49bd4cb746dfcc1d55e45bac52d4b8b.svn-base
  67. 134 0
      .svn/pristine/11/1192b3789a17616ab1bbd962f7fbbbd5a0d6aab8.svn-base
  68. 63 0
      .svn/pristine/11/11a3b6fa0f9ce3cae83723f2b1a3d712d8451da6.svn-base
  69. 175 0
      .svn/pristine/12/1216105a3ad3c92e9f58e88e4d55f354a049c199.svn-base
  70. 189 0
      .svn/pristine/12/1250c1bb2f00c666a090d1cc086b2c0640aefe95.svn-base
  71. 239 0
      .svn/pristine/12/12ad7564160d3a48fbb3d2cda843ae25bddb5cdf.svn-base
  72. 192 0
      .svn/pristine/12/12e991e4b75a7e5bad3dd1d072cb2c6e7c435f7c.svn-base
  73. 225 0
      .svn/pristine/13/1380280f667590c36863f94f5b964cbe162b22c8.svn-base
  74. 225 0
      .svn/pristine/13/13c28174e7a88b43d075228334444f3c75105fb2.svn-base
  75. 84 0
      .svn/pristine/14/14120cfd0ec6de98dc95be6c3ce95cb73e7824a1.svn-base
  76. 381 0
      .svn/pristine/14/142b6acc41e22fa9322372386d31c563bb4947ea.svn-base
  77. BIN
      .svn/pristine/14/1442f4ed0e0f725cf0d07de40ecb03bba455da75.svn-base
  78. 680 0
      .svn/pristine/14/14b92be3430b9ae5b9699e8f023100e0d2a58b9b.svn-base
  79. 160 0
      .svn/pristine/15/150a39e0719a03475d7512168ef8b89e2b3c1c91.svn-base
  80. 262 0
      .svn/pristine/15/15e89cb84138cde35593acabb3241eb6f3cf4399.svn-base
  81. 84 0
      .svn/pristine/16/163330ceb294af8c61d3f0e8b6fea7d68ec2fb0c.svn-base
  82. 193 0
      .svn/pristine/16/165275bc46d5a295ed73b2913fde567b22657fce.svn-base
  83. 67 0
      .svn/pristine/16/16aaa8b0cdd6ba08934afae6bc3d21d26c71ef0c.svn-base
  84. 84 0
      .svn/pristine/16/16b641301e3cdffc7ade2468ba8ce639a7c9149d.svn-base
  85. 443 0
      .svn/pristine/17/176c1ae86c1c96bcad0623774f09d780cba536fc.svn-base
  86. 45 0
      .svn/pristine/17/17a352473ee6dcdb14f101531a3166125a058479.svn-base
  87. 345 0
      .svn/pristine/17/17b2d27f3ad97cb10330f0105fb34847795dfdd3.svn-base
  88. 109 0
      .svn/pristine/17/17ca04fc799195fe73b1a7444fd0f1d1c5d29dd0.svn-base
  89. 6003 0
      .svn/pristine/18/18035d2319d076299959b31ece20c3f1eb7c73d7.svn-base
  90. 198 0
      .svn/pristine/18/186c34c1f302b5dc42cdf39ba294ff26239054ac.svn-base
  91. 245 0
      .svn/pristine/18/18c7fd9d7f624c514e96215ff131c4f44aa48d51.svn-base
  92. 680 0
      .svn/pristine/19/1940e732287fdc5afc5a58c3b3f15194f437c84d.svn-base
  93. BIN
      .svn/pristine/19/1972ebd7aeb8456462a7bd3eba1bc28b7e90da44.svn-base
  94. 330 0
      .svn/pristine/19/197eae42ddc7310463e7ee69466e74fa7f92d1f1.svn-base
  95. 68 0
      .svn/pristine/19/199290874dd4be611848fa2256846d6e671e14a2.svn-base
  96. 132 0
      .svn/pristine/1a/1a1840ed24f77af2d1d6316edc1745d166721a00.svn-base
  97. 122 0
      .svn/pristine/1a/1a24000e1ea1155476e5e27261417b4abf665db4.svn-base
  98. 238 0
      .svn/pristine/1a/1a358fb3820e2613853990c4cb3599b57717ba46.svn-base
  99. 81 0
      .svn/pristine/1a/1a793458a0d293e15bb07d5058992d1d34f7303e.svn-base
  100. 236 0
      .svn/pristine/1a/1a837b7eadd3bcdef4a853f1dc4caaee00563981.svn-base

+ 23 - 0
.dockerignore

@@ -0,0 +1,23 @@
+docs
+public
+src
+.dockerignore
+.editorconfig
+.eslintignore
+.gitattributes
+.gitignore
+.prettierrc
+babel.config.js
+Dockerfile
+idea.config.js
+LICENSE
+package.json
+package-lock.json
+README.md
+vue.config.js
+yarn
+yarn.lock
+yarn-error.log
+.idea
+.svn
+node_modules

+ 39 - 0
.editorconfig

@@ -0,0 +1,39 @@
+[*]
+charset=utf-8
+end_of_line=crlf
+insert_final_newline=false
+indent_style=space
+indent_size=2
+
+[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
+indent_style=space
+indent_size=2
+
+[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
+indent_style=space
+indent_size=2
+
+[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}]
+indent_style=space
+indent_size=2
+
+[*.svg]
+indent_style=space
+indent_size=2
+
+[*.js.map]
+indent_style=space
+indent_size=2
+
+[*.less]
+indent_style=space
+indent_size=2
+
+[*.vue]
+indent_style=space
+indent_size=2
+
+[{.analysis_options,*.yml,*.yaml}]
+indent_style=space
+indent_size=2
+

+ 3 - 0
.env

@@ -0,0 +1,3 @@
+NODE_ENV=production
+VUE_APP_PLATFORM_NAME=德州市河湖岸线规划监管平台
+VUE_APP_SSO=false

+ 4 - 0
.env.development

@@ -0,0 +1,4 @@
+NODE_ENV=development
+VUE_APP_API_BASE_URL=http://localhost:8082/jeecg-boot
+VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas
+VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview

+ 4 - 0
.env.production

@@ -0,0 +1,4 @@
+NODE_ENV=production
+VUE_APP_API_BASE_URL=http://222.133.41.37:9212/jeecg-boot
+VUE_APP_CAS_BASE_URL=http://211.159.225.204:8888/cas
+VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview

+ 4 - 0
.env.test

@@ -0,0 +1,4 @@
+NODE_ENV=production
+VUE_APP_API_BASE_URL=http://boot.jeecg.com:8080/jeecg-boot
+VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas
+VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview

+ 1 - 0
.eslintignore

@@ -0,0 +1 @@
+/src

+ 1 - 0
.gitattributes

@@ -0,0 +1 @@
+public/* linguist-vendored

+ 21 - 0
.gitignore

@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*

+ 5 - 0
.prettierrc

@@ -0,0 +1,5 @@
+{
+  "printWidth": 120,
+  "semi": false,
+  "singleQuote": true
+}

+ 1 - 0
.svn/entries

@@ -0,0 +1 @@
+12

+ 1 - 0
.svn/format

@@ -0,0 +1 @@
+12

+ 35 - 0
.svn/pristine/00/0002df5f9dd67510e74926f5c4ff1a795ef81ad0.svn-base

@@ -0,0 +1,35 @@
+
+.config-list {
+  text-align: left;
+  margin: 0 10px 10px 10px;
+}
+
+.item {
+  margin-top: 5px;
+}
+
+.choice {
+  padding: 5px 8px;
+}
+
+
+.w60 {
+  width: 60px;
+}
+.w80 {
+  width: 80px;
+}
+
+.list {
+  margin: 0 20px;
+}
+
+.list-check-item {
+  padding: 1px 3px;
+  width: 4em;
+}
+
+.tip-info {
+  color: #999
+}
+

+ 310 - 0
.svn/pristine/00/00fa05a3b51121ac09349e37935b5365cdb270a2.svn-base

@@ -0,0 +1,310 @@
+<template>
+  <j-modal
+    title="选择部门"
+    :width="modalWidth"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleSubmit"
+    @cancel="handleCancel"
+    @update:fullscreen="isFullscreen"
+    wrapClassName="j-depart-select-modal"
+    switchFullscreen
+    cancelText="关闭">
+    <a-spin tip="Loading..." :spinning="false">
+      <a-input-search style="margin-bottom: 1px" placeholder="请输入部门名称按回车进行搜索" @search="onSearch" />
+      <a-tree
+        checkable
+        :class="treeScreenClass"
+        :treeData="treeData"
+        :checkStrictly="checkStrictly"
+        @check="onCheck"
+        @select="onSelect"
+        @expand="onExpand"
+        :autoExpandParent="autoExpandParent"
+        :expandedKeys="expandedKeys"
+        :checkedKeys="checkedKeys">
+
+        <template slot="title" slot-scope="{title}">
+          <span v-if="title.indexOf(searchValue) > -1">
+            {{title.substr(0, title.indexOf(searchValue))}}
+            <span style="color: #f50">{{searchValue}}</span>
+            {{title.substr(title.indexOf(searchValue) + searchValue.length)}}
+          </span>
+          <span v-else>{{title}}</span>
+        </template>
+      </a-tree>
+    </a-spin>
+    <!--底部父子关联操作和确认取消按钮-->
+    <template slot="footer" v-if="treeOpera && multi">
+      <div class="drawer-bootom-button">
+        <a-dropdown style="float: left" :trigger="['click']" placement="topCenter">
+          <a-menu slot="overlay">
+            <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
+            <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
+          </a-menu>
+          <a-button>
+            树操作 <a-icon type="up" />
+          </a-button>
+        </a-dropdown>
+        <a-button @click="handleCancel" type="primary" style="margin-right: 0.8rem">关闭</a-button>
+        <a-button @click="handleSubmit" type="primary" >确认</a-button>
+      </div>
+    </template>
+  </j-modal>
+</template>
+
+<script>
+  import { queryDepartTreeList } from '@/api/api'
+  export default {
+    name: 'JSelectDepartModal',
+    props:['modalWidth','multi','rootOpened','departId', 'store', 'text','treeOpera'],
+    data(){
+      return {
+        visible:false,
+        confirmLoading:false,
+        treeData:[],
+        autoExpandParent:true,
+        expandedKeys:[],
+        dataList:[],
+        checkedKeys:[],
+        checkedRows:[],
+        searchValue:"",
+        checkStrictly: true,
+        fullscreen:false
+      }
+    },
+    created(){
+      this.loadDepart();
+    },
+    watch:{
+      departId(){
+        this.initDepartComponent()
+      },
+      visible: {
+        handler() {
+          this.initDepartComponent(true)
+        }
+      }
+    },
+    computed:{
+      treeScreenClass() {
+        return {
+          'my-dept-select-tree': true,
+          'fullscreen': this.fullscreen,
+        }
+      },
+    },
+    methods:{
+      show(){
+        this.visible=true
+        this.checkedRows=[]
+        this.checkedKeys=[]
+      },
+      loadDepart(){
+        // 这个方法是找到所有的部门信息
+        queryDepartTreeList().then(res=>{
+          if(res.success){
+            let arr = [...res.result]
+            this.reWriterWithSlot(arr)
+            this.treeData = arr
+            this.initDepartComponent()
+            if(this.rootOpened){
+              this.initExpandedKeys(res.result)
+            }
+          }
+        })
+      },
+      initDepartComponent(flag){
+        let arr = []
+        //该方法两个地方用 1.visible改变事件重新设置选中项 2.组件编辑页面回显
+        let fieldName = flag==true?'key':this.text
+        if(this.departId){
+          let arr2 = this.departId.split(',')
+          for(let item of this.dataList){
+            if(arr2.indexOf(item[this.store])>=0){
+              arr.push(item[fieldName])
+            }
+          }
+        }
+        if(flag==true){
+          this.checkedKeys = [...arr]
+        }else{
+          this.$emit("initComp", arr.join(','))
+        }
+      },
+      reWriterWithSlot(arr){
+        for(let item of arr){
+          if(item.children && item.children.length>0){
+            this.reWriterWithSlot(item.children)
+            let temp = Object.assign({},item)
+            temp.children = {}
+            this.dataList.push(temp)
+          }else{
+            this.dataList.push(item)
+            item.scopedSlots={ title: 'title' }
+          }
+        }
+      },
+      initExpandedKeys(arr){
+        if(arr && arr.length>0){
+          let keys = []
+          for(let item of arr){
+            if(item.children && item.children.length>0){
+              keys.push(item.id)
+            }
+          }
+          this.expandedKeys=[...keys]
+          //全部keys
+          //this.allTreeKeys = [...keys]
+        }else{
+          this.expandedKeys=[]
+          //this.allTreeKeys = []
+        }
+      },
+      onCheck (checkedKeys,info) {
+        if(!this.multi){
+          let arr = checkedKeys.checked.filter(item => this.checkedKeys.indexOf(item) < 0)
+          this.checkedKeys = [...arr]
+          this.checkedRows = (this.checkedKeys.length === 0) ? [] : [info.node.dataRef]
+        }else{
+          if(this.checkStrictly){
+            this.checkedKeys = checkedKeys.checked
+          }else{
+            this.checkedKeys = checkedKeys
+          }
+          this.checkedRows = this.getCheckedRows(this.checkedKeys)
+        }
+      },
+      onSelect(selectedKeys,info) {
+        //取消关联的情况下才走onSelect的逻辑
+        if(this.checkStrictly){
+          let keys = []
+          keys.push(selectedKeys[0])
+          if(!this.checkedKeys || this.checkedKeys.length===0 || !this.multi){
+            this.checkedKeys = [...keys]
+            this.checkedRows=[info.node.dataRef]
+          }else{
+            let currKey = info.node.dataRef.key
+            if(this.checkedKeys.indexOf(currKey)>=0){
+              this.checkedKeys = this.checkedKeys.filter(item=> item !==currKey)
+            }else{
+              this.checkedKeys.push(...keys)
+            }
+          }
+          this.checkedRows = this.getCheckedRows(this.checkedKeys)
+        }
+      },
+      onExpand (expandedKeys) {
+        this.expandedKeys = expandedKeys
+        this.autoExpandParent = false
+      },
+      handleSubmit(){
+        if(!this.checkedKeys || this.checkedKeys.length==0){
+          this.$emit("ok",'')
+        }else{
+          let checkRow = this.getCheckedRows(this.checkedKeys)
+          let keyStr = this.checkedKeys.join(",")
+          this.$emit("ok", checkRow, keyStr)
+        }
+        this.handleClear()
+      },
+      handleCancel(){
+        this.handleClear()
+      },
+      handleClear(){
+        this.visible=false
+        this.checkedKeys=[]
+      },
+      getParentKey(currKey,treeData){
+        let parentKey
+        for (let i = 0; i < treeData.length; i++) {
+          const node = treeData[i]
+          if (node.children) {
+            if (node.children.some(item => item.key === currKey)) {
+              parentKey = node.key
+            } else if (this.getParentKey(currKey, node.children)) {
+              parentKey = this.getParentKey(currKey, node.children)
+            }
+          }
+        }
+        return parentKey
+      },
+      onSearch(value){
+        const expandedKeys = this.dataList.map((item) => {
+          if (item.title.indexOf(value) > -1) {
+            return this.getParentKey(item.key,this.treeData)
+          }
+          return null
+        }).filter((item, i, self) => item && self.indexOf(item) === i)
+
+        Object.assign(this, {
+          expandedKeys,
+          searchValue: value,
+          autoExpandParent: true,
+        })
+
+
+      },
+      // 根据 checkedKeys 获取 rows
+      getCheckedRows(checkedKeys) {
+        const forChildren = (list, key) => {
+          for (let item of list) {
+            if (item.id === key) {
+              return item
+            }
+            if (item.children instanceof Array) {
+              let value = forChildren(item.children, key)
+              if (value != null) {
+                return value
+              }
+            }
+          }
+          return null
+        }
+
+        let rows = []
+        for (let key of checkedKeys) {
+          let row = forChildren(this.treeData, key)
+          if (row != null) {
+            rows.push(row)
+          }
+        }
+        return rows
+      },
+      switchCheckStrictly (v) {
+        if(v==1){
+          this.checkStrictly = false
+        }else if(v==2){
+          this.checkStrictly = true
+        }
+      },
+      isFullscreen(val){
+        this.fullscreen=val
+      }
+    }
+  }
+
+</script>
+
+<style lang="less" scoped>
+  // 限制部门选择树高度,避免部门太多时点击确定不便
+  .my-dept-select-tree{
+    height:350px;
+    
+    &.fullscreen{
+      height: calc(100vh - 250px);
+    }
+    overflow-y: scroll;
+  }
+  .drawer-bootom-button {
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 60 - 0
.svn/pristine/01/012f37e06908e1503737911d09a11cf5b536a4fd.svn-base

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <rm-ggpgeo-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></rm-ggpgeo-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import RmGgpgeoForm from './RmGgpgeoForm'
+  export default {
+    name: 'RmGgpgeoModal',
+    components: {
+      RmGgpgeoForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 200 - 0
.svn/pristine/01/015dec20b468c7027dc15b8a9d4a55547592a5aa.svn-base

@@ -0,0 +1,200 @@
+<template>
+  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" v-if="mainId">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('信息采集明细表')">导出</a-button>
+      <a-upload
+        name="file"
+        :showUploadList="false"
+        :multiple="false"
+        :headers="tokenHeader"
+        :action="importExcelUrl"
+        @change="handleImportExcel">
+          <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+
+      </a-table>
+    </div>
+
+    <rmCjxxmx-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></rmCjxxmx-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmCjxxmxModal from './modules/RmCjxxmxModal'
+
+  export default {
+    name: "RmCjxxmxList",
+    mixins:[JeecgListMixin],
+    components: { RmCjxxmxModal },
+    props:{
+      mainId:{
+        type:String,
+        default:'',
+        required:false
+      }
+    },
+    watch:{
+      mainId:{
+        immediate: true,
+        handler(val) {
+          if(!this.mainId){
+            this.clearList()
+          }else{
+            this.queryParam['cjid'] = val
+            this.loadData(1);
+          }
+        }
+      }
+    },
+    data () {
+      return {
+        description: '外业信息采集管理页面',
+        disableMixinCreated:true,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'经度',
+            align:"center",
+            dataIndex: 'jd'
+          },
+          {
+            title:'纬度',
+            align:"center",
+            dataIndex: 'wd'
+          },
+          {
+            title:'照片',
+            align:"center",
+            dataIndex: 'zp',
+            scopedSlots: {customRender: 'imgSlot'}
+          },
+          {
+            title:'采集描述',
+            align:"center",
+            dataIndex: 'cjms'
+          },
+          {
+            title:'采集id',
+            align:"center",
+            dataIndex: 'cjid'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/hzz.xxcj/rmXxcj/listRmCjxxmxByMainId",
+          delete: "/hzz.xxcj/rmXxcj/deleteRmCjxxmx",
+          deleteBatch: "/hzz.xxcj/rmXxcj/deleteBatchRmCjxxmx",
+          exportXlsUrl: "/hzz.xxcj/rmXxcj/exportRmCjxxmx",
+          importUrl: "/hzz.xxcj/rmXxcj/importRmCjxxmx",
+        },
+        dictOptions:{
+        },
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl(){
+        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
+      }
+    },
+    methods: {
+      clearList(){
+        this.dataSource=[]
+        this.selectedRowKeys=[]
+        this.ipagination.current = 1
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'xmbh',text:'项目编号',dictCode:''})
+        fieldList.push({type:'string',value:'xmmc',text:'项目名称',dictCode:''})
+        fieldList.push({type:'string',value:'cjr',text:'采集人',dictCode:''})
+        fieldList.push({type:'date',value:'cjsj',text:'采集时间'})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 220 - 0
.svn/pristine/01/017ff0297da6c7b3236314dac2acb57a8200637f.svn-base

@@ -0,0 +1,220 @@
+<template>
+  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" v-if="mainId">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('任务清单')">导出</a-button>
+      <a-upload
+        name="file"
+        :showUploadList="false"
+        :multiple="false"
+        :headers="tokenHeader"
+        :action="importExcelUrl"
+        @change="handleImportExcel">
+          <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+
+      </a-table>
+    </div>
+
+    <rmRwqd-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></rmRwqd-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmRwqdModal from './modules/RmRwqdModal'
+
+  export default {
+    name: "RmRwqdList",
+    mixins:[JeecgListMixin],
+    components: { RmRwqdModal },
+    props:{
+      mainId:{
+        type:String,
+        default:'',
+        required:false
+      }
+    },
+    watch:{
+      mainId:{
+        immediate: true,
+        handler(val) {
+          if(!this.mainId){
+            this.clearList()
+          }else{
+            this.queryParam['mainId'] = val
+            this.loadData(1);
+          }
+        }
+      }
+    },
+    data () {
+      return {
+        description: '基本信息表管理页面',
+        disableMixinCreated:true,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'任务类别',
+            align:"center",
+            dataIndex: 'rwlb_dictText',
+          },
+          {
+            title:'任务子任务',
+            align:"center",
+            dataIndex: 'rwzrw_dictText',
+          },
+          {
+            title:'总任务',
+            align:"center",
+            dataIndex: 'zrw'
+          },
+          {
+            title:'第一年度',
+            align:"center",
+            dataIndex: 'dynd'
+          },
+          {
+            title:'第二年度',
+            align:"center",
+            dataIndex: 'dernd'
+          },
+          {
+            title:'第三年度',
+            align:"center",
+            dataIndex: 'dsnd'
+          },
+          {
+            title:'责任部门',
+            align:"center",
+            dataIndex: 'zrbm'
+          },
+          {
+            title:'意见/备注',
+            align:"center",
+            dataIndex: 'yjbz'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/hzz.yhyc/rmJbxx/listRmRwqdByMainId",
+          delete: "/hzz.yhyc/rmJbxx/deleteRmRwqd",
+          deleteBatch: "/hzz.yhyc/rmJbxx/deleteBatchRmRwqd",
+          exportXlsUrl: "/hzz.yhyc/rmJbxx/exportRmRwqd",
+          importUrl: "/hzz.yhyc/rmJbxx/importRmRwqd",
+        },
+        dictOptions:{
+         hdmc:[],
+        },
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl(){
+        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
+      }
+    },
+    methods: {
+      clearList(){
+        this.dataSource=[]
+        this.selectedRowKeys=[]
+        this.ipagination.current = 1
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'hdmc',text:'河段名称',dictCode:'hlmc'})
+        fieldList.push({type:'string',value:'famc',text:'方案名称',dictCode:''})
+        fieldList.push({type:'date',value:'bzrq',text:'编制日期'})
+        fieldList.push({type:'date',value:'ksnf',text:'开始年月'})
+        fieldList.push({type:'date',value:'zznf',text:'终止年月'})
+        fieldList.push({type:'string',value:'bzdw',text:'编制单位',dictCode:''})
+        fieldList.push({type:'string',value:'bz',text:'备注',dictCode:''})
+        fieldList.push({type:'string',value:'wbfa',text:'文本方案',dictCode:''})
+        fieldList.push({type:'string',value:'xgtj',text:'相关图件',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 696 - 0
.svn/pristine/01/01902151a8c8b5015cb2ce3d87ff4a151a0ae60f.svn-base

@@ -0,0 +1,696 @@
+<template>
+  <a-layout class="layout" :class="[device]">
+
+    <template v-if="layoutMode === 'sidemenu'">
+      <a-drawer
+        v-if="device === 'mobile'"
+        :wrapClassName="'drawer-sider ' + navTheme"
+        placement="left"
+        @close="() => this.collapsed = false"
+        :closable="false"
+        :visible="collapsed"
+        width="200px"
+      >
+        <side-menu
+          mode="inline"
+          v-if="device === 'mobile'"
+          :menus="menus"
+          @menuSelect="menuSelect"
+          @updateMenuTitle="handleUpdateMenuTitle"
+          :theme="navTheme"
+          :collapsed="false"
+          :collapsible="true"></side-menu>
+      </a-drawer>
+
+      <side-menu
+        v-show="device === 'desktop'"
+        mode="inline"
+        :menus="menus"
+        @menuSelect="myMenuSelect"
+        @updateMenuTitle="handleUpdateMenuTitle"
+        :theme="navTheme"
+        :collapsed="collapsed"
+        :collapsible="true"></side-menu>
+    </template>
+    <!-- 下次优化这些代码 -->
+    <template v-else>
+      <a-drawer
+        v-if="device === 'mobile'"
+        :wrapClassName="'drawer-sider ' + navTheme"
+        placement="left"
+        @close="() => this.collapsed = false"
+        :closable="false"
+        :visible="collapsed"
+        width="200px"
+      >
+        <side-menu
+          mode="inline"
+          :menus="menus"
+          @menuSelect="menuSelect"
+          @updateMenuTitle="handleUpdateMenuTitle"
+          :theme="navTheme"
+          :collapsed="false"
+          :collapsible="true"></side-menu>
+      </a-drawer>
+    </template>
+
+    <a-layout
+      :class="[layoutMode, `content-width-${contentWidth}`]"
+      :style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 200 : 80}px` : '0' }">
+      <!-- layout header -->
+      <global-header
+        :mode="layoutMode"
+        :menus="menus"
+        :theme="navTheme"
+        :collapsed="collapsed"
+        :device="device"
+        @toggle="toggle"
+        @updateMenuTitle="handleUpdateMenuTitle"
+      />
+
+      <!-- layout content -->
+      <a-layout-content :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' }">
+        <slot></slot>
+      </a-layout-content>
+
+      <!-- layout footer -->
+      <a-layout-footer style="padding: 0px">
+        <global-footer/>
+      </a-layout-footer>
+    </a-layout>
+
+    <!-- update-start---- author:os_chengtgen -- date:20190830 --  for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ---- -->
+    <!--<setting-drawer></setting-drawer>-->
+    <!-- update-end---- author:os_chengtgen -- date:20190830 --  for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ---- -->
+  </a-layout>
+</template>
+
+<script>
+  import SideMenu from '@/components/menu/SideMenu'
+  import GlobalHeader from '@/components/page/GlobalHeader'
+  import GlobalFooter from '@/components/page/GlobalFooter'
+  import { triggerWindowResizeEvent } from '@/utils/util'
+  import { mapActions, mapState } from 'vuex'
+  import { mixin, mixinDevice } from '@/utils/mixin.js'
+  // update-start---- author:os_chengtgen -- date:20190830 --  for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
+  // import SettingDrawer from '@/components/setting/SettingDrawer'
+  // 注释这个因为在个人设置模块已经加载了SettingDrawer页面
+  // update-end ---- author:os_chengtgen -- date:20190830 --  for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
+
+  export default {
+    name: 'GlobalLayout',
+    components: {
+      SideMenu,
+      GlobalHeader,
+      GlobalFooter,
+      // update-start---- author:os_chengtgen -- date:20190830 --  for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
+      // // SettingDrawer
+      // 注释这个因为在个人设置模块已经加载了SettingDrawer页面
+      // update-end ---- author:os_chengtgen -- date:20190830 --  for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
+
+    },
+    mixins: [mixin, mixinDevice],
+    data() {
+      return {
+        collapsed: false,
+        activeMenu:{},
+        menus: []
+      }
+    },
+    computed: {
+      ...mapState({
+        // 主路由
+        mainRouters: state => state.permission.addRouters,
+        // 后台菜单
+        permissionMenuList: state => state.user.permissionList
+      })
+    },
+    watch: {
+      sidebarOpened(val) {
+        this.collapsed = !val
+      }
+    },
+    created() {
+      //--update-begin----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------
+      //this.menus = this.mainRouters.find((item) => item.path === '/').children;
+      this.menus = this.permissionMenuList
+      
+      //--update-begin----author:liusq---date:20210223------for:关于测边菜单遮挡内容问题详细说明 #2255
+      this.collapsed=!this.sidebarOpened;
+      //--update-begin----author:liusq---date:20210223------for:关于测边菜单遮挡内容问题详细说明 #2255
+  
+      // 根据后台配置菜单,重新排序加载路由信息
+      //console.log('----加载菜单逻辑----')
+      //console.log(this.mainRouters)
+      //console.log(this.permissionMenuList)
+      //console.log('----navTheme------'+this.navTheme)
+      //--update-end----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------
+    },
+    methods: {
+      ...mapActions(['setSidebar']),
+      toggle() {
+        this.collapsed = !this.collapsed
+        this.setSidebar(!this.collapsed)
+        triggerWindowResizeEvent()
+      },
+      menuSelect() {
+        if (!this.isDesktop()) {
+          this.collapsed = false
+        }
+      },
+      //update-begin-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title
+      myMenuSelect(value){
+        //此处触发动态路由被点击事件
+        this.findMenuBykey(this.menus,value.key)
+        this.$emit("dynamicRouterShow",value.key,this.activeMenu.meta.title)
+      },
+      findMenuBykey(menus,key){
+        for(let i of menus){
+          if(i.path==key){
+            this.activeMenu = {...i}
+          }else if(i.children && i.children.length>0){
+            this.findMenuBykey(i.children,key)
+          }
+        }
+      },
+      //update-end-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title
+
+      // update-begin-author:sunjianlei date:20210409 for: 修复动态功能测试菜单、带参数菜单标题错误、展开错误的问题
+      handleUpdateMenuTitle(value) {
+        this.findMenuBykey(this.menus, value.path)
+        this.activeMenu.meta.title = value.meta.title
+        this.$emit('dynamicRouterShow', value.path, this.activeMenu.meta.title)
+      },
+      // update-end-author:sunjianlei date:20210409 for: 修复动态功能测试菜单、带参数菜单标题错误、展开错误的问题
+
+    }
+  }
+
+</script>
+
+<style lang="less">
+  body {
+    // 打开滚动条固定显示
+    overflow-y: scroll;
+
+    &.colorWeak {
+      filter: invert(80%);
+    }
+  }
+
+  .layout {
+    min-height: 100vh !important;
+    overflow-x: hidden;
+
+    &.mobile {
+
+      .ant-layout-content {
+
+        .content {
+          margin: 24px 0 0;
+        }
+      }
+
+      /**
+       * ant-table-wrapper
+       * 覆盖的表格手机模式样式,如果想修改在手机上表格最低宽度,可以在这里改动
+       */
+      .ant-table-wrapper {
+        .ant-table-content {
+          overflow-y: auto;
+        }
+        .ant-table-body {
+          min-width: 800px;
+        }
+      }
+      .sidemenu {
+        .ant-header-fixedHeader {
+
+          &.ant-header-side-opened, &.ant-header-side-closed {
+            width: 100%
+          }
+        }
+      }
+
+      .topmenu {
+        /* 必须为 topmenu  才能启用流式布局 */
+        &.content-width-Fluid {
+          .header-index-wide {
+            margin-left: 0;
+          }
+        }
+      }
+      .header, .top-nav-header-index {
+        .user-wrapper .action {
+          padding: 0 12px;
+        }
+      }
+    }
+
+    &.ant-layout-has-sider {
+      flex-direction: row;
+    }
+
+    .trigger {
+      font-size: 22px;
+      line-height: 42px;
+      padding: 0 18px;
+      cursor: pointer;
+      transition: color 300ms, background 300ms;
+
+      &:hover {
+        background: rgba(255, 255, 255, 0.3);
+      }
+    }
+
+    .topmenu {
+      .ant-header-fixedHeader {
+        position: fixed;
+        top: 0;
+        right: 0;
+        z-index: 9;
+        width: 100%;
+        transition: width .2s;
+
+        &.ant-header-side-opened {
+          width: 100%;
+        }
+
+        &.ant-header-side-closed {
+          width: 100%;
+        }
+      }
+      /* 必须为 topmenu  才能启用流式布局 */
+      &.content-width-Fluid {
+        .header-index-wide {
+          max-width: unset;
+          margin-left: 24px;
+        }
+
+        .page-header-index-wide {
+          max-width: unset;
+        }
+      }
+
+    }
+
+    .sidemenu {
+      .ant-header-fixedHeader {
+        position: fixed;
+        top: 0;
+        right: 0;
+        z-index: 9;
+        width: 100%;
+        transition: width .2s;
+
+        &.ant-header-side-opened {
+          width: calc(100% - 200px)
+        }
+
+        &.ant-header-side-closed {
+          width: calc(100% - 80px)
+        }
+      }
+    }
+
+    .header {
+      height: 64px;
+      padding: 0 12px 0 0;
+      background: #fff;
+      box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
+      position: relative;
+    }
+
+    .header, .top-nav-header-index {
+
+      .user-wrapper {
+        float: right;
+        height: 100%;
+
+        .action {
+          cursor: pointer;
+          padding: 0 14px;
+          display: inline-block;
+          transition: all .3s;
+
+          height: 70%;
+          line-height: 46px;
+
+          &.action-full {
+            height: 100%;
+          }
+
+          &:hover {
+            background: rgba(255, 255, 255, 0.3);
+          }
+
+          .avatar {
+            margin: 20px 10px 20px 0;
+            color: #1890ff;
+            background: hsla(0, 0%, 100%, .85);
+            vertical-align: middle;
+          }
+
+          .icon {
+            font-size: 16px;
+            padding: 4px;
+          }
+
+          .anticon {
+            color: inherit;
+          }
+        }
+      }
+
+      &.dark {
+        .user-wrapper {
+
+          .action {
+            color: black;
+
+            &:hover {
+              background: rgba(0, 0, 0, 0.05);
+            }
+
+            .anticon {
+              color: inherit;
+            }
+          }
+        }
+      }
+    }
+
+    &.mobile {
+      .top-nav-header-index {
+
+        .header-index-wide {
+
+          .header-index-left {
+
+            .trigger {
+              color: rgba(255, 255, 255, 0.85);
+              padding: 0 12px;
+            }
+
+            .logo.top-nav-header {
+              text-align: center;
+              width: 56px;
+              line-height: 58px;
+            }
+          }
+        }
+
+        .user-wrapper .action .avatar {
+          margin: 20px 0;
+        }
+
+        &.light {
+
+          .header-index-wide {
+
+            .header-index-left {
+              .trigger {
+                color: rgba(0, 0, 0, 0.65);
+              }
+            }
+          }
+          //
+        }
+      }
+    }
+
+    &.tablet {
+      // overflow: hidden; text-overflow:ellipsis; white-space: nowrap;
+      .top-nav-header-index {
+
+        .header-index-wide {
+
+          .header-index-left {
+            .logo > a {
+              overflow: hidden;
+              text-overflow: ellipsis;
+              white-space: nowrap;
+            }
+          }
+        }
+      }
+
+    }
+
+    .top-nav-header-index {
+      box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
+      position: relative;
+      transition: background .3s, width .2s;
+
+      .header-index-wide {
+        width: 100%;
+        margin: auto;
+        padding: 0 20px 0 0;
+        display: flex;
+        height: 59px;
+
+        .ant-menu.ant-menu-horizontal {
+          border: none;
+          height: 64px;
+          line-height: 64px;
+        }
+
+        .header-index-left {
+          flex: 1 1;
+          display: flex;
+
+          .logo.top-nav-header {
+            width: 165px;
+            height: 64px;
+            position: relative;
+            line-height: 64px;
+            transition: all .3s;
+            overflow: hidden;
+
+            img {
+              display: inline-block;
+              vertical-align: middle;
+              height: 32px;
+            }
+
+            h1 {
+              color: #fff;
+              display: inline-block;
+              vertical-align: top;
+              font-size: 16px;
+              margin: 0 0 0 12px;
+              font-weight: 400;
+            }
+          }
+        }
+
+        .header-index-right {
+          float: right;
+          height: 59px;
+          overflow: hidden;
+          .action:hover {
+            background-color: rgba(0, 0, 0, 0.05);
+          }
+        }
+      }
+
+      &.light {
+        background-color: #fff;
+
+        .header-index-wide {
+          .header-index-left {
+            .logo {
+              h1 {
+                color: #002140;
+              }
+            }
+          }
+        }
+      }
+
+      &.dark {
+
+        .user-wrapper {
+
+          .action {
+            color: white;
+
+            &:hover {
+              background: rgba(255, 255, 255, 0.3);
+            }
+          }
+        }
+        .header-index-wide .header-index-left .trigger:hover {
+          background: rgba(255, 255, 255, 0.3);
+        }
+      }
+
+    }
+
+    // 内容区
+    .layout-content {
+      margin: 24px 24px 0px;
+      height: 64px;
+      padding: 0 12px 0 0;
+    }
+
+  }
+
+  .topmenu {
+    .page-header-index-wide {
+      margin: 0 auto;
+      width: 100%;
+    }
+  }
+
+  // drawer-sider 自定义
+  .ant-drawer.drawer-sider {
+    .sider {
+      box-shadow: none;
+    }
+
+    &.dark {
+      .ant-drawer-content {
+        background-color: rgb(0, 21, 41);
+      }
+    }
+    &.light {
+      box-shadow: none;
+      .ant-drawer-content {
+        background-color: #fff;
+      }
+    }
+
+    .ant-drawer-body {
+      padding: 0
+    }
+  }
+
+  // 菜单样式
+  .sider {
+    box-shadow: 2px 116px 6px 0 rgba(0, 21, 41, .35);
+    position: relative;
+    z-index: 10;
+
+    &.ant-fixed-sidemenu {
+      position: fixed;
+      height: 100%;
+    }
+
+    .logo {
+      height: 64px;
+      position: relative;
+      line-height: 64px;
+      padding-left: 24px;
+      -webkit-transition: all .3s;
+      transition: all .3s;
+      background: #002140;
+      overflow: hidden;
+
+      img, h1 {
+        display: inline-block;
+        vertical-align: middle;
+      }
+
+      img {
+        height: 32px;
+      }
+
+      h1 {
+        color: #fff;
+        font-size: 18px;
+        margin: 0 0 0 8px;
+        font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+        font-weight: 600;
+      }
+    }
+
+    &.light {
+      background-color: #fff;
+      box-shadow: 2px 116px 8px 0 rgba(29, 35, 41, 0.05);
+
+      .logo {
+        background: #fff;
+        box-shadow: 1px 1px 0 0 #e8e8e8;
+
+        h1 {
+          color: unset;
+        }
+      }
+
+      .ant-menu-light {
+        border-right-color: transparent;
+      }
+    }
+
+  }
+
+  // 外置的样式控制
+  .user-dropdown-menu-wrapper.ant-dropdown-menu {
+    padding: 4px 0;
+
+    .ant-dropdown-menu-item {
+      width: 160px;
+    }
+
+    .ant-dropdown-menu-item > .anticon:first-child,
+    .ant-dropdown-menu-item > a > .anticon:first-child,
+    .ant-dropdown-menu-submenu-title > .anticon:first-child
+    .ant-dropdown-menu-submenu-title > a > .anticon:first-child {
+      min-width: 12px;
+      margin-right: 8px;
+    }
+
+  }
+
+  // 数据列表 样式
+  .table-alert {
+    margin-bottom: 16px;
+  }
+
+  .table-page-search-wrapper {
+
+    .ant-form-inline {
+
+      .ant-form-item {
+        display: flex;
+        margin-bottom: 24px;
+        margin-right: 0;
+
+        .ant-form-item-control-wrapper {
+          flex: 1 1;
+          display: inline-block;
+          vertical-align: middle;
+        }
+
+        > .ant-form-item-label {
+          line-height: 32px;
+          padding-right: 8px;
+          width: auto;
+        }
+        .ant-form-item-control {
+          height: 32px;
+          line-height: 32px;
+        }
+      }
+    }
+
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+
+  }
+
+  .content {
+
+    .table-operator {
+      margin-bottom: 18px;
+
+      button {
+        margin-right: 8px;
+      }
+    }
+  }
+</style>

+ 60 - 0
.svn/pristine/02/021dced811ea26636800b487d941dd723987b247.svn-base

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <querymanage-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></querymanage-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import QuerymanageForm from './QuerymanageForm'
+  export default {
+    name: 'QuerymanageModal',
+    components: {
+      QuerymanageForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 512 - 0
.svn/pristine/03/03c3c71f1aad05f593fc36d13670a8fd903af880.svn-base

@@ -0,0 +1,512 @@
+# JDate 日期组件 使用文档
+  
+###### 说明: antd-vue日期组件需要用moment中转一下,用起来不是很方便,特二次封装,使用时只需要传字符串即可
+## 参数配置
+| 参数           | 类型      | 必填 |说明|
+|--------------|---------|----|---------|
+| placeholder      |string   | | placeholder      |
+| readOnly   | boolean   | | true/false 默认false                 |
+| value      | string | | 绑定v-model或是v-decorator后不需要设置    |
+| showTime | boolean | | 是否展示时间true/false 默认false  |
+| dateFormat    | string | |日期格式 默认'YYYY-MM-DD' 若showTime设置为true则需要将其设置成对应的时间格式(如:YYYY-MM-DD HH:mm:ss)               |
+| triggerChange | string | |触发组件值改变的事件是否是change,当使用v-decorator时且没有设置decorator的option.trigger为input需要设置该值为true               |
+使用示例
+----
+1.组件带有v-model的使用方法
+```vue
+<j-date v-model="dateStr"></j-date>
+```
+
+2.组件带有v-decorator的使用方法  
+  a).设置trigger-change属性为true
+  ```vue
+    <j-date :trigger-change="true" v-decorator="['dateStr',{}]"></j-date>
+  ```
+    
+  b).设置decorator的option.trigger为input
+   ```vue
+    <j-date v-decorator="['dateStr',{trigger:'input'}]"></j-date>
+   ```
+
+3.其他使用
+添加style
+```vue
+<j-date v-model="dateStr" style="width:100%"></j-date>
+```
+添加placeholder
+```vue
+<j-date v-model="dateStr" placeholder="请输入dateStr"></j-date>
+```
+添加readOnly
+```vue
+<j-date v-model="dateStr" :read-only="true"></j-date>
+```
+
+备注:
+script内需引入jdate
+```vue
+<script>
+  import JDate from '@/components/jeecg/JDate'
+  export default {
+    name: "demo",
+    components: {
+      JDate
+    }
+    //...
+  }
+</script>
+```
+
+
+ ---
+
+
+# JSuperQuery 高级查询 使用文档
+## 参数配置
+| 参数           | 类型      | 必填 | 说明                   |
+|--------------|---------|----|----------------------|
+| fieldList      | array   |✔| 需要查询的列集合示例如下,type类型有:date/datetime/string/int/number      |
+| callback   | array   |  | 回调函数名称(非必须)默认handleSuperQuery                |
+
+fieldList结构示例:
+```vue
+  const superQueryFieldList=[{
+    type:"date",
+    value:"birthday",
+    text:"生日"
+  },{
+    type:"string",
+    value:"name",
+    text:"用户名"
+  },{
+    type:"int",
+    value:"age",
+    text:"年龄"
+  }]
+```
+页面代码概述:  
+----
+1.import之后再components之内声明
+```vue
+import JSuperQuery from '@/components/jeecg/JSuperQuery.vue';
+  export default {
+    name: "JeecgDemoList",
+    components: {
+      JSuperQuery
+    },
+
+```
+2.页面引用
+```vue
+  <!-- 高级查询区域 -->
+  <j-super-query :fieldList="fieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+```
+3.list页面data中需要定义三个属性:
+```vue
+  fieldList:superQueryFieldList,
+  superQueryFlag:false,
+  superQueryParams:""
+```
+4.list页面声明回调事件handleSuperQuery(与组件的callback对应即可)
+```vue
+//高级查询方法
+handleSuperQuery(arg) {
+  if(!arg){
+    this.superQueryParams=''
+    this.superQueryFlag = false
+  }else{
+    this.superQueryFlag = true
+    this.superQueryParams=JSON.stringify(arg)
+  }
+  this.loadData()
+},
+```
+5.改造list页面方法
+```vue
+  // 获取查询条件
+  getQueryParams() {
+    let sqp = {}
+    if(this.superQueryParams){
+      sqp['superQueryParams']=encodeURI(this.superQueryParams)
+    }
+    var param = Object.assign(sqp, this.queryParam, this.isorter);
+    param.field = this.getQueryField();
+    param.pageNo = this.ipagination.current;
+    param.pageSize = this.ipagination.pageSize;
+    return filterObj(param);
+  },
+```
+6.打开弹框调用show方法:
+```vue
+this.$refs.superQueryModal.show();
+```
+
+# JEllipsis 字符串超长截取省略号显示
+  
+###### 说明: 遇到超长文本展示,通过此标签可以截取省略号显示,鼠标放置会提示全文本
+## 参数配置
+| 参数  | 类型     | 必填 |    说明      |
+|--------|---------|----|----------------|
+| value  |string   | 必填   |  字符串文本|
+| length | number  | 非必填 |  默认25    |
+使用示例
+----
+1.组件带有v-model的使用方法
+```vue
+<j-ellipsis :value="text"/>
+
+
+# Modal弹框实现最大化功能  
+
+1.定义modal的宽度:
+```vue
+  <a-modal
+    :width="modalWidth"
+    
+    
+    />
+```
+2.自定义modal的title,居右显示切换图标
+```vue
+  <template slot="title">
+    <div style="width: 100%;">
+      <span>{{ title }}</span>
+      <span style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right">
+        <a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button>
+      </span>
+    </div>
+  </template>
+```
+3.定义toggleScreen事件,用于切换modal宽度
+```vue
+  toggleScreen(){
+      if(this.modaltoggleFlag){
+        this.modalWidth = window.innerWidth;
+      }else{
+        this.modalWidth = 800;
+      }
+      this.modaltoggleFlag = !this.modaltoggleFlag;
+    },
+```
+4.data中声明上述用到的属性
+```vue
+    data () {
+      return {
+        modalWidth:800,
+        modaltoggleFlag:true,
+```
+
+# <a-select/> 下拉选项滚动错位的解决方法
+
+## 问题描述
+
+当使用了 `a-modal` 或其他带有滚动条的组件时,使用`a-select`组件并打开下拉框时滚动滚动条,就会导致错位的问题产生。
+
+## 解决方法
+
+大多数情况下,在 `a-select` 上添加一个 `getPopupContainer` 属性,值为`node => node.parentNode`即可解决。
+但是如果遇到 `a-select` 标签层级过深的情况,可能仍然会显示异常,只需要多加几个`.parentNode` (例:node => node.parentNode.parentNode.parentNode)多尝试几次直到解决问题即可。
+
+### 代码示例
+
+```html
+<a-select
+    placeholder="请选择展示模板"
+    :options="dicts.displayTemplate"
+    :getPopupContainer="node => node.parentNode"
+/>
+```
+
+# JAsyncTreeList 异步数列表组件使用说明
+
+## 引入组件
+
+```js
+import JTreeTable from '@/components/jeecg/JTreeTable'
+export default {
+  components: { JTreeTable }
+}
+```
+
+## 所需参数
+
+| 参数        | 类型   | 必填   | 说明                                                         |
+|-------------|--------|--------|--------------------------------------------------------------|
+| rowKey      | String | 非必填 | 表格行 key 的取值,默认为"id"                                |
+| columns     | Array  | 必填   | 表格列的配置描述,具体见Antd官方文档                         |
+| url         | String | 必填   | 数据查询url                                                  |
+| childrenUrl | String | 非必填 | 查询子级时的url,若不填则使用url参数查询子级                 |
+| queryKey    | String | 非必填 | 根据某个字段查询,如果传递 id 就根据 id 查询,默认为parentId |
+| queryParams | Object | 非必填 | 查询参数,当查询参数改变的时候会自动重新查询,默认为{}       |
+| topValue    | String | 非必填 | 查询顶级时的值,如果顶级为0,则传0,默认为null               |
+| tableProps  | Object | 非必填 | 自定义给内部table绑定的props                                 |
+
+## 代码示例
+
+```html
+<template>
+  <a-card :bordered="false">
+    <j-tree-table :url="url" :columns="columns" :tableProps="tableProps"/>
+  </a-card>
+</template>
+
+<script>
+  import JTreeTable from '@/components/jeecg/JTreeTable'
+
+  export default {
+    name: 'AsyncTreeTable',
+    components: { JTreeTable },
+    data() {
+      return {
+        url: '/mock/api/asynTreeList',
+        columns: [
+          { title: '菜单名称', dataIndex: 'name' },
+          { title: '组件', dataIndex: 'component' },
+          { title: '排序', dataIndex: 'orderNum' }
+        ],
+        selectedRowKeys: []
+      }
+    },
+     computed: {
+       tableProps() {
+         let _this = this
+         return {
+           // 列表项是否可选择
+           // 配置项见:https://vue.ant.design/components/table-cn/#rowSelection
+           rowSelection: {
+             selectedRowKeys: _this.selectedRowKeys,
+             onChange: (selectedRowKeys) => _this.selectedRowKeys = selectedRowKeys
+           }
+         }
+       }
+     }
+  }
+</script>
+```
+
+# JCheckbox 使用文档
+  
+###### 说明: antd-vue checkbox组件处理的是数组,用起来不是很方便,特二次封装,使用时只需处理字符串即可
+## 参数配置
+| 参数           | 类型   | 必填 |说明|
+|--------------|---------|----|---------|
+| options      |array   |✔| checkbox需要配置的项,是个数组,数组中每个对象包含两个属性:label(用于显示)和value(用于存储) |
+
+使用示例
+----
+```vue
+<template>
+  <a-form :form="form">
+    <a-form-item label="v-model式用法">
+      <j-checkbox v-model="sport" :options="sportOptions"></j-checkbox><span>{{ sport }}</span>
+    </a-form-item>
+
+    <a-form-item label="v-decorator式用法">
+      <j-checkbox v-decorator="['sport']" :options="sportOptions"></j-checkbox><span>{{ getFormFieldValue('sport') }}</span>
+    </a-form-item>
+  </a-form>
+</template>
+
+<script>
+  import JCheckbox from '@/components/jeecg/JCheckbox'
+  export default {
+    components: {JCheckbox},
+    data() {
+      return {
+        form: this.$form.createForm(this),
+        sport:'',
+        sportOptions:[
+          {
+            label:"足球",
+            value:"1"
+          },{
+            label:"篮球",
+            value:"2"
+          },{
+            label:"乒乓球",
+            value:"3"
+          }]
+      }
+    },
+    methods: {
+     getFormFieldValue(field){
+       return this.form.getFieldValue(field)
+     }
+    }
+  }
+</script>
+```
+
+# JCodeEditor 使用文档
+  
+###### 说明: 一个简易版的代码编辑器,支持语法高亮
+## 参数配置
+| 参数           | 类型   | 必填 |说明|
+|--------------|---------|----|---------|
+| language      |string   | | 表示当前编写代码的类型 javascript/html/css/sql |
+| placeholder      |string   | | placeholder |
+| lineNumbers      |Boolean   | | 是否显示行号 |
+| fullScreen      |Boolean   | | 是否显示全屏按钮 |
+| zIndex      |string   | | 全屏以后的z-index |
+
+使用示例
+----
+```vue
+<template>
+  <div>
+    <j-code-editor
+      language="javascript"
+      v-model="editorValue"
+      :fullScreen="true"
+      style="min-height: 100px"/>
+    {{ editorValue }}
+  </div>
+</template>
+
+<script>
+  import JCodeEditor from '@/components/jeecg/JCodeEditor'
+  export default {
+    components: {JCodeEditor},
+    data() {
+      return {
+        form: this.$form.createForm(this),
+        editorValue:'',
+      }
+    }
+  }
+</script>
+```
+
+# JFormContainer 使用文档
+  
+###### 说明: 暂用于表单禁用
+
+使用示例
+----
+```vue
+<!-- 在form下直接写这个组件,设置disabled为true就能将此form中的控件禁用 -->
+  <a-form layout="inline" :form="form" >
+    <j-form-container disabled>
+      <!-- 表单内容省略..... -->
+    </j-form-container>
+  </a-form>
+```
+
+# JImportModal 使用文档
+  
+###### 说明: 用于列表页面导入excel功能
+
+使用示例
+----
+```vue
+
+<template>
+  <!--  此处省略部分代码...... -->
+  <a-button @click="handleImportXls" type="primary" icon="upload">导入</a-button>
+  <!--  此处省略部分代码...... -->
+  <j-import-modal ref="importModal" :url="getImportUrl()" @ok="importOk"></j-import-modal>
+  <!--  此处省略部分代码...... -->
+</template>
+
+<script>
+  import JCodeEditor from '@/components/jeecg/JCodeEditor'
+  export default {
+    components: {JCodeEditor},
+    data() {
+      return {
+        //省略代码......
+      }
+    },
+    methods:{
+      //省略部分代码......
+      handleImportXls(){
+        this.$refs.importModal.show()
+      },
+      getImportUrl(){
+         return '你自己处理上传业务的后台地址'
+      },
+      importOk(){
+        this.loadData(1)
+      }
+    }
+  }
+</script>
+```
+
+# JSelectMultiple 多选下拉组件
+online用 实际开发请使用components/dict/JMultiSelectTag
+
+# JSlider 滑块验证码
+
+使用示例
+----
+```vue
+<template>
+  <div style="width: 300px">
+    <j-slider @onSuccess="sliderSuccess"></j-slider>
+  </div>
+</template>
+
+<script>
+  import JSlider from '@/components/jeecg/JSlider'
+  export default {
+    components: {JSlider},
+    data() {
+      return {
+        form: this.$form.createForm(this),
+        editorValue:'',
+      }
+    },
+    methods:{
+      sliderSuccess(){
+        console.log("验证完成")
+      }
+    }
+  }
+</script>
+```
+
+
+# JTreeSelect 树形下拉组件
+异步加载的树形下拉组件
+
+## 参数配置
+| 参数           | 类型   | 必填 |说明|
+|--------------|---------|----|---------|
+| placeholder      |string   | | placeholder |
+| dict      |string   | ✔| 表名,显示字段名,存储字段名拼接的字符串 |
+| pidField      |string   | ✔| 父ID的字段名 |
+| pidValue      |string   | | 根节点父ID的值 默认'0' 不可以设置为空,如果想使用此组件,而数据库根节点父ID为空,请修改之 |
+| multiple      |boolean   | |是否支持多选 |
+
+使用示例
+----
+```vue
+<template>
+  <a-form>
+    <a-form-item label="树形下拉测试" style="width: 300px">
+      <j-tree-select
+        v-model="departId"
+        placeholder="请选择部门"
+        dict="sys_depart,depart_name,id"
+        pidField="parent_id">
+      </j-tree-select>
+      {{ departId }}
+    </a-form-item>
+  </a-form >
+</template>
+
+<script>
+  import JTreeSelect from '@/components/jeecg/JTreeSelect'
+  export default {
+    components: {JTreeSelect},
+    data() {
+      return {
+        departId:""
+      }
+    }
+  }
+</script>
+```
+
+

+ 238 - 0
.svn/pristine/04/0481f6a3eb9388b0298418fa39904118d0784db2.svn-base

@@ -0,0 +1,238 @@
+<template>
+  <div class="page-header">
+    <div class="page-header-index-wide">
+      <a-breadcrumb class="breadcrumb">
+        <a-breadcrumb-item v-for="(item, index) in breadList" :key="index">
+          <router-link v-if="item.name != name" :to="{ path: item.path }">
+            {{ item.meta.title }}
+          </router-link>
+          <span v-else>{{ item.meta.title }}</span>
+        </a-breadcrumb-item>
+      </a-breadcrumb>
+
+      <div class="detail">
+        <div class="main" v-if="!$route.meta.hiddenHeaderContent">
+          <div class="row">
+            <img v-if="logo" :src="logo" class="logo"/>
+            <h1 v-if="title" class="title">{{ title }}</h1>
+            <div class="action">
+              <slot name="action"></slot>
+            </div>
+          </div>
+          <div class="row">
+            <div v-if="avatar" class="avatar">
+              <a-avatar :src="avatar"/>
+            </div>
+            <div v-if="this.$slots.content" class="headerContent">
+              <slot name="content"></slot>
+            </div>
+            <div v-if="this.$slots.extra" class="extra">
+              <slot name="extra"></slot>
+            </div>
+          </div>
+          <div>
+            <slot name="pageMenu"></slot>
+          </div>
+        </div>
+
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import Breadcrumb from '@/components/tools/Breadcrumb'
+
+  export default {
+    name: "PageHeader",
+    components: {
+      "s-breadcrumb": Breadcrumb
+    },
+    props: {
+      title: {
+        type: String,
+        default: '',
+        required: false
+      },
+      breadcrumb: {
+        type: Array,
+        default: null,
+        required: false
+      },
+      logo: {
+        type: String,
+        default: '',
+        required: false
+      },
+      avatar: {
+        type: String,
+        default: '',
+        required: false
+      }
+    },
+    data() {
+      return {
+        name: '',
+        breadList: [],
+      }
+    },
+    created() {
+      this.getBreadcrumb()
+    },
+    methods: {
+      getBreadcrumb() {
+
+        this.breadList = []
+        // this.breadList.push({name: 'index', path: '/dashboard/', meta: {title: '首页'}})
+
+        this.name = this.$route.name
+        this.$route.matched.forEach((item) => {
+          // item.name !== 'index' && this.breadList.push(item)
+          this.breadList.push(item)
+        })
+      }
+    },
+    watch: {
+      $route() {
+        this.getBreadcrumb()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+
+  .page-header {
+    background: #fff;
+    padding: 16px 32px 0;
+    border-bottom: 1px solid #e8e8e8;
+
+    .breadcrumb {
+      margin-bottom: 16px;
+    }
+
+    .detail {
+      display: flex;
+      /*margin-bottom: 16px;*/
+
+      .avatar {
+        flex: 0 1 72px;
+        margin: 0 24px 8px 0;
+
+        & > span {
+          border-radius: 72px;
+          display: block;
+          width: 72px;
+          height: 72px;
+        }
+      }
+
+      .main {
+        width: 100%;
+        flex: 0 1 auto;
+
+        .row {
+          display: flex;
+          width: 100%;
+
+          .avatar {
+            margin-bottom: 16px;
+          }
+        }
+
+        .title {
+          font-size: 20px;
+          font-weight: 500;
+
+          font-size: 20px;
+          line-height: 28px;
+          font-weight: 500;
+          color: rgba(0,0,0,.85);
+          margin-bottom: 16px;
+          flex: auto;
+
+        }
+        .logo {
+          width: 28px;
+          height: 28px;
+          border-radius: 4px;
+          margin-right: 16px;
+        }
+        .content, .headerContent {
+          flex: auto;
+          color: rgba(0,0,0,.45);
+          line-height: 22px;
+
+          .link {
+            margin-top: 16px;
+            line-height: 24px;
+
+            a {
+              font-size: 14px;
+              margin-right: 32px;
+            }
+          }
+        }
+        .extra {
+          flex: 0 1 auto;
+          margin-left: 88px;
+          min-width: 242px;
+          text-align: right;
+        }
+        .action {
+          margin-left: 56px;
+          min-width: 266px;
+          flex: 0 1 auto;
+          text-align: right;
+          &:empty {
+            display: none;
+          }
+        }
+      }
+    }
+  }
+
+  .mobile .page-header {
+
+    .main {
+
+      .row {
+        flex-wrap: wrap;
+
+        .avatar {
+          flex: 0 1 25%;
+          margin: 0 2% 8px 0;
+        }
+        .content, .headerContent {
+          flex: 0 1 70%;
+
+          .link {
+            margin-top: 16px;
+            line-height: 24px;
+
+            a {
+              font-size: 14px;
+              margin-right: 10px;
+            }
+          }
+        }
+        .extra {
+          flex: 1 1 auto;
+          margin-left: 0;
+          min-width: 0;
+          text-align: right;
+        }
+        .action {
+          margin-left: unset;
+          min-width: 266px;
+          flex: 0 1 auto;
+          text-align: left;
+          margin-bottom: 12px;
+          &:empty {
+            display: none;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 122 - 0
.svn/pristine/04/049f467174104d8be8d2741cea3d4c9f1fd56c9d.svn-base

@@ -0,0 +1,122 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+
+    <a-spin :spinning="confirmLoading">
+      <a-form>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="模板标题">
+          <a-input disabled v-model="templateName"/>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="模板内容">
+          <a-textarea disabled v-model="templateContent" :autosize="{ minRows: 5, maxRows: 8 }"/>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="测试数据">
+          <a-textarea placeholder="请输入json格式测试数据" v-model="testData" :autosize="{ minRows: 5, maxRows: 8 }"/>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="消息类型">
+          <j-dict-select-tag
+            v-model="msgType"
+            placeholder="请选择消息类型"
+            dictCode="msgType"/>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="消息接收方">
+          <a-input placeholder="请输入消息接收方" v-model="receiver"/>
+        </a-form-item>
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import {httpAction} from '@/api/manage'
+
+  export default {
+    name: "SysMessageTestModal",
+    data() {
+      return {
+        title: "操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: {span: 24},
+          sm: {span: 5},
+        },
+        wrapperCol: {
+          xs: {span: 24},
+          sm: {span: 16},
+        },
+
+        confirmLoading: false,
+        url: {
+          send: "/sys/message/sysMessageTemplate/sendMsg",
+        },
+        templateName: "",
+        templateContent: "",
+        receiver: "",
+        msgType: "",
+        testData: "",
+        sendParams: {}
+      }
+    },
+    methods: {
+      open(record) {
+        this.sendParams.templateCode = record.templateCode;
+        this.templateName = record.templateName;
+        this.templateContent = record.templateContent;
+        this.testData = record.templateTestJson;
+        this.visible = true;
+      },
+      close() {
+        this.receiver = "";
+        this.msgType = "";
+        this.sendParams = {};
+        this.visible = false;
+      },
+      handleOk() {
+        let httpurl = this.url.send;
+        let method = 'post';
+        this.sendParams.testData = this.testData;
+        this.sendParams.receiver = this.receiver;
+        this.sendParams.msgType = this.msgType;
+        httpAction(httpurl, this.sendParams, method).then((res) => {
+          if (res.success) {
+            this.$message.success(res.message);
+          } else {
+            this.$message.warning(res.message);
+          }
+        }).finally(() => {
+          this.confirmLoading = false;
+          this.close();
+        })
+      },
+      handleCancel() {
+        this.close()
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 246 - 0
.svn/pristine/04/04c8839af57c04f8969e2a3a6afb69eae1161d3e.svn-base

@@ -0,0 +1,246 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" v-has="'yspxm:add'" type="primary" icon="plus">新增</a-button>
+      <a-button v-has="'yspxm:dc'" type="primary" icon="download" @click="handleExportXls('已审批项目')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button v-has="'yspxm:dr'" type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px" v-has="'yspxm:pldelete'"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+        <template slot="jsxmmc" slot-scope="text,record">
+          <a @click="handleDetail(record)">{{ text }}</a>
+        </template>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="pcaSlot" slot-scope="text">
+          <div>{{ getPcaText(text) }}</div>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a-space>
+              <a-button @click='handleEdit(record)' v-has="'yspxm:bj'" size='small' type='primary'>编辑</a-button>
+              <a-popconfirm title='确定删除吗?' @confirm='() => handleDelete(record.id)'>
+                  <a-button size='small' v-has="'yspxm:delete'" type='danger'>删除</a-button>
+              </a-popconfirm>
+          </a-space>
+<!--          <a-divider type="vertical" />-->
+<!--          <a-dropdown>-->
+<!--            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>-->
+<!--            <a-menu slot="overlay">-->
+<!--              <a-menu-item>-->
+<!--                <a @click="handleDetail(record)">详情</a>-->
+<!--              </a-menu-item>-->
+<!--              <a-menu-item>-->
+<!--                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">-->
+<!--                  <a>删除</a>-->
+<!--                </a-popconfirm>-->
+<!--              </a-menu-item>-->
+<!--            </a-menu>-->
+<!--          </a-dropdown>-->
+        </span>
+
+      </a-table>
+    </div>
+
+    <rm-yspxm-modal ref="modalForm" @ok="modalFormOk"></rm-yspxm-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmYspxmModal from './modules/RmYspxmModal'
+  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
+  import Area from '@/components/_util/Area'
+
+  export default {
+    name: 'RmYspxmList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      RmYspxmModal
+    },
+    data () {
+      return {
+        description: '已审批项目管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'建设项目名称',
+            align:"center",
+            dataIndex: 'jsxmmc',
+              scopedSlots: { customRender: 'jsxmmc' }
+          },
+          {
+            title:'建设项目所在河道',
+            align:"center",
+            dataIndex: 'jsxmszhd'
+          },
+          {
+            title:'是否评审',
+            align:"center",
+            dataIndex: 'sfps_dictText'
+          },
+          {
+            title:'审批机关',
+            align:"center",
+            dataIndex: 'spjg'
+          },
+          {
+            title:'施工单位',
+            align:"center",
+            dataIndex: 'sgdw'
+          },
+          {
+            title:'监管单位',
+            align:"center",
+            dataIndex: 'jgdw'
+          },
+          {
+            title:'是否验收',
+            align:"center",
+            dataIndex: 'sfys_dictText'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/hzz.shjsgc.yspxm/rmYspxm/list",
+          delete: "/hzz.shjsgc.yspxm/rmYspxm/delete",
+          deleteBatch: "/hzz.shjsgc.yspxm/rmYspxm/deleteBatch",
+          exportXlsUrl: "/hzz.shjsgc.yspxm/rmYspxm/exportXls",
+          importExcelUrl: "hzz.shjsgc.yspxm/rmYspxm/importExcel",
+
+        },
+        dictOptions:{},
+        pcaData:'',
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.pcaData = new Area()
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      getPcaText(code){
+        return this.pcaData.getText(code);
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'jsxmmc',text:'建设项目名称',dictCode:''})
+        fieldList.push({type:'string',value:'yzdwmc',text:'业主单位名称',dictCode:''})
+        fieldList.push({type:'pca',value:'jsxmszd',text:'建设项目所在地'})
+        fieldList.push({type:'string',value:'jsxmszhd',text:'建设项目所在河道',dictCode:''})
+        fieldList.push({type:'date',value:'kgrq',text:'开工日期'})
+        fieldList.push({type:'date',value:'jgrq',text:'竣工日期'})
+        fieldList.push({type:'string',value:'jsqk',text:'建设情况',dictCode:'gcjsqk'})
+        fieldList.push({type:'string',value:'sfxybz',text:'是否需要编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfbz',text:'是否编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfps',text:'是否评审',dictCode:'yn'})
+        fieldList.push({type:'string',value:'spjg',text:'审批机关',dictCode:''})
+        fieldList.push({type:'string',value:'spwh',text:'审批文号',dictCode:''})
+        fieldList.push({type:'string',value:'sfsh',text:'是否审核',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sgshjgwjsj',text:'施工审核机关、文件、时间',dictCode:''})
+        fieldList.push({type:'string',value:'sgdw',text:'施工单位',dictCode:''})
+        fieldList.push({type:'string',value:'jgdw',text:'监管单位',dictCode:''})
+        fieldList.push({type:'string',value:'sgxcsffhyq',text:'施工现场是否符合要求',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sgjssfhfhdyz',text:'施工结束是否恢复河道原状',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfkxsg',text:'是否跨汛施工',dictCode:'yn'})
+        fieldList.push({type:'string',value:'dxfasfbz',text:'度汛方案是否编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'zrzsfls',text:'责任制是否落实',dictCode:'yn'})
+        fieldList.push({type:'string',value:'rywzsfls',text:'人员、物资是否落实',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfyq',text:'是否要求',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ayqwcqk',text:'按要求完成情况',dictCode:'ayqwcqk'})
+        fieldList.push({type:'string',value:'sfys',text:'是否验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'jsxmsfyjgys',text:'建设项目是否已竣工验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfcjjsxmjgys',text:'是否参加建设项目竣工验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ygzysfbb',text:'有关资源是否报备',dictCode:'yn'})
+        fieldList.push({type:'string',value:'czwtjclqk',text:'存在问题及处理情况',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 2159 - 0
.svn/pristine/05/056a4b65377cfa6e5a5b393939fe1f34bd6a0279.svn-base

@@ -0,0 +1,2159 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox,
+.tox *:not(svg) {
+  background: transparent;
+  border: 0;
+  box-sizing: content-box;
+  color: #222f3e;
+  cursor: auto;
+  direction: ltr;
+  float: none;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+  font-size: 16px;
+  font-style: normal;
+  font-weight: normal;
+  height: auto;
+  line-height: normal;
+  margin: 0;
+  max-width: none;
+  outline: 0;
+  padding: 0;
+  position: static;
+  -webkit-tap-highlight-color: transparent;
+  text-align: left;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  vertical-align: initial;
+  white-space: normal;
+  width: auto;
+}
+.tox *:not(svg) {
+  color: inherit;
+  cursor: inherit;
+  font-size: inherit;
+}
+.tox-tinymce {
+  border: 1px solid #cccccc;
+  border-radius: 0;
+  box-shadow: none;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+  overflow: hidden;
+  visibility: inherit !important;
+}
+.tox-editor-container {
+  display: flex;
+  flex: 1 1 auto;
+  flex-direction: column;
+  overflow: hidden;
+}
+.tox-editor-container > *:first-child {
+  border-top: none !important;
+}
+.tox-tinymce-aux {
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+  outline: none;
+}
+button::-moz-focus-inner {
+  border: 0;
+}
+.tox-silver-sink {
+  z-index: 1300;
+}
+.tox[dir='rtl'] {
+  direction: rtl;
+}
+.tox[dir='rtl'] .tox-statusbar__resize-handle {
+  justify-content: flex-start;
+  margin-left: -8px;
+  margin-right: 0;
+  padding-left: 0;
+  padding-right: 1ch;
+}
+.tox[dir='rtl'] .tox-statusbar .tox-statusbar__path {
+  text-align: right;
+}
+.tox .tox-anchorbar {
+  display: flex;
+  flex: 0 0 auto;
+}
+.tox .tox-bar {
+  display: flex;
+  flex: 0 0 auto;
+}
+.tox .tox-button {
+  background-color: #3498db;
+  background-image: none;
+  background-position: none;
+  background-repeat: none;
+  border-color: #3498db;
+  border-radius: 3px;
+  border-style: solid;
+  border-width: 1px;
+  box-shadow: none;
+  box-sizing: border-box;
+  color: #fff;
+  cursor: pointer;
+  display: inline-block;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+  font-size: 14px;
+  font-weight: bold;
+  letter-spacing: 1;
+  line-height: 24px;
+  margin: 0;
+  outline: none;
+  padding: 4px 16px;
+  text-align: center;
+  text-decoration: none;
+  text-transform: capitalize;
+  white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+  background-color: #3498db;
+  background-image: none;
+  border-color: #3498db;
+  box-shadow: none;
+  color: rgba(255, 255, 255, 0.5);
+  cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+  background-color: #258cd1;
+  background-image: none;
+  border-color: #258cd1;
+  box-shadow: none;
+  color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+  background-color: #258cd1;
+  background-image: none;
+  border-color: #258cd1;
+  box-shadow: none;
+  color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+  background-color: #217dbb;
+  background-image: none;
+  border-color: #217dbb;
+  box-shadow: none;
+  color: #fff;
+}
+.tox .tox-button--secondary {
+  background-color: #f0f0f0;
+  background-image: none;
+  background-position: none;
+  background-repeat: none;
+  border-color: #f0f0f0;
+  border-radius: 3px;
+  border-style: solid;
+  border-width: 1px;
+  box-shadow: none;
+  color: #222f3e;
+  outline: none;
+  padding: 4px 16px;
+  text-decoration: none;
+  text-transform: capitalize;
+}
+.tox .tox-button--secondary[disabled] {
+  background-color: #f0f0f0;
+  background-image: none;
+  border-color: #f0f0f0;
+  box-shadow: none;
+  color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+  background-color: #e3e3e3;
+  background-image: none;
+  border-color: #e3e3e3;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+  background-color: #e3e3e3;
+  background-image: none;
+  border-color: #e3e3e3;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+  background-color: #d6d6d6;
+  background-image: none;
+  border-color: #d6d6d6;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+  padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+  display: block;
+  fill: currentColor;
+}
+.tox .tox-button-link {
+  background: 0;
+  border: none;
+  box-sizing: border-box;
+  cursor: pointer;
+  display: inline-block;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+  font-size: 16px;
+  font-weight: normal;
+  line-height: 1.3;
+  margin: 0;
+  padding: 0;
+  white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+  font-size: 14px;
+}
+.tox .tox-button--naked {
+  background-color: transparent;
+  border-color: transparent;
+  box-shadow: unset;
+  color: #222f3e;
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+  background-color: #e3e3e3;
+  border-color: #e3e3e3;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+  background-color: #e3e3e3;
+  border-color: #e3e3e3;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+  background-color: #d6d6d6;
+  border-color: #d6d6d6;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-button--naked .tox-icon svg {
+  fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon {
+  color: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+  color: #222f3e;
+}
+.tox .tox-checkbox {
+  align-items: center;
+  border-radius: 3px;
+  cursor: pointer;
+  display: flex;
+  height: 36px;
+  min-width: 36px;
+}
+.tox .tox-checkbox__input {
+  /* Hide from view but visible to screen readers */
+  height: 1px;
+  left: -10000px;
+  overflow: hidden;
+  position: absolute;
+  top: auto;
+  width: 1px;
+}
+.tox .tox-checkbox__icons {
+  border-radius: 3px;
+  box-shadow: 0 0 0 2px transparent;
+  height: 24px;
+  padding: calc(3px);
+  width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+  display: block;
+  fill: rgba(34, 47, 62, 0.3);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+  display: none;
+  fill: #3498db;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+  display: none;
+  fill: #3498db;
+}
+.tox .tox-checkbox__label {
+  margin-left: 4px;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+  display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+  display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+  display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+  display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+  border-radius: 3px;
+  box-shadow: inset 0 0 0 1px #3498db;
+  padding: calc(3px);
+}
+.tox .tox-bar .tox-checkbox {
+  margin-left: 4px;
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+  display: flex;
+  padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+  display: flex;
+  flex-wrap: wrap;
+  max-height: 208px;
+  overflow-x: hidden;
+  overflow-y: auto;
+  padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+  border-bottom-width: 0;
+  border-color: #cccccc;
+  border-left-width: 0;
+  border-right-width: 0;
+  border-style: solid;
+  border-top-width: 1px;
+  padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+  border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+  background-color: #e6e6e6;
+  color: rgba(34, 47, 62, 0.6);
+  cursor: default;
+  font-size: 12px;
+  font-style: normal;
+  font-weight: normal;
+  margin-bottom: 4px;
+  margin-top: -4px;
+  padding: 4px 8px;
+  text-transform: none;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+.tox .tox-collection__item {
+  align-items: center;
+  color: #222f3e;
+  cursor: pointer;
+  display: flex;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+.tox .tox-collection__item--state-disabled {
+  background-color: unset;
+  color: rgba(34, 47, 62, 0.5);
+  cursor: default;
+}
+.tox .tox-collection--list .tox-collection__item {
+  padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+  border-radius: 3px;
+  padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+  border-radius: 3px;
+  padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+  background-color: inherit;
+  color: contrast(inherit, #222f3e, #fff);
+}
+.tox .tox-collection--list .tox-collection__item--active {
+  background-color: #dee0e2;
+  color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+  background-color: #c8cbcf;
+  color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+  background-color: #dee0e2;
+  color: #222f3e;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+  background-color: #c8cbcf;
+  color: #222f3e;
+}
+.tox .tox-collection--grid .tox-collection__item--active {
+  background-color: #dee0e2;
+  color: #222f3e;
+}
+.tox .tox-collection__item-icon {
+  align-items: center;
+  display: flex;
+  height: 24px;
+  justify-content: center;
+  width: 24px;
+}
+.tox .tox-collection__item-icon svg {
+  fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+  height: 48px;
+  width: 48px;
+}
+.tox .tox-collection--list .tox-collection__item > *:not(:first-child) {
+  margin-left: 8px;
+}
+.tox .tox-collection__item[role="menuitemcheckbox"]:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+  display: none;
+}
+.tox .tox-collection__item-label {
+  color: currentColor;
+  display: inline-block;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 24px;
+  text-transform: none;
+  word-break: break-all;
+}
+.tox .tox-collection--list .tox-collection__item-label:first-child {
+  margin-left: 4px;
+}
+.tox .tox-collection__item-accessory {
+  color: rgba(34, 47, 62, 0.6);
+  display: inline-block;
+  font-size: 14px;
+  height: 24px;
+  line-height: 24px;
+  margin-left: 16px;
+  text-align: right;
+  text-transform: normal;
+}
+.tox .tox-collection__item-caret {
+  align-items: center;
+  display: flex;
+  margin-left: 16px;
+  min-height: 24px;
+}
+.tox .tox-color-picker-container {
+  display: flex;
+  flex-direction: row;
+  height: 225px;
+  margin: 0;
+}
+.tox .tox-sv-palette {
+  border: 1px solid black;
+  box-sizing: border-box;
+  display: flex;
+  height: 100%;
+  margin-right: 15px;
+}
+.tox .tox-sv-palette-spectrum {
+  height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+  width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+  background: none;
+  border: 1px solid black;
+  border-radius: 50%;
+  height: 12px;
+  position: absolute;
+  width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+  border: 1px solid white;
+  border-radius: 50%;
+  height: 10px;
+  position: absolute;
+  width: 10px;
+}
+.tox .tox-hue-slider {
+  border: 1px solid black;
+  box-sizing: border-box;
+  height: 100%;
+  margin-right: 15px;
+  width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+  background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+  height: 100%;
+  width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+  width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+  background: white;
+  border: 1px solid black;
+  height: 4px;
+  margin-left: -1px;
+  width: 100%;
+}
+.tox .tox-rgb-form {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+  align-items: center;
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 5px;
+  width: inherit;
+}
+.tox .tox-rgb-form input {
+  width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+  /* Need !important to override Chrome's focus styling unfortunately */
+  border: 1px solid red !important;
+}
+.tox .tox-rgb-form label {
+  margin-right: .5em;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+  border: 1px solid black;
+  flex-grow: 2;
+  margin-bottom: 0;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+  margin: 2px 0 3px 4px;
+}
+.tox .tox-swatches__row {
+  display: flex;
+}
+.tox .tox-swatch {
+  height: 30px;
+  transition: transform 0.15s, box-shadow 0.15s;
+  width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+  box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+  transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+  align-items: center;
+  display: flex;
+  justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+  stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+  align-items: center;
+  background-color: transparent;
+  border: 0;
+  cursor: pointer;
+  display: flex;
+  height: 30px;
+  justify-content: center;
+  margin-left: auto;
+  outline: none;
+  padding: 0;
+  width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+  height: 24px;
+  width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+  background: #dee0e2;
+}
+.tox .tox-comment-thread {
+  background: #fff;
+  position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+  margin-top: 8px;
+}
+.tox .tox-comment {
+  background: #fff;
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+  padding: 8px 8px 16px 8px;
+  position: relative;
+}
+.tox .tox-comment__header {
+  align-items: center;
+  color: #222f3e;
+  display: flex;
+  justify-content: space-between;
+}
+.tox .tox-comment__date {
+  color: rgba(34, 47, 62, 0.6);
+  font-size: 12px;
+}
+.tox .tox-comment__body {
+  color: #222f3e;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.3;
+  margin-top: 8px;
+  position: relative;
+  text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+  resize: none;
+  white-space: normal;
+  width: 100%;
+}
+.tox .tox-comment__expander {
+  padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+  color: rgba(34, 47, 62, 0.6);
+  font-size: 14px;
+  font-style: normal;
+}
+.tox .tox-comment__body p {
+  margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+  padding-top: 16px;
+  text-align: center;
+}
+.tox .tox-comment__buttonspacing > *:last-child {
+  margin-left: 8px;
+}
+.tox .tox-comment-thread__overlay::after {
+  background: #fff;
+  bottom: 0;
+  content: "";
+  display: flex;
+  left: 0;
+  opacity: .9;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 5;
+}
+.tox .tox-comment__reply {
+  display: flex;
+  flex-shrink: 0;
+  flex-wrap: wrap;
+  justify-content: flex-end;
+  margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+  margin-bottom: 8px;
+  width: 100%;
+}
+.tox .tox-comment__reply > *:last-child {
+  margin-left: 8px;
+}
+.tox .tox-comment__edit {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: flex-end;
+  margin-left: 8px;
+  margin-top: 16px;
+}
+.tox .tox-comment__edit > *:last-child {
+  margin-left: 8px;
+}
+.tox .tox-comment__gradient::after {
+  background: linear-gradient(rgba(255, 255, 255, 0), #fff);
+  bottom: 0;
+  content: "";
+  display: block;
+  height: 5em;
+  margin-top: -40px;
+  position: absolute;
+  width: 100%;
+}
+.tox .tox-comment__overlay {
+  background: #fff;
+  bottom: 0;
+  display: flex;
+  flex-direction: column;
+  flex-grow: 1;
+  left: 0;
+  opacity: .9;
+  position: absolute;
+  right: 0;
+  text-align: center;
+  top: 0;
+  z-index: 5;
+}
+.tox .tox-comment__loading-text {
+  align-items: center;
+  color: #222f3e;
+  display: flex;
+  flex-direction: column;
+  position: relative;
+}
+.tox .tox-comment__loading-text > div {
+  padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+  bottom: 0;
+  flex-direction: column;
+  font-size: 14px;
+  left: 0;
+  padding: 1em;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+  background-color: #fff;
+  box-shadow: 0 0 8px 8px #fff;
+  color: #222f3e;
+  text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+  font-size: .8em;
+}
+.tox .tox-comment__busy-spinner {
+  align-items: center;
+  background-color: #fff;
+  bottom: 0;
+  display: flex;
+  justify-content: center;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 1103;
+}
+.tox .tox-comment__scroll {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 1;
+  overflow: auto;
+}
+.tox .tox-conversations {
+  margin: 8px;
+}
+.tox .tox-user {
+  align-items: center;
+  display: flex;
+}
+.tox .tox-user__avatar svg {
+  fill: rgba(34, 47, 62, 0.6);
+  margin-right: 8px;
+}
+.tox .tox-user__name {
+  color: rgba(34, 47, 62, 0.6);
+  font-size: 12px;
+  font-style: normal;
+  font-weight: bold;
+  text-transform: uppercase;
+}
+.tox .tox-user__avatar + .tox-user__name {
+  margin-left: 8px;
+}
+.tox .tox-dialog-wrap {
+  align-items: center;
+  bottom: 0;
+  display: flex;
+  justify-content: center;
+  left: 0;
+  position: fixed;
+  right: 0;
+  top: 0;
+  z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+  background-color: rgba(255, 255, 255, 0.75);
+  bottom: 0;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 1101;
+}
+.tox .tox-dialog {
+  background-color: #fff;
+  border-color: #cccccc;
+  border-radius: 3px;
+  border-style: solid;
+  border-width: 1px;
+  box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15);
+  display: flex;
+  flex-direction: column;
+  max-height: 100%;
+  max-width: 480px;
+  overflow: hidden;
+  position: relative;
+  width: 95vw;
+  z-index: 1102;
+}
+.tox .tox-dialog__header {
+  align-items: center;
+  background-color: #fff;
+  border-bottom: none;
+  color: #222f3e;
+  display: flex;
+  font-size: 16px;
+  justify-content: space-between;
+  margin-bottom: 16px;
+  padding: 8px 16px 0 16px;
+  position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+  z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+  cursor: grab;
+  height: 100%;
+  left: 0;
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+  cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+  margin-left: auto;
+}
+.tox .tox-dialog__title {
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+  font-size: 20px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.3;
+  margin: 0;
+  text-transform: normal;
+}
+.tox .tox-dialog__body {
+  color: #222f3e;
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+  font-size: 16px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.3;
+  padding: 0 16px;
+  text-align: left;
+  text-transform: normal;
+}
+.tox .tox-dialog__body-nav {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  margin-right: 32px;
+}
+.tox .tox-dialog__body-nav-item {
+  border-bottom: 2px solid transparent;
+  color: rgba(34, 47, 62, 0.6);
+  display: inline-block;
+  font-size: 14px;
+  line-height: 1.3;
+  margin-bottom: 8px;
+  text-decoration: none;
+}
+.tox .tox-dialog__body-nav-item--active {
+  border-bottom: 2px solid #3498db;
+  color: #3498db;
+}
+.tox .tox-dialog__body-content {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  -ms-flex-preferred-size: auto;
+  max-height: 650px;
+  overflow: auto;
+}
+.tox .tox-dialog__body-content > * {
+  margin-bottom: 0;
+  margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+  margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+  margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+  margin-bottom: 0;
+  margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+  height: 650px;
+  max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+  max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+  overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+  text-align: center;
+}
+.tox .tox-dialog__body-content--spacious {
+  margin-bottom: 16px;
+}
+.tox .tox-dialog__footer {
+  align-items: center;
+  background-color: #fff;
+  border-top: 1px solid #cccccc;
+  display: flex;
+  justify-content: space-between;
+  margin-top: 16px;
+  padding: 8px 16px;
+}
+.tox .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox .tox-dialog__footer .tox-dialog__footer-end > * {
+  margin-left: 8px;
+}
+.tox .tox-dialog__busy-spinner {
+  align-items: center;
+  background-color: rgba(255, 255, 255, 0.75);
+  bottom: 0;
+  display: flex;
+  justify-content: center;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  z-index: 1103;
+}
+.tox .tox-dialog__table {
+  border-collapse: collapse;
+  width: 100%;
+}
+.tox .tox-dialog__table thead th {
+  font-weight: bold;
+  padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+  border-bottom: 1px solid #cccccc;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+  border-bottom: none;
+}
+.tox .tox-dialog__table td {
+  padding-bottom: 8px;
+  padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+  position: absolute;
+  width: 100%;
+  z-index: 1100;
+}
+body.tox-dialog__disable-scroll {
+  overflow: hidden;
+}
+.tox .tox-dropzone-container {
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-dropzone {
+  align-items: center;
+  background: #fff;
+  border: 2px dashed #cccccc;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  flex-grow: 1;
+  justify-content: center;
+  min-height: 100px;
+  padding: 10px;
+}
+.tox .tox-dropzone p {
+  color: rgba(34, 47, 62, 0.6);
+  margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+  border-top: 1px solid #cccccc;
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+  overflow: hidden;
+  position: relative;
+}
+.tox .tox-edit-area__iframe {
+  background-color: #fff;
+  border: 0;
+  box-sizing: border-box;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+  height: 100%;
+  position: absolute;
+  width: 100%;
+}
+.tox.tox-inline-edit-area {
+  border: 1px dotted #cccccc;
+}
+.tox .tox-control-wrap {
+  flex: 1;
+  position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+  display: none;
+}
+.tox .tox-control-wrap svg {
+  display: block;
+}
+.tox .tox-control-wrap .tox-textfield {
+  padding-right: 32px;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+  position: absolute;
+  right: 4px;
+  top: 50%;
+  transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+  fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+  fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+  fill: transparent;
+}
+.tox .tox-autocompleter {
+  max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+  max-width: 25em;
+}
+.tox .tox-color-input {
+  display: flex;
+}
+.tox .tox-color-input .tox-textfield {
+  border-radius: 3px 0 0 3px;
+  display: flex;
+}
+.tox .tox-color-input span {
+  border-color: rgba(34, 47, 62, 0.2);
+  border-radius: 0 3px 3px 0;
+  border-style: solid;
+  border-width: 1px 1px 1px 0;
+  box-shadow: none;
+  box-sizing: border-box;
+  cursor: pointer;
+  display: flex;
+  width: 35px;
+}
+.tox .tox-color-input span:focus {
+  border-color: #3498db;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+  color: rgba(34, 47, 62, 0.6);
+  display: block;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.3;
+  padding: 0 8px 0 0;
+  text-transform: normal;
+  white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+  padding: 0 8px;
+}
+.tox .tox-form {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group {
+  box-sizing: border-box;
+  margin-bottom: 4px;
+}
+.tox .tox-form__group--error {
+  color: #c00;
+}
+.tox .tox-form__group--collection {
+  display: flex;
+}
+.tox .tox-form__grid {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+  width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+  width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+  width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+  align-items: center;
+  display: flex;
+}
+.tox .tox-form__controls-h-stack > *:not(:first-child) {
+  margin-left: 4px;
+}
+.tox .tox-form__group--inline {
+  align-items: center;
+  display: flex;
+}
+.tox .tox-form__group--stretched {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+  height: 100%;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+  display: none;
+}
+.tox .tox-selectfield {
+  cursor: pointer;
+  position: relative;
+}
+.tox .tox-selectfield select {
+  padding-right: 24px;
+}
+.tox .tox-selectfield select::-ms-expand {
+  display: none;
+}
+.tox .tox-selectfield svg {
+  pointer-events: none;
+  position: absolute;
+  right: 8px;
+  top: 50%;
+  transform: translateY(-50%);
+}
+.tox .tox-textarea {
+  white-space: pre-wrap;
+}
+.tox .tox-textfield,
+.tox .tox-selectfield select,
+.tox .tox-textarea,
+.tox .tox-toolbar-textfield {
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  background-color: #fff;
+  border-color: #cccccc;
+  border-radius: 3px;
+  border-style: solid;
+  border-width: 1px;
+  box-shadow: none;
+  box-sizing: border-box;
+  color: #222f3e;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+  font-size: 16px;
+  line-height: 24px;
+  margin: 0;
+  outline: none;
+  padding: 5px 4.75px;
+  resize: none;
+  width: 100%;
+}
+.tox .tox-textfield:focus,
+.tox .tox-selectfield select:focus,
+.tox .tox-textarea:focus {
+  border-color: #3498db;
+  box-shadow: none;
+  outline: none;
+}
+.tox .tox-toolbar-textfield {
+  border-width: 0;
+  margin-bottom: 3px;
+  margin-top: 2px;
+  max-width: 250px;
+}
+.tox .tox-toolbar-textfield + * {
+  margin-left: 4px;
+}
+.tox .tox-naked-btn {
+  background-color: transparent;
+  border: 0;
+  border-color: transparent;
+  box-shadow: unset;
+  color: #3498db;
+  cursor: pointer;
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.tox .tox-naked-btn svg {
+  display: block;
+  fill: #222f3e;
+}
+.tox-fullscreen {
+  border: 0;
+  height: 100%;
+  left: 0;
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+  position: fixed;
+  top: 0;
+  width: 100%;
+}
+.tox-fullscreen .tox .tox-statusbar__resize-handle {
+  display: none;
+}
+.tox-fullscreen .tox.tox-tinymce {
+  z-index: 1200;
+}
+.tox-fullscreen .tox.tox-tinymce-aux {
+  z-index: 1201;
+}
+.tox .tox-image-tools {
+  width: 100%;
+}
+.tox .tox-image-tools__toolbar {
+  align-items: center;
+  display: flex;
+  justify-content: center;
+}
+.tox .tox-image-tools__image {
+  background-color: #666;
+  height: 380px;
+  overflow: auto;
+  position: relative;
+  width: 100%;
+}
+.tox .tox-image-tools__image,
+.tox .tox-image-tools__image + .tox-image-tools__toolbar {
+  margin-top: 8px;
+}
+.tox .tox-image-tools__image-bg {
+  background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {
+  margin-left: 8px;
+}
+.tox .tox-image-tools__toolbar > .tox-button + .tox-slider {
+  margin-left: 32px;
+}
+.tox .tox-image-tools__toolbar > .tox-slider + .tox-button {
+  margin-left: 32px;
+}
+.tox .tox-image-tools__toolbar > .tox-spacer {
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-croprect-block {
+  background: black;
+  filter: alpha(opacity=50);
+  opacity: .5;
+  position: absolute;
+  zoom: 1;
+}
+.tox .tox-croprect-handle {
+  border: 2px solid white;
+  height: 20px;
+  left: 0;
+  position: absolute;
+  top: 0;
+  width: 20px;
+}
+.tox .tox-croprect-handle-move {
+  border: 0;
+  cursor: move;
+  position: absolute;
+}
+.tox .tox-croprect-handle-nw {
+  border-width: 2px 0 0 2px;
+  cursor: nw-resize;
+  left: 100px;
+  margin: -2px 0 0 -2px;
+  top: 100px;
+}
+.tox .tox-croprect-handle-ne {
+  border-width: 2px 2px 0 0;
+  cursor: ne-resize;
+  left: 200px;
+  margin: -2px 0 0 -20px;
+  top: 100px;
+}
+.tox .tox-croprect-handle-sw {
+  border-width: 0 0 2px 2px;
+  cursor: sw-resize;
+  left: 100px;
+  margin: -20px 2px 0 -2px;
+  top: 200px;
+}
+.tox .tox-croprect-handle-se {
+  border-width: 0 2px 2px 0;
+  cursor: se-resize;
+  left: 200px;
+  margin: -20px 0 0 -20px;
+  top: 200px;
+}
+.tox .tox-insert-table-picker {
+  display: flex;
+  flex-wrap: wrap;
+  width: 169px;
+}
+.tox .tox-insert-table-picker > div {
+  border-color: #cccccc;
+  border-style: solid;
+  border-width: 0 1px 1px 0;
+  box-sizing: content-box;
+  height: 16px;
+  width: 16px;
+}
+.tox .tox-insert-table-picker > div:nth-child(10n) {
+  border-right: 0;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+  margin: -4px 0;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+  background-color: rgba(52, 152, 219, 0.5);
+  border-color: rgba(52, 152, 219, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+  color: rgba(34, 47, 62, 0.6);
+  display: block;
+  font-size: 14px;
+  padding: 4px;
+  text-align: center;
+  width: 100%;
+}
+.tox {
+  /* stylelint-disable */
+  /* stylelint-enable */
+}
+.tox .tox-menu {
+  background-color: #fff;
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+  display: inline-block;
+  overflow: hidden;
+  vertical-align: top;
+  z-index: 1;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+  padding: 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+  padding: 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+  padding: 4px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+  margin: 0;
+}
+.tox .tox-menubar {
+  background: url("data:image/svg+xml;charset=utf8,%3Csvg height='43px' viewBox='0 0 40 43px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='42px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;
+  background-color: #fff;
+  display: flex;
+  flex: 0 0 auto;
+  flex-shrink: 0;
+  flex-wrap: wrap;
+  margin-bottom: -1px;
+  padding: 0 4px;
+}
+.tox .tox-mbtn {
+  align-items: center;
+  background: none;
+  border: 0;
+  border-radius: 3px;
+  box-shadow: none;
+  color: #222f3e;
+  display: flex;
+  flex: 0 0 auto;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  height: 34px;
+  justify-content: center;
+  margin: 2px 0 3px 0;
+  outline: none;
+  overflow: hidden;
+  padding: 0 4px;
+  text-transform: normal;
+  width: auto;
+}
+.tox .tox-mbtn[disabled] {
+  background-color: none;
+  border-color: none;
+  box-shadow: none;
+  color: rgba(34, 47, 62, 0.5);
+  cursor: not-allowed;
+}
+.tox .tox-mbtn:hover:not(:disabled) {
+  background: #dee0e2;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+  background: #dee0e2;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-mbtn--active {
+  background: #c8cbcf;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-mbtn__select-label {
+  cursor: default;
+  font-weight: normal;
+  margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+  cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+  align-items: center;
+  display: flex;
+  justify-content: center;
+  width: 16px;
+  display: none;
+}
+.tox .tox-notification {
+  background-color: #fff;
+  border-color: #c5c5c5;
+  border-style: solid;
+  border-width: 1px;
+  box-sizing: border-box;
+  display: -ms-grid;
+  display: grid;
+  -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+      grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+  margin-top: 5px;
+  opacity: 0;
+  padding: 5px;
+  transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification--in {
+  opacity: 1;
+}
+.tox .tox-notification--success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.tox .tox-notification--error {
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.tox .tox-notification--warn {
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.tox .tox-notification--info {
+  background-color: #d9edf7;
+  border-color: #779ecb;
+}
+.tox .tox-notification__body {
+  -ms-grid-row-align: center;
+      align-self: center;
+  color: #31708f;
+  font-size: 14px;
+  grid-column-end: 3;
+  -ms-grid-column-span: 1;
+  -ms-grid-column: 2;
+      grid-column-start: 2;
+  grid-row-end: 2;
+  -ms-grid-row: 1;
+      grid-row-start: 1;
+  text-align: center;
+  white-space: normal;
+  word-break: break-all;
+  word-break: break-word;
+}
+.tox .tox-notification__body > * {
+  margin: 0;
+}
+.tox .tox-notification__body > * + * {
+  margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+  -ms-grid-row-align: center;
+      align-self: center;
+  -ms-grid-column-align: end;
+  grid-column-end: 2;
+  -ms-grid-column-span: 1;
+  -ms-grid-column: 1;
+      grid-column-start: 1;
+  grid-row-end: 2;
+  -ms-grid-row: 1;
+      grid-row-start: 1;
+  justify-self: end;
+}
+.tox .tox-notification__icon svg {
+  display: block;
+}
+.tox .tox-notification__dismiss {
+  -ms-grid-row-align: start;
+      align-self: start;
+  -ms-grid-column-align: end;
+  grid-column-end: 4;
+  -ms-grid-column-span: 1;
+  -ms-grid-column: 3;
+      grid-column-start: 3;
+  grid-row-end: 2;
+  -ms-grid-row: 1;
+      grid-row-start: 1;
+  justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+  -ms-grid-column-align: center;
+  grid-column-end: 4;
+  -ms-grid-column-span: 3;
+  -ms-grid-column: 1;
+      grid-column-start: 1;
+  grid-row-end: 3;
+  -ms-grid-row-span: 1;
+  -ms-grid-row: 2;
+      grid-row-start: 2;
+  justify-self: center;
+}
+.tox .tox-pop {
+  display: inline-block;
+  position: relative;
+}
+.tox .tox-pop--resizing {
+  transition: width .1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar {
+  flex-wrap: nowrap;
+}
+.tox .tox-pop__dialog {
+  background-color: #fff;
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+  min-width: 0;
+  overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+  margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+  background-color: transparent;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+  border-style: solid;
+  content: '';
+  display: block;
+  height: 0;
+  position: absolute;
+  width: 0;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+  left: 50%;
+  top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+  border-color: #fff transparent transparent transparent;
+  border-width: 8px;
+  margin-left: -8px;
+  margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+  border-color: #cccccc transparent transparent transparent;
+  border-width: 9px;
+  margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+  left: 50%;
+  top: 0;
+  transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+  border-color: transparent transparent #fff transparent;
+  border-width: 8px;
+  margin-left: -8px;
+  margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+  border-color: transparent transparent #cccccc transparent;
+  border-width: 9px;
+  margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+  left: 0;
+  top: calc(50% - 1px);
+  transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+  border-color: transparent #fff transparent transparent;
+  border-width: 8px;
+  margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+  border-color: transparent #cccccc transparent transparent;
+  border-width: 10px;
+  margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+  left: 100%;
+  top: calc(50% + 1px);
+  transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+  border-color: transparent transparent transparent #fff;
+  border-width: 8px;
+  margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+  border-color: transparent transparent transparent #cccccc;
+  border-width: 10px;
+  margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+  left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+  left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+  display: flex;
+  flex-direction: row;
+  flex-grow: 1;
+  min-height: 0;
+}
+.tox .tox-sidebar {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+  display: flex;
+  overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+  display: flex;
+}
+.tox .tox-sidebar__pane {
+  display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+  opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+  opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+  transition: width .5s ease, opacity .5s ease;
+}
+.tox .tox-slider {
+  align-items: center;
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+  height: 24px;
+  justify-content: center;
+  position: relative;
+}
+.tox .tox-slider__rail {
+  background-color: transparent;
+  border: 1px solid #cccccc;
+  border-radius: 6px;
+  height: 6px;
+  min-width: 120px;
+  width: 100%;
+}
+.tox .tox-slider__handle {
+  background-color: #3498db;
+  border-radius: 1.5px;
+  box-shadow: none;
+  height: 24px;
+  left: 50%;
+  position: absolute;
+  top: 50%;
+  transform: translateX(-50%) translateY(-50%);
+  width: 3px;
+}
+.tox .tox-source-code {
+  overflow: auto;
+}
+.tox .tox-spinner {
+  display: flex;
+}
+.tox .tox-spinner > div {
+  animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+  background-color: rgba(34, 47, 62, 0.6);
+  border-radius: 100%;
+  height: 8px;
+  width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+  animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+  animation-delay: -0.16s;
+}
+.tox .tox-spinner > div:not(:first-child) {
+  margin-left: 4px;
+}
+@keyframes tam-bouncing-dots {
+  0%,
+  80%,
+  100% {
+    transform: scale(0);
+  }
+  40% {
+    transform: scale(1);
+  }
+}
+.tox .tox-statusbar {
+  align-items: center;
+  background-color: #fff;
+  border-top: 1px solid #cccccc;
+  color: rgba(34, 47, 62, 0.6);
+  display: flex;
+  flex: 0 0 auto;
+  font-size: 12px;
+  height: 18px;
+  overflow: hidden;
+  padding: 0 8px;
+  position: relative;
+  text-transform: uppercase;
+}
+.tox .tox-statusbar a {
+  color: rgba(34, 47, 62, 0.6);
+  text-decoration: none;
+}
+.tox .tox-statusbar a:hover {
+  text-decoration: underline;
+}
+.tox .tox-statusbar__text-container {
+  display: flex;
+  flex: 1 1 auto;
+  justify-content: flex-end;
+  overflow: hidden;
+}
+.tox .tox-statusbar__path {
+  display: flex;
+  flex: 1 1 auto;
+  margin-right: auto;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+  display: inline;
+  margin-right: 4px;
+  white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount,
+.tox .tox-statusbar__branding {
+  flex: 0 0 auto;
+  margin-left: 1ch;
+}
+.tox .tox-statusbar__resize-handle {
+  align-items: flex-end;
+  align-self: stretch;
+  cursor: nwse-resize;
+  display: flex;
+  flex: 0 0 auto;
+  justify-content: flex-end;
+  margin-left: auto;
+  margin-right: -8px;
+  padding-left: 1ch;
+}
+.tox .tox-statusbar__resize-handle svg {
+  display: block;
+  fill: rgba(34, 47, 62, 0.6);
+}
+.tox .tox-tbtn {
+  align-items: center;
+  background: none;
+  border: 0;
+  border-radius: 3px;
+  box-shadow: none;
+  color: #222f3e;
+  display: flex;
+  flex: 0 0 auto;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  height: 34px;
+  justify-content: center;
+  margin: 2px 0 3px 0;
+  outline: none;
+  overflow: hidden;
+  padding: 0;
+  text-transform: normal;
+  width: 34px;
+}
+.tox .tox-tbtn svg {
+  display: block;
+  fill: #222f3e;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+  padding-left: 5px;
+  padding-right: 5px;
+  width: inherit;
+}
+.tox .tox-tbtn + .tox-tbtn {
+  margin-left: 0;
+}
+.tox .tox-tbtn--enabled {
+  background: #c8cbcf;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-tbtn--enabled > * {
+  transform: none;
+}
+.tox .tox-tbtn--enabled svg {
+  fill: #222f3e;
+}
+.tox .tox-tbtn:hover {
+  background: #dee0e2;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-tbtn:hover svg {
+  fill: #222f3e;
+}
+.tox .tox-tbtn:focus {
+  background: #dee0e2;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-tbtn:focus svg {
+  fill: #222f3e;
+}
+.tox .tox-tbtn:active {
+  background: #c8cbcf;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-tbtn:active svg {
+  fill: #222f3e;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+  background: none;
+  box-shadow: none;
+  color: rgba(34, 47, 62, 0.5);
+  cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+  /* stylelint-disable-line no-descending-specificity */
+  fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn:active > * {
+  transform: none;
+}
+.tox .tox-tbtn--md {
+  height: 51px;
+  width: 51px;
+}
+.tox .tox-tbtn--lg {
+  flex-direction: column;
+  height: 68px;
+  width: 68px;
+}
+.tox .tox-tbtn--return {
+  -ms-grid-row-align: stretch;
+      align-self: stretch;
+  height: unset;
+  width: 16px;
+}
+.tox .tox-tbtn--labeled {
+  padding: 0 4px;
+  width: unset;
+}
+.tox .tox-tbtn__vlabel {
+  display: block;
+  font-size: 10px;
+  font-weight: normal;
+  letter-spacing: -0.025em;
+  margin-bottom: 4px;
+  white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+  margin: 2px 0 3px 0;
+  padding: 0 4px;
+  width: auto;
+}
+.tox .tox-tbtn__select-label {
+  cursor: default;
+  font-weight: normal;
+  margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+  align-items: center;
+  display: flex;
+  justify-content: center;
+  width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+  fill: rgba(34, 47, 62, 0.6);
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 7em;
+}
+.tox .tox-split-button {
+  border: 0;
+  border-radius: 3px;
+  box-sizing: border-box;
+  display: flex;
+  margin: 2px 0 3px 0;
+  overflow: hidden;
+}
+.tox .tox-split-button:hover {
+  box-shadow: 0 0 0 1px #dee0e2 inset;
+}
+.tox .tox-split-button:focus {
+  background: #dee0e2;
+  box-shadow: none;
+  color: #222f3e;
+}
+.tox .tox-split-button > * {
+  border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+  width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+  fill: rgba(34, 47, 62, 0.6);
+}
+.tox .tox-pop .tox-split-button__chevron svg {
+  transform: rotate(-90deg);
+}
+.tox .tox-split-button .tox-tbtn {
+  margin: 0;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+  background: none;
+  box-shadow: none;
+  color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+  background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;
+  background-color: #fff;
+  border-top: 1px solid #cccccc;
+  display: flex;
+  flex: 0 0 auto;
+  flex-shrink: 0;
+  flex-wrap: wrap;
+  margin-bottom: -1px;
+  padding: 0 0;
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+  display: none;
+}
+.tox .tox-pop .tox-toolbar {
+  border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+  background-image: none;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+  border-left: 1px solid #cccccc;
+  border-radius: 6px;
+  border-right: 1px solid #cccccc;
+}
+.tox .tox-toolbar__group {
+  align-items: center;
+  display: flex;
+  flex-wrap: wrap;
+  margin: 0 0;
+  padding: 0 4px;
+}
+.tox .tox-toolbar__group:not(:last-of-type) {
+  border-right: 1px solid #cccccc;
+}
+.tox .tox-toolbar__group--pull-right {
+  margin-left: auto;
+}
+.tox .tox-tooltip {
+  display: inline-block;
+  padding: 8px;
+  position: relative;
+}
+.tox .tox-tooltip__body {
+  background-color: #222f3e;
+  border-radius: 3px;
+  box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3);
+  color: rgba(255, 255, 255, 0.75);
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  padding: 4px 8px;
+  text-transform: normal;
+}
+.tox .tox-tooltip__arrow {
+  position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+  border-left: 8px solid transparent;
+  border-right: 8px solid transparent;
+  border-top: 8px solid #222f3e;
+  bottom: 0;
+  left: 50%;
+  position: absolute;
+  transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+  border-bottom: 8px solid #222f3e;
+  border-left: 8px solid transparent;
+  border-right: 8px solid transparent;
+  left: 50%;
+  position: absolute;
+  top: 0;
+  transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+  border-bottom: 8px solid transparent;
+  border-left: 8px solid #222f3e;
+  border-top: 8px solid transparent;
+  position: absolute;
+  right: 0;
+  top: 50%;
+  transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+  border-bottom: 8px solid transparent;
+  border-right: 8px solid #222f3e;
+  border-top: 8px solid transparent;
+  left: 0;
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+}
+.tox .tox-well {
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  padding: 8px;
+  width: 100%;
+}
+.tox .tox-well > *:first-child {
+  margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+  margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+  margin: 0;
+}
+.tox .tox-custom-editor {
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  display: flex;
+  height: 525px;
+}
+/* stylelint-disable */
+.tox {
+  /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+  background-color: rgba(0, 0, 0, 0.5);
+  content: "";
+  height: 100%;
+  position: absolute;
+  width: 100%;
+  z-index: 1000;
+}
+.tox .tox-tab {
+  cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-content .tox-collection {
+  display: flex;
+  flex: 1;
+  -ms-flex-preferred-size: auto;
+}
+.tox ul {
+  display: block;
+  list-style-type: disc;
+  -webkit-margin-before: 1em;
+          margin-block-start: 1em;
+  -webkit-margin-after: 1em;
+          margin-block-end: 1em;
+  -webkit-margin-start: 0px;
+          margin-inline-start: 0px;
+  -webkit-margin-end: 0px;
+          margin-inline-end: 0px;
+  -webkit-padding-start: 40px;
+          padding-inline-start: 40px;
+}
+.tox a {
+  cursor: pointer;
+  color: #2276d2;
+}
+.tox .tox-image-tools-edit-panel {
+  height: 60px;
+}
+.tox .tox-image-tools__sidebar {
+  height: 60px;
+}

+ 180 - 0
.svn/pristine/05/056e2acaa77d91fb44794ee2a42045a51f2d0944.svn-base

@@ -0,0 +1,180 @@
+<template>
+  <a-table
+    :rowKey="rowKey"
+    :columns="columns"
+    :dataSource="dataSource"
+    :expandedRowKeys="expandedRowKeys"
+    v-bind="tableAttrs"
+    v-on="$listeners"
+    @expand="handleExpand"
+    @expandedRowsChange="expandedRowKeys=$event">
+
+    <template v-for="(slotItem) of slots" :slot="slotItem" slot-scope="text, record, index">
+      <slot :name="slotItem" v-bind="{text,record,index}"></slot>
+    </template>
+
+  </a-table>
+</template>
+
+<script>
+  import { getAction } from '@/api/manage'
+
+  export default {
+    name: 'JTreeTable',
+    props: {
+      rowKey: {
+        type: String,
+        default: 'id'
+      },
+      // 根据什么查询,如果传递 id 就根据 id 查询
+      queryKey: {
+        type: String,
+        default: 'parentId'
+      },
+      queryParams: {
+        type: Object,
+        default: () => ({})
+      },
+      // 查询顶级时的值,如果顶级为0,则传0
+      topValue: {
+        type: String,
+        default: null
+      },
+      columns: {
+        type: Array,
+        required: true
+      },
+      url: {
+        type: String,
+        required: true
+      },
+      childrenUrl: {
+        type: String,
+        default: null
+      },
+      tableProps: {
+        type: Object,
+        default: () => ({})
+      },
+      /** 是否在创建组件的时候就查询数据 */
+      immediateRequest: {
+        type: Boolean,
+        default: true
+      },
+      condition:{
+        type:String,
+        default:'',
+        required:false
+      }
+    },
+    data() {
+      return {
+        dataSource: [],
+        expandedRowKeys: []
+      }
+    },
+    computed: {
+      getChildrenUrl() {
+        if (this.childrenUrl) {
+          return this.childrenUrl
+        } else {
+          return this.url
+        }
+      },
+      slots() {
+        let slots = []
+        for (let column of this.columns) {
+          if (column.scopedSlots && column.scopedSlots.customRender) {
+            slots.push(column.scopedSlots.customRender)
+          }
+        }
+        return slots
+      },
+      tableAttrs() {
+        return Object.assign(this.$attrs, this.tableProps)
+      }
+    },
+    watch: {
+      queryParams: {
+        deep: true,
+        handler() {
+          this.loadData()
+        }
+      }
+    },
+    created() {
+      if (this.immediateRequest) this.loadData()
+    },
+    methods: {
+
+      /** 加载数据*/
+      loadData(id = this.topValue, first = true, url = this.url) {
+        this.$emit('requestBefore', { first })
+
+        if (first) {
+          this.expandedRowKeys = []
+        }
+
+        let params = Object.assign({}, this.queryParams || {})
+        params[this.queryKey] = id
+        if(this.condition && this.condition.length>0){
+          params['condition'] = this.condition
+        }
+
+        return getAction(url, params).then(res => {
+          let list = []
+          if (res.result instanceof Array) {
+            list = res.result
+          } else if (res.result.records instanceof Array) {
+            list = res.result.records
+          } else {
+            throw '返回数据类型不识别'
+          }
+          let dataSource = list.map(item => {
+            // 判断是否标记了带有子级
+            if (item.hasChildren === true) {
+              // 查找第一个带有dataIndex的值的列
+              let firstColumn
+              for (let column of this.columns) {
+                firstColumn = column.dataIndex
+                if (firstColumn) break
+              }
+              // 定义默认展开时显示的loading子级,实际子级数据只在展开时加载
+              let loadChild = { id: `${item.id}_loadChild`, [firstColumn]: 'loading...', isLoading: true }
+              item.children = [loadChild]
+            }
+            return item
+          })
+          if (first) {
+            this.dataSource = dataSource
+          }
+          this.$emit('requestSuccess', { first, dataSource, res })
+          return Promise.resolve(dataSource)
+        }).finally(() => this.$emit('requestFinally', { first }))
+      },
+
+      /** 点击展开图标时触发 */
+      handleExpand(expanded, record) {
+        // 判断是否是展开状态
+        if (expanded) {
+          // 判断子级的首个项的标记是否是“正在加载中”,如果是就加载数据
+          if (record.children[0].isLoading === true) {
+            this.loadData(record.id, false, this.getChildrenUrl).then(dataSource => {
+              // 处理好的数据可直接赋值给children
+              if (dataSource.length === 0) {
+                record.children = null
+              } else {
+                record.children = dataSource
+              }
+            })
+          }
+        }
+      }
+
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 281 - 0
.svn/pristine/05/05bf65c6708478c544595c996048d04d5adad5fb.svn-base

@@ -0,0 +1,281 @@
+<template>
+  <div class="j-easy-cron">
+    <div class="content">
+      <div>
+        <a-tabs size="small" v-model="curtab">
+          <a-tab-pane tab="秒" key="second" v-if="!hideSecond">
+            <second-ui v-model="second" :disabled="disabled"></second-ui>
+          </a-tab-pane>
+          <a-tab-pane tab="分" key="minute">
+            <minute-ui v-model="minute" :disabled="disabled"></minute-ui>
+          </a-tab-pane>
+          <a-tab-pane tab="时" key="hour">
+            <hour-ui v-model="hour" :disabled="disabled"></hour-ui>
+          </a-tab-pane>
+          <a-tab-pane tab="日" key="day">
+            <day-ui v-model="day" :week="week" :disabled="disabled"></day-ui>
+          </a-tab-pane>
+          <a-tab-pane tab="月" key="month">
+            <month-ui v-model="month" :disabled="disabled"></month-ui>
+          </a-tab-pane>
+          <a-tab-pane tab="周" key="week">
+            <week-ui v-model="week" :day="day" :disabled="disabled"></week-ui>
+          </a-tab-pane>
+          <a-tab-pane tab="年" key="year" v-if="!hideYear && !hideSecond">
+            <year-ui v-model="year" :disabled="disabled"></year-ui>
+          </a-tab-pane>
+        </a-tabs>
+      </div>
+      <a-divider/>
+      <!-- 执行时间预览 -->
+      <a-row :gutter="8">
+        <a-col :span="18" style="margin-top: 22px;">
+          <a-row :gutter="8">
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="秒" v-model="inputValues.second" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="分" v-model="inputValues.minute" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="时" v-model="inputValues.hour" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="日" v-model="inputValues.day" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="月" v-model="inputValues.month" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="周" v-model="inputValues.week" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="8" style="margin-bottom: 8px;">
+              <a-input addon-before="年" v-model="inputValues.year" @blur="onInputBlur"/>
+            </a-col>
+            <a-col :span="16" style="margin-bottom: 8px;">
+              <a-input addon-before="Cron" v-model="inputValues.cron" @blur="onInputCronBlur"/>
+            </a-col>
+          </a-row>
+        </a-col>
+        <a-col :span="6">
+
+          <div>近十次执行时间(不含年)</div>
+          <a-textarea type="textarea" :value="preTimeList" :rows="5"/>
+        </a-col>
+      </a-row>
+    </div>
+  </div>
+</template>
+
+<script>
+import SecondUi from './tabs/second'
+import MinuteUi from './tabs/minute'
+import HourUi from './tabs/hour'
+import DayUi from './tabs/day'
+import WeekUi from './tabs/week'
+import MonthUi from './tabs/month'
+import YearUi from './tabs/year'
+import CronParser from 'cron-parser'
+import dateFormat from './format-date'
+import { simpleDebounce } from '@/utils/util'
+import ACol from 'ant-design-vue/es/grid/Col'
+
+export default {
+  name: 'easy-cron',
+  components: {
+    ACol,
+    SecondUi,
+    MinuteUi,
+    HourUi,
+    DayUi,
+    WeekUi,
+    MonthUi,
+    YearUi
+  },
+  props: {
+    cronValue: {
+      type: String,
+      default: ''
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    hideSecond: {
+      type: Boolean,
+      default: false
+    },
+    hideYear: {
+      type: Boolean,
+      default: false
+    },
+    remote: {
+      type: Function,
+      default: null
+    }
+  },
+  data() {
+    return {
+      curtab: this.hideSecond ? 'minute' : 'second',
+      second: '*',
+      minute: '*',
+      hour: '*',
+      day: '*',
+      month: '*',
+      week: '?',
+      year: '*',
+      inputValues: {second: '', minute: '', hour: '', day: '', month: '', week: '', year: '', cron: ''},
+      preTimeList: '执行预览,会忽略年份参数',
+    }
+  },
+  computed: {
+    cronValue_c() {
+      let result = []
+      if (!this.hideSecond) result.push(this.second ? this.second : '*')
+      result.push(this.minute ? this.minute : '*')
+      result.push(this.hour ? this.hour : '*')
+      result.push(this.day ? this.day : '*')
+      result.push(this.month ? this.month : '*')
+      result.push(this.week ? this.week : '?')
+      if (!this.hideYear && !this.hideSecond) result.push(this.year ? this.year : '*')
+      return result.join(' ')
+    },
+    cronValue_c2() {
+      const v = this.cronValue_c
+      if (this.hideYear || this.hideSecond) return v
+      const vs = v.split(' ')
+      return vs.slice(0, vs.length - 1).join(' ')
+    }
+  },
+  watch: {
+    cronValue(newVal, oldVal) {
+      if (newVal === this.cronValue_c) {
+        // console.info('same cron value: ' + newVal)
+        return
+      }
+      this.formatValue()
+    },
+    cronValue_c(newVal, oldVal) {
+      this.calTriggerList()
+      this.$emit('change', newVal)
+      this.assignInput()
+    },
+    minute() {
+      if (this.second === '*') {
+        this.second = '0'
+      }
+    },
+    hour() {
+      if (this.minute === '*') {
+        this.minute = '0'
+      }
+    },
+    day(day) {
+      if (day !== '?' && this.hour === '*') {
+        this.hour = '0'
+      }
+    },
+    week(week) {
+      if (week !== '?' && this.hour === '*') {
+        this.hour = '0'
+      }
+    },
+    month() {
+      if (this.day === '?' && this.week === '*') {
+        this.week = '1'
+      } else if (this.week === '?' && this.day === '*') {
+        this.day = '1'
+      }
+    },
+    year() {
+      if (this.month === '*') {
+        this.month = '1'
+      }
+    },
+  },
+  created() {
+    this.formatValue()
+    this.$nextTick(() => {
+      this.calTriggerListInner()
+    })
+  },
+  methods: {
+    assignInput() {
+      Object.assign(this.inputValues, {
+        second: this.second,
+        minute: this.minute,
+        hour: this.hour,
+        day: this.day,
+        month: this.month,
+        week: this.week,
+        year: this.year,
+        cron: this.cronValue_c,
+      })
+    },
+    formatValue() {
+      if (!this.cronValue) return
+      const values = this.cronValue.split(' ').filter(item => !!item)
+      if (!values || values.length <= 0) return
+      let i = 0
+      if (!this.hideSecond) this.second = values[i++]
+      if (values.length > i) this.minute = values[i++]
+      if (values.length > i) this.hour = values[i++]
+      if (values.length > i) this.day = values[i++]
+      if (values.length > i) this.month = values[i++]
+      if (values.length > i) this.week = values[i++]
+      if (values.length > i) this.year = values[i]
+      this.assignInput()
+    },
+    calTriggerList: simpleDebounce(function () {
+      this.calTriggerListInner()
+    }, 500),
+    calTriggerListInner() {
+      // 设置了回调函数
+      if (this.remote) {
+        this.remote(this.cronValue_c, +new Date(), v => {
+          this.preTimeList = v
+        })
+        return
+      }
+      const format = 'yyyy-MM-dd hh:mm:ss'
+      const options = {
+        currentDate: dateFormat(new Date(), format)
+      }
+      const iter = CronParser.parseExpression(this.cronValue_c2, options)
+      const result = []
+      for (let i = 1; i <= 10; i++) {
+        result.push(dateFormat(new Date(iter.next()), format))
+      }
+      this.preTimeList = result.length > 0 ? result.join('\n') : '无执行时间'
+    },
+    onInputBlur(){
+      this.second = this.inputValues.second
+      this.minute = this.inputValues.minute
+      this.hour = this.inputValues.hour
+      this.day = this.inputValues.day
+      this.month = this.inputValues.month
+      this.week = this.inputValues.week
+      this.year = this.inputValues.year
+    },
+    onInputCronBlur(event){
+      this.$emit('change', event.target.value)
+    },
+  },
+  model: {
+    prop: 'cronValue',
+    event: 'change'
+  },
+}
+</script>
+
+<style scoped lang="less">
+  .j-easy-cron {
+
+    /deep/ .content {
+      .ant-checkbox-wrapper + .ant-checkbox-wrapper {
+        margin-left: 0;
+      }
+    }
+
+  }
+</style>

BIN
.svn/pristine/05/05da0700774afe0d25b0e4437e1fd8f1b0a99c4a.svn-base


+ 28 - 0
.svn/pristine/05/05f76ee0d71ed6c3594a8f9df4490402c166d866.svn-base

@@ -0,0 +1,28 @@
+import { formatDate } from '@/utils/util'
+import Area from '@/components/_util/Area'
+import { postAction } from '@/api/manage'
+
+const onlUtil = {
+  data(){
+    return {
+      mixin_pca:'',
+      flowCodePre: 'onl_'
+    }
+  },
+  created(){
+    this.mixin_pca = new Area(this.$Jpcaa)
+  },
+  methods:{
+    simpleDateFormat(millisecond, format){
+      return formatDate(millisecond, format)
+    },
+    getPcaText(code){
+      return this.mixin_pca.getText(code);
+    },
+    getPcaCode(text){
+      return this.mixin_pca.getCode(text)
+    }
+  }
+}
+
+export  { onlUtil }

+ 147 - 0
.svn/pristine/06/06263dceafb3969b4e4a01e983b3a43661ea40cb.svn-base

@@ -0,0 +1,147 @@
+/**
+ * 字典 util
+ * author: scott
+ * date: 20190109
+ */
+
+import {ajaxGetDictItems,getDictItemsFromCache} from '@/api/api'
+import {getAction} from '@/api/manage'
+
+/**
+ * 获取字典数组
+ * @param dictCode 字典Code
+ * @return List<Map>
+ */
+export async function initDictOptions(dictCode) {
+  if (!dictCode) {
+    return '字典Code不能为空!';
+  }
+  //优先从缓存中读取字典配置
+  if(getDictItemsFromCache(dictCode)){
+    let res = {}
+    res.result = getDictItemsFromCache(dictCode);
+    res.success = true;
+    return res;
+  }
+  //获取字典数组
+  let res = await ajaxGetDictItems(dictCode);
+  return res;
+}
+
+/**
+ * 字典值替换文本通用方法
+ * @param dictOptions  字典数组
+ * @param text  字典值
+ * @return String
+ */
+export function filterDictText(dictOptions, text) {
+  // --update-begin----author:sunjianlei---date:20200323------for: 字典翻译 text 允许逗号分隔 ---
+  if (text != null && Array.isArray(dictOptions)) {
+    let result = []
+    // 允许多个逗号分隔,允许传数组对象
+    let splitText
+    if (Array.isArray(text)) {
+      splitText = text
+    } else {
+      splitText = text.toString().trim().split(',')
+    }
+    for (let txt of splitText) {
+      let dictText = txt
+      for (let dictItem of dictOptions) {
+        if (txt.toString() === dictItem.value.toString()) {
+          dictText = (dictItem.text || dictItem.title || dictItem.label)
+          break
+        }
+      }
+      result.push(dictText)
+    }
+    return result.join(',')
+  }
+  return text
+  // --update-end----author:sunjianlei---date:20200323------for: 字典翻译 text 允许逗号分隔 ---
+}
+
+/**
+ * 字典值替换文本通用方法(多选)
+ * @param dictOptions  字典数组
+ * @param text  字典值
+ * @return String
+ */
+export function filterMultiDictText(dictOptions, text) {
+  //js “!text” 认为0为空,所以做提前处理
+  if(text === 0 || text === '0'){
+    if(dictOptions){
+      for (let dictItem of dictOptions) {
+        if (text == dictItem.value) {
+          return dictItem.text
+        }
+      }
+    }
+  }
+
+  if(!text || text=='null' || !dictOptions || dictOptions.length==0){
+    return ""
+  }
+  let re = "";
+  text = text.toString()
+  let arr = text.split(",")
+  dictOptions.forEach(function (option) {
+    if(option){
+      for(let i=0;i<arr.length;i++){
+        if (arr[i] === option.value) {
+          re += option.text+",";
+          break;
+        }
+      }
+    }
+  });
+  if(re==""){
+    return text;
+  }
+  return re.substring(0,re.length-1);
+}
+
+/**
+ * 翻译字段值对应的文本
+ * @param children
+ * @returns string
+ */
+export function filterDictTextByCache(dictCode, key) {
+  if(key==null ||key.length==0){
+    return;
+  }
+  if (!dictCode) {
+    return '字典Code不能为空!';
+  }
+   //优先从缓存中读取字典配置
+  if(getDictItemsFromCache(dictCode)){
+    let item = getDictItemsFromCache(dictCode).filter(t => t["value"] == key)
+    if(item && item.length>0){
+      return item[0]["text"]
+    }
+  }
+}
+
+/** 通过code获取字典数组 */
+export async function getDictItems(dictCode, params) {
+    //优先从缓存中读取字典配置
+    if(getDictItemsFromCache(dictCode)){
+      let desformDictItems = getDictItemsFromCache(dictCode).map(item => ({...item, label: item.text}))
+      return desformDictItems;
+    }
+
+    //缓存中没有,就请求后台
+    return await ajaxGetDictItems(dictCode, params).then(({success, result}) => {
+      if (success) {
+        let res = result.map(item => ({...item, label: item.text}))
+        console.log('------- 从DB中获取到了字典-------dictCode : ', dictCode, res)
+        return Promise.resolve(res)
+      } else {
+        console.error('getDictItems error: : ', res)
+        return Promise.resolve([])
+      }
+    }).catch((res) => {
+      console.error('getDictItems error: ', res)
+      return Promise.resolve([])
+    })
+}

+ 84 - 0
.svn/pristine/06/069e7ab8fb6b0318e9aaa519293de2d8808c4037.svn-base

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <hdzhx-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></hdzhx-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import HdzhxForm from './HdzhxForm'
+
+  export default {
+    name: 'HdzhxModal',
+    components: {
+      HdzhxForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 137 - 0
.svn/pristine/07/0726a481f3bbb8673312e627943e929329e839a1.svn-base

@@ -0,0 +1,137 @@
+<template>
+    <a-spin :spinning="confirmLoading">
+        <j-form-container :disabled="formDisabled">
+            <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+                <a-row>
+                    <a-col :span="24">
+                        <a-form-model-item label="河流名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hlmc">
+                            <j-popup
+                                v-model="model.hlmc"
+                                field="hlmc"
+                                org-fields="hlmc,hlbm"
+                                dest-fields="hlmc,hlbm"
+                                code="hllist"
+                                :multi="true"
+                                @input="popupCallback"
+                            />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="河流编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hlbm">
+                            <a-input v-model="model.hlbm" placeholder="请输入河流编码"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="岸别" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ab">
+                            <j-dict-select-tag type="list" v-model="model.ab" dictCode="ab" placeholder="请选择岸别"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="绿化长度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lhcd">
+                            <a-input-number v-model="model.lhcd" placeholder="请输入绿化长度" style="width: 100%"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="绿化宽度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lhkd">
+                            <a-input-number v-model="model.lhkd" placeholder="请输入绿化宽度" style="width: 100%"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="导入矢量数据" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="geopath">
+                            <j-upload v-model="model.geopath"  biz-path="hzz"></j-upload>
+                        </a-form-model-item>
+                    </a-col>
+                </a-row>
+            </a-form-model>
+        </j-form-container>
+    </a-spin>
+</template>
+
+<script>
+
+import {httpAction, getAction} from '@/api/manage'
+import {validateDuplicateValue} from '@/utils/util'
+
+export default {
+    name: 'RmAxlhForm',
+    components: {},
+    props: {
+        //表单禁用
+        disabled: {
+            type: Boolean,
+            default: false,
+            required: false
+        }
+    },
+    data() {
+        return {
+            model: {},
+            labelCol: {
+                xs: {span: 24},
+                sm: {span: 5},
+            },
+            wrapperCol: {
+                xs: {span: 24},
+                sm: {span: 16},
+            },
+            confirmLoading: false,
+            validatorRules: {},
+            url: {
+                add: "/hzz.axgh.axlh/rmAxlh/add",
+                edit: "/hzz.axgh.axlh/rmAxlh/edit",
+                queryById: "/hzz.axgh.axlh/rmAxlh/queryById"
+            }
+        }
+    },
+    computed: {
+        formDisabled() {
+            return this.disabled
+        },
+    },
+    created() {
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+        add() {
+            this.edit(this.modelDefault);
+        },
+        edit(record) {
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        submitForm() {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let httpurl = '';
+                    let method = '';
+                    if (!this.model.id) {
+                        httpurl += this.url.add;
+                        method = 'post';
+                    } else {
+                        httpurl += this.url.edit;
+                        method = 'post';
+                    }
+                    httpAction(httpurl, this.model, method).then((res) => {
+                        if (res.success) {
+                            that.$message.success(res.message);
+                            that.$emit('ok');
+                        } else {
+                            that.$message.warning(res.message);
+                        }
+                    }).finally(() => {
+                        that.confirmLoading = false;
+                    })
+                }
+
+            })
+        },
+        popupCallback(value, row) {
+            this.model = Object.assign(this.model, row);
+        },
+    }
+}
+</script>

+ 10 - 0
.svn/pristine/07/0728422c4490323a307deb4ec594feb408ef5699.svn-base

@@ -0,0 +1,10 @@
+/** init domain config */
+import Vue from 'vue'
+//设置全局API_BASE_URL
+Vue.prototype.API_BASE_URL = process.env.VUE_APP_API_BASE_URL
+window._CONFIG['domianURL'] = Vue.prototype.API_BASE_URL
+//单点登录地址
+window._CONFIG['casPrefixUrl'] = process.env.VUE_APP_CAS_BASE_URL
+window._CONFIG['onlinePreviewDomainURL'] =  process.env.VUE_APP_ONLINE_BASE_URL
+window._CONFIG['staticDomainURL'] = Vue.prototype.API_BASE_URL + '/sys/common/static'
+window._CONFIG['pdfDomainURL'] = Vue.prototype.API_BASE_URL+ '/sys/common/pdf/pdfPreviewIframe'

+ 128 - 0
.svn/pristine/07/074bf6a554e321b421458ce694ea530001d75b66.svn-base

@@ -0,0 +1,128 @@
+<template>
+    <a-spin :spinning="confirmLoading">
+        <j-form-container :disabled="formDisabled">
+            <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+                <a-row>
+                    <a-col :span="24">
+                        <a-form-model-item label="河湖编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hhbm">
+                            <a-input v-model="model.hhbm" placeholder="请输入河湖编码"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="河湖名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hhmc">
+                            <a-input v-model="model.hhmc" placeholder="请输入河湖名称"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="河湖类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hhlx">
+                            <a-input v-model="model.hhlx" placeholder="请输入河湖类型"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="县区编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xqbm">
+                            <a-input v-model="model.xqbm" placeholder="请输入系县区编码"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="县区名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xqmc">
+                            <a-input v-model="model.xqmc" placeholder="请输入县区名称"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="24">
+                        <a-form-model-item label="岸别" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zya">
+<!--                            <a-input v-model="model.zya" placeholder="请输入左右岸"></a-input>-->
+                            <j-dict-select-tag type="list" v-model="model.zya" dictCode="ab" placeholder="请选择岸别"/>
+                        </a-form-model-item>
+                    </a-col>
+                </a-row>
+            </a-form-model>
+        </j-form-container>
+    </a-spin>
+</template>
+
+<script>
+
+import {httpAction, getAction} from '@/api/manage'
+import {validateDuplicateValue} from '@/utils/util'
+
+export default {
+    name: 'WykzxForm',
+    components: {},
+    props: {
+        //表单禁用
+        disabled: {
+            type: Boolean,
+            default: false,
+            required: false
+        }
+    },
+    data() {
+        return {
+            model: {},
+            labelCol: {
+                xs: {span: 24},
+                sm: {span: 6},
+            },
+            wrapperCol: {
+                xs: {span: 24},
+                sm: {span: 15},
+            },
+            confirmLoading: false,
+            validatorRules: {},
+            url: {
+                add: "/hzz.axgh.axghgnq/wykzx/list_wy/add",
+                edit: "/hzz.axgh.axghgnq/wykzx/list_wy/edit",
+                queryById: "/hzz.axgh.axghgnq/wykzx/list_wy/queryById"
+            }
+        }
+    },
+    computed: {
+        formDisabled() {
+            return this.disabled
+        },
+    },
+    created() {
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+        add() {
+            this.edit(this.modelDefault);
+        },
+        edit(record) {
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        submitForm() {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let httpurl = '';
+                    let method = '';
+                    if (!this.model.id) {
+                        httpurl += this.url.add;
+                        method = 'post';
+                    } else {
+                        httpurl += this.url.edit;
+                        //method = 'put';
+                        method = 'post';
+                    }
+                    httpAction(httpurl, this.model, method).then((res) => {
+                        if (res.success) {
+                            that.$message.success(res.message);
+                            that.$emit('ok');
+                        } else {
+                            that.$message.warning(res.message);
+                        }
+                    }).finally(() => {
+                        that.confirmLoading = false;
+                    })
+                }
+
+            })
+        }
+    }
+}
+</script>

+ 35 - 0
.svn/pristine/07/074d21d9955a167ce9d2fa4bffd165f2e9d1bd02.svn-base

@@ -0,0 +1,35 @@
+@active-color: #4a4a48;
+ul {
+  max-height: 700px;
+  overflow-y: auto;
+  padding-left: .5rem;
+  i {
+    font-size: 1.5rem;
+    border: 1px solid #f1f1f1;
+    padding: .2rem;
+    margin: .3rem;
+    cursor: pointer;
+    &.active, &:hover {
+      border-radius: 2px;
+      border-color: @active-color;
+      background-color: @active-color;
+      color: #fff;
+      transition: all .3s;
+    }
+  }
+  li {
+    list-style: none;
+    float: left;
+    width: 5%;
+    text-align: center;
+    cursor: pointer;
+    color: #555;
+    transition: color .3s ease-in-out,background-color .3s ease-in-out;
+    position: relative;
+    margin: 3px 0;
+    border-radius: 4px;
+    background-color: #fff;
+    overflow: hidden;
+    padding: 10px 0 0;
+  }
+}

+ 12 - 0
.svn/pristine/07/07560f287bfe2a2a158cd1933a22d1224c13e6d0.svn-base

@@ -0,0 +1,12 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import { constantRouterMap } from '@/config/router.config'
+
+Vue.use(Router)
+
+export default new Router({
+  mode: 'history',
+  base: process.env.BASE_URL,
+  scrollBehavior: () => ({ y: 0 }),
+  routes: constantRouterMap
+})

+ 24 - 0
.svn/pristine/08/0861c7777a35128b0a3353d6132abe4a103f4ef0.svn-base

@@ -0,0 +1,24 @@
+'use strict'
+const path = require('path')
+
+function resolve (dir) {
+  return path.join(__dirname, '.', dir)
+}
+
+module.exports = {
+    context: path.resolve(__dirname, './'),
+    resolve: {
+        extensions: ['.js', '.vue', '.json'],
+        alias: {
+            'config': resolve('config'),
+            '@': resolve('src'),
+            '@views': resolve('src/views'),
+            '@comp': resolve('src/components'),
+            '@core': resolve('src/core'),
+            '@utils': resolve('src/utils'),
+            '@entry': resolve('src/entry'),
+            '@router': resolve('src/router'),
+            '@store': resolve('src/store')
+        }
+    },
+}

+ 246 - 0
.svn/pristine/08/08c6731efc7221fbc2557612030fa258240c2138.svn-base

@@ -0,0 +1,246 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="管线名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxmc">
+              <a-input v-model="model.gxmc" placeholder="请输入管线名称"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="所在河流" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="szhl">
+              <j-popup
+                v-model="model.szhl"
+                field="szhl"
+                org-fields="hlmc"
+                dest-fields="szhl"
+                code="hllist"
+                :multi="false"
+                @input="popupCallback"
+              />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="市级河长" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjhz">
+              <a-input v-model="model.sjhz" placeholder="请输入市级河长"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="县级河长" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xjhz">
+              <a-input v-model="model.xjhz" placeholder="请输入县级河长"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="行政位置(县、乡、村)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xzwz">
+             <j-area-linkage type="cascader" v-model="model.xzwz" placeholder="请输入省市区"  />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="经度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jd">
+              <a-input v-model="model.jd" placeholder="请输入经度"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="纬度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="wd">
+              <a-input v-model="model.wd" placeholder="请输入纬度"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="始建时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjsj">
+              <a-input v-model="model.sjsj" placeholder="请输入始建时间"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线敷设方式" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxfsfs">
+              <a-input v-model="model.gxfsfs" placeholder="请输入管线敷设方式"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线与河道交叉方式" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxyhdjcfs">
+              <a-input v-model="model.gxyhdjcfs" placeholder="请输入管线与河道交叉方式"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="河道内管线总长(m)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdngxzc">
+              <a-input v-model="model.hdngxzc" placeholder="请输入河道内管线总长(m)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线与河道中心线交角(°)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxyhdzxx">
+              <a-input v-model="model.gxyhdzxx" placeholder="请输入管线与河道中心线交角(°)"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线所在岸线功能区类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxczangn">
+              <a-input v-model="model.gxczangn" placeholder="请输入管线所在岸线功能区类型"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线建设方案审查许可是否取得" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxjsfascsfqd">
+              <j-dict-select-tag type="list" v-model="model.gxjsfascsfqd" dictCode="yn" placeholder="请选择管线建设方案审查许可是否取得" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线建设方案审查许可审批部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxjsfascspbm">
+              <a-input v-model="model.gxjsfascspbm" placeholder="请输入管线建设方案审查许可审批部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线建设方案审查许可审批文号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxjsfascspwh">
+              <a-input v-model="model.gxjsfascspwh" placeholder="请输入管线建设方案审查许可审批文号"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线竣工验收水行政主管部门是否参加" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxjgyssxzzgsfcj">
+              <j-dict-select-tag type="list" v-model="model.gxjgyssxzzgsfcj" dictCode="yn" placeholder="请选择管线竣工验收水行政主管部门是否参加" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线竣工验收水行政主管部门参加部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxjgyssxzzgcjbm">
+              <a-input v-model="model.gxjgyssxzzgcjbm" placeholder="请输入管线竣工验收水行政主管部门参加部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管线竣工验收水行政主管部门是否同意验收" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gxjgyssxzzgsftyys">
+              <j-dict-select-tag type="list" v-model="model.gxjgyssxzzgsftyys" dictCode="yn" placeholder="请选择管线竣工验收水行政主管部门是否同意验收" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管理单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gldw">
+              <a-input v-model="model.gldw" placeholder="请输入管理单位"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="主管部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zgbm">
+              <a-input v-model="model.zgbm" placeholder="请输入主管部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="架设高度(m)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jsgu">
+              <a-input v-model="model.jsgu" placeholder="请输入架设高度(m)"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="防洪评价日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhpjrq">
+              <a-input v-model="model.fhpjrq" placeholder="请输入防洪评价日期"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="是否为评估保留项目" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sfwpgblxm">
+              <j-dict-select-tag type="list" v-model="model.sfwpgblxm" dictCode="yn" placeholder="是否为评估保留项目" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="评估意见" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="yjpg">
+              <a-textarea v-model="model.yjpg" rows="4" placeholder="请输入评估意见" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="bz">
+              <a-textarea v-model="model.bz" rows="4" placeholder="请输入备注" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="上传审批文件" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="scwj">
+              <j-upload v-model="model.scwj"  ></j-upload>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'RmGxqktjbForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+           gxmc: [
+              { required: true, message: '请输入管线名称!'},
+           ],
+        },
+        url: {
+          add: "/hzz.shjsgc.lhgc.gx/rmGxqktjb/add",
+          edit: "/hzz.shjsgc.lhgc.gx/rmGxqktjb/edit",
+          queryById: "/hzz.shjsgc.lhgc.gx/rmGxqktjb/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               // method = 'put';
+              method = 'post';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 423 - 0
.svn/pristine/08/08d179dd4c373efdaaeb7c0e49dadd0d6e934a9c.svn-base

@@ -0,0 +1,423 @@
+<template>
+    <div>
+        <div id="toolBar" class="toolBar ol-unselectable">
+            <ul class="nav nav-pills">
+                <li v-if="isRes"
+                    @click="resShow=!resShow;coordsShow=false;measureShow=false;queryShow=false;drawShow = false;">
+                    <a><img
+                        src="@/assets/layers.png" width="24"> 图层</a></li>
+                <res-catalog v-if="isRes" id="resourceCatalog" v-model="resShow"></res-catalog>
+                <li v-if="isQuery" @click="queryShow=!queryShow; resShow=false;coordsShow=false;measureShow=false;drawShow = false;">
+                    <a><img src="@/assets/query.png" width="24"> 查询</a>
+                </li>
+                <query-tool v-if="isQuery" id="queryTool" ref="queryTool" v-model="queryShow"></query-tool>
+                <li v-if="isCoords"
+                    @click="coordsShow=!coordsShow;resShow=false;measureShow=false;queryShow=false;drawShow = false;">
+                    <a><img
+                        src="@/assets/locationTool.png" width="24"> 定位</a></li>
+                <coords-locate v-if="isCoords" id="coordsLocate" ref="coordsLocate"
+                               v-model="coordsShow"></coords-locate>
+                <!--        <li v-if="isExtent" id="zoomToFullExtent" @click="zoomToFullExtent"><a><img src="@/assets/ZoomFullExtent.png" width="24">
+                          全图</a></li>-->
+                <li v-if="isMeasure" @click="handleMeasure"><a><img src="@/assets/measureTool.png" width="24"> 测量</a>
+                </li>
+                <measure-tool v-if="isMeasure" ref="measureToll" id="measureTool" v-model="measureShow"
+                              :output.sync="output"></measure-tool>
+                <li v-if="isDraw" @click="handleDrawTool"><a><img
+                    src="@/assets/drawPencil.png" width="24"> 标绘</a></li>
+                <draw-tool v-if="isDraw" ref="drawTool" id="drawTool" v-model="drawShow"></draw-tool>
+                <li v-if="isClear" id="clearTool" @click="handleClear"><a><img src="@/assets/clear.png" width="24">
+                    清除</a></li>
+            </ul>
+        </div>
+        <!--    点选查询弹框-->
+        <div class="ant-popover ant-popover-placement-top popup" id="popup" ref="popup" v-show="tabs.length!==0">
+            <div class="ant-popover-content">
+                <div class="ant-popover-arrow"></div>
+                <div role="tooltip" class="ant-popover-inner">
+                    <div>
+                        <div class="ant-popover-inner-content">
+                            <div style="width: 320px">
+                                <a-tabs default-active-key="1" tab-position="top" :style="{ 'min-height': '200px' }">
+                                    <a-tab-pane v-for="(tab,i) in tabs" :key="i" :tab="tab.name">
+                                        <a-descriptions bordered :column='1'>
+                                            <a-descriptions-item v-for="(item,index) in tab.inner" :label="item.label">
+                                                {{ item.content }}
+                                            </a-descriptions-item>
+                                        </a-descriptions>
+                                    </a-tab-pane>
+                                </a-tabs>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+</template>
+
+<script>
+import * as olEasing from 'ol/easing';
+import axios from "axios";
+import Overlay from "ol/Overlay";
+import {getAction} from "../../../api/manage";
+
+// 组件
+import CoordsLocate from '@/components/BasicMap/Tools/CoordsLocate.vue';
+import ResCatalog from "@/components/BasicMap/Tools/ResCatalog";
+import MeasureTool from '@/components/BasicMap/Tools/MeasureTool.vue'
+import QueryTool from '@/components/BasicMap/Tools/QueryTool.vue'
+import DrawTool from '@/components/BasicMap/Tools/DrawTool.vue';
+import {DragBox} from "ol/interaction";
+import {platformModifierKeyOnly} from "ol/events/condition";
+
+export default {
+    name: 'Toolbar',
+    components: {
+        CoordsLocate,
+        ResCatalog,
+        MeasureTool,
+        QueryTool,
+        DrawTool
+    },
+    data() {
+        return {
+            isRes: false,
+            isQuery: false,
+            isCoords: false,
+            isMeasure: false,
+            isDraw: false,
+            isClear: false,
+            isExtent: false,
+            coordsShow: false,
+            resShow: false,
+            measureShow: false,
+            queryShow: false,
+            drawShow: false,
+            properties: {},
+            labels: [],
+            tabs: [],
+            map: {},
+            currentCoordinate: null, // 弹窗坐标数据
+            overlay: null,
+            mapCursorKey: '',
+            output: '',
+            dataport: '',
+            relfield: '',
+        }
+
+    },
+    props: {
+        tools: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        splitScreen: {}
+    },
+    mounted() {
+        if (this.tools.length === 0) {
+            this.isRes = true;
+            this.isClear = true;
+            this.isDraw = true;
+            this.isCoords = true;
+            this.isExtent = true;
+            this.isMeasure = true;
+            this.isQuery = true;
+        } else {
+            this.tools.forEach((item) => {
+                this[item] = true;
+            })
+        }
+        // this.initPopup();
+    },
+    watch: {
+        measureShow: function (newValue) {
+
+            if (newValue === false) {
+                this.$refs.measureToll.closeMeasureTool(this.baseMap.map);
+                this.baseMap.map.getOverlays().clear();
+                if (this.drawShow === false) {
+                    this.initPopup();
+                }
+            } else {
+                //移除点击事件
+                this.map.un(this.mapCursorKey.type, this.mapCursorKey.listener);
+                this.overlay.setPosition(undefined);
+                this.currentCoordinate = null;
+            }
+        }
+    },
+    provide() {
+        return {
+            splitScreen: this.splitScreen,
+        }
+    },
+    inject: ['baseMap'],
+    methods: {
+        handleDrawTool() {
+            this.measureShow = false;
+            this.coordsShow = false;
+            this.resShow = false;
+            this.queryShow = false;
+            this.drawShow = !this.drawShow;
+            if (this.drawShow) {
+                this.baseMap.map.getOverlays().clear();
+                this.$refs.drawTool.initDrawLayer();
+                // initVectorLayer(this.baseMap.map);
+                // this.output = initMeasureTool();
+            }
+        },
+        handleMeasure() {
+            this.measureShow = !this.measureShow;
+            this.coordsShow = false;
+            this.resShow = false;
+            this.queryShow = false;
+            this.drawShow = false;
+            if (this.measureShow) {
+                this.baseMap.map.getOverlays().clear();
+                this.$refs.measureToll.onChange();
+                // initVectorLayer(this.baseMap.map);
+                // this.output = initMeasureTool();
+            }
+        },
+        handleClear() {
+            this.measureShow = false;
+            this.coordsShow = false;
+            this.resShow = false;
+            this.queryShow = false;
+            this.drawShow = false;
+            this.$refs.measureToll.closeMeasureTool(this.baseMap.map);
+            this.$refs.coordsLocate.resetForm();
+            this.$refs.queryTool.clear();
+            this.$refs.drawTool.clearFeature();
+        },
+        zoomToFullExtent() {
+            let extent = [115.75550079345703, 36.407955169677734, 117.60053253173828, 38.01062774658203];
+            this.baseMap.map.getView().fit(extent, {
+                // size:[500,300],
+                duration: 500,
+                padding: [10, 10, 10, 10],
+                easing: olEasing.inAndOut
+            })
+        },
+        // 递归查找
+        getTreeExpandKeys(obj, name) {
+            // obj是传入的array
+            if (obj && obj.length !== 0) {
+                obj.forEach((item, index) => {
+                    if (item.alias === name) {
+                        this.labels = item.fields;
+                        this.relfield = item.relfield;
+                        this.dataport = item.dataport;
+                        return;
+                    }
+                    // 如果此列表有children, 进行递归
+                    if (item.layers) {
+                        this.getTreeExpandKeys(item.layers, name)
+                    }
+                })
+            }
+        },
+        initPopup() {
+            // 弹窗
+            this.overlay = new Overlay({
+                element: this.$refs.popup, // 弹窗标签,在html里
+                autoPan: true, // 如果弹窗在底图边缘时,底图会移动
+                autoPanAnimation: { // 底图移动动画
+                    duration: 250
+                },
+            });
+            this.map = this.baseMap.map;
+            this.map.addOverlay(this.overlay);
+            this.mapClick() // 初始化地图成功后,给地图添加点击事件
+            const dragBox = new DragBox({
+                condition: platformModifierKeyOnly,
+            });
+            this.map.addInteraction(dragBox);
+            dragBox.on('boxend', (evt) => {
+                const extent = dragBox.getGeometry().getExtent();
+                let queryLayer = this.getVisibleLayers();
+                if (queryLayer.length === 0) return;
+                queryLayer.forEach((item) => {
+                    let vectorSource = item.layer.getSource();
+                    /*const boxFeatures = vectorSource
+                      .getFeaturesInExtent(extent)
+                      .filter((feature) => feature.getGeometry().intersectsExtent(extent));*/
+                    // console.log(boxFeatures);
+                })
+
+
+            });
+        },
+        mapClick() { // 地图点击事件
+            // 通过 map.on() 监听,singleclick 是单击的意思。也可以用 click 代替 singleclick。
+            this.mapCursorKey = this.map.on('singleclick', evt => {
+                this.currentCoordinate = evt.coordinate; // 获取坐标
+                this.tabs = [];
+                let viewResolution = this.map.getView().getResolution();
+                // 获取可查的图层
+                let queryLayer = this.getVisibleLayers();
+                if (queryLayer.length === 0) return;
+                queryLayer.forEach((item) => {
+                    let url = item.layer.getSource().getFeatureInfoUrl(
+                        this.currentCoordinate,
+                        viewResolution,
+                        'EPSG:4490',
+                        {
+                            'INFO_FORMAT': 'application/json', //geoserver支持jsonp才能输出为jsonp的格式
+                            'FEATURE_COUNT': 50 //点击查询能返回的数量上限
+                        });
+                    axios({url, method: 'get'})
+                        .then(async (res) => {
+                            let {status, data: {features}} = res;
+                            if (status === 200) {
+                                if (features.length === 0) return;
+                                this.properties = features[0].properties;
+                                this.getTreeExpandKeys(this.baseMap.list, item.name);
+                                let labels = this.labels;
+                                if (this.dataport) {
+                                    let {
+                                        message,
+                                        success,
+                                        result
+                                    } = await getAction(this.dataport, {id: this.properties[this.relfield]});
+                                    if (success) {
+                                        this.properties = result;
+                                    } else {
+                                        this.$message.error(message);
+                                        return;
+                                    }
+                                    this.dataport = '';
+                                }
+                                if (labels.length > 0) {
+                                    labels.forEach((itemA) => {
+                                        itemA.content = this.properties[itemA.name];
+                                    });
+                                    let tab = {name: item.name, inner: labels};
+                                    this.tabs.push({...tab});
+                                    setTimeout(() => {
+                                        // 设置弹窗位置
+                                        // 这里要设置定时器, 不然弹窗首次出现, 底图会跑偏
+                                        this.overlay.setPosition(this.currentCoordinate);
+                                    }, 0)
+                                }
+                            } else {
+                                console.log('错误');
+                            }
+                        });
+
+                })
+            });
+
+        },
+
+        getVisibleLayers(layerName) {
+            let layer = [];
+            let item = {};
+            let layers = this.map.getLayers();
+            let layerCount = layers.getLength();
+            for (let i = 0; i < layerCount; i++) {
+                let visible = layers.item(i).get('visible');
+                let name = layers.item(i).get('alias');
+                if (visible && name) {
+                    item = {name, 'layer': layers.item(i)}
+                    layer.push(item);
+                }
+            }
+            return layer;
+        },
+    }
+}
+</script>
+
+<style scoped="scoped">
+.toolBar {
+    position: absolute;
+    top: 0.8em;
+    left: 5em;
+    border-radius: 4px;
+    padding: 0;
+    margin: 0;
+    background-color: whitesmoke;
+    cursor: pointer;
+    z-index: 1;
+    box-shadow: 0 0 5px #357ee5;
+    opacity: 0.9;
+}
+
+.nav {
+    padding-left: 0;
+    margin-bottom: 0;
+    list-style: none;
+    display: flex;
+}
+
+.nav-pills > li {
+    float: left;
+}
+
+.nav > li {
+    position: relative;
+    display: block;
+}
+
+.nav-pills > li + li {
+    margin-left: 2px;
+}
+
+.nav-pills > li > a {
+    border-radius: 4px;
+}
+
+.nav > li > a {
+    position: relative;
+    display: block;
+    padding: 10px 15px;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+    text-decoration: none;
+    background-color: #eeeeee;
+}
+
+a {
+    color: #337ab7;
+    text-decoration: none;
+}
+
+.nav > li > a > img {
+    max-width: none;
+}
+
+img {
+    vertical-align: middle;
+}
+
+#measureTool, #drawTool {
+    position: absolute;
+    top: 52px;
+    left: 0px;
+}
+
+#coordsLocate {
+    position: absolute;
+    top: 52px;
+    left: 0;
+}
+
+#resourceCatalog {
+    position: absolute;
+    top: 52px;
+    left: 0;
+}
+
+#queryTool {
+    position: absolute;
+    top: 52px;
+    left: 0;
+}
+</style>

+ 192 - 0
.svn/pristine/08/08f4f0f3e754f3fc0162eda71bf0b4def648127e.svn-base

@@ -0,0 +1,192 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+
+          <a-col :span="6">
+            <a-form-item label="标题">
+              <a-input placeholder="请输入标题" v-model="queryParam.titile"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="发布人">
+              <a-input placeholder="请输入发布人" v-model="queryParam.sender"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="8" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <div class="table-operator">
+      <a-button type="primary" @click="readAll" icon="book">全部标注已读</a-button>
+    </div>
+
+    <a-table
+      ref="table"
+      size="default"
+      bordered
+      rowKey="id"
+      :columns="columns"
+      :dataSource="dataSource"
+      :pagination="ipagination"
+      :loading="loading"
+      @change="handleTableChange">
+      <span slot="action" slot-scope="text, record">
+        <a @click="showAnnouncement(record)">查看</a>
+      </span>
+    </a-table>
+    <show-announcement ref="ShowAnnouncement"></show-announcement>
+    <dynamic-notice ref="showDynamNotice" :path="openPath" :formData="formData"/>
+  </a-card>
+</template>
+
+<script>
+  import { filterObj } from '@/utils/util'
+  import { getAction,putAction } from '@/api/manage'
+  import ShowAnnouncement from '@/components/tools/ShowAnnouncement'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import DynamicNotice from '../../components/tools/DynamicNotice'
+
+  export default {
+    name: "UserAnnouncementList",
+    mixins: [JeecgListMixin],
+    components: {
+      DynamicNotice,
+      ShowAnnouncement
+    },
+    data () {
+      return {
+        description: '系统通告表管理页面',
+        queryParam: {},
+        columns: [{
+          title: '标题',
+          align:"center",
+          dataIndex: 'titile'
+        },{
+          title: '消息类型',
+          align: "center",
+          dataIndex: 'msgCategory',
+          customRender: function (text) {
+            if (text == '1') {
+              return "通知公告";
+            } else if (text == "2") {
+              return "系统消息";
+            } else {
+              return text;
+            }
+          }
+        },{
+          title: '发布人',
+          align:"center",
+          dataIndex: 'sender'
+        },{
+          title: '发布时间',
+          align:"center",
+          dataIndex: 'sendTime'
+        },{
+          title: '优先级',
+          align:"center",
+          dataIndex: 'priority',
+          customRender:function (text) {
+            if(text=='L'){
+              return "低";
+            }else if(text=="M"){
+              return "中";
+            }else if(text=="H"){
+              return "高";
+            } else {
+              return text;
+            }
+          }
+        },{
+          title: '阅读状态',
+          align:"center",
+          dataIndex: 'readFlag',
+          customRender:function (text) {
+            if(text=='0'){
+              return "未读";
+            }else if(text=="1"){
+              return "已读";
+            } else {
+              return text;
+            }
+          }
+        },{
+          title: '操作',
+          dataIndex: 'action',
+          align:"center",
+          scopedSlots: { customRender: 'action' },
+        }],
+		    url: {
+          list: "/sys/sysAnnouncementSend/getMyAnnouncementSend",
+          editCementSend:"sys/sysAnnouncementSend/editByAnntIdAndUserId",
+          readAllMsg:"sys/sysAnnouncementSend/readAll",
+        },
+        loading:false,
+        openPath:'',
+        formData:''
+      }
+    },
+    methods: {
+      handleDetail: function(record){
+        this.$refs.sysAnnouncementModal.detail(record);
+        this.$refs.sysAnnouncementModal.title="查看";
+      },
+      showAnnouncement(record){
+        putAction(this.url.editCementSend,{anntId:record.anntId}).then((res)=>{
+          if(res.success){
+            this.loadData();
+            this.syncHeadNotic(record.anntId)
+          }
+        });
+        if(record.openType==='component'){
+          this.openPath = record.openPage;
+          this.formData = {id:record.busId};
+          this.$refs.showDynamNotice.detail();
+        }else{
+          this.$refs.ShowAnnouncement.detail(record);
+        }
+      },
+      syncHeadNotic(anntId){
+        getAction("sys/annountCement/syncNotic",{anntId:anntId})
+      },
+      readAll(){
+        var that = this;
+        that.$confirm({
+          title:"确认操作",
+          content:"是否全部标注已读?",
+          onOk: function(){
+            putAction(that.url.readAllMsg).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.loadData();
+                that.syncHeadNotic();
+              }
+            });
+          }
+        });
+      },
+    }
+  }
+</script>
+<style scoped>
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}z
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>

BIN
.svn/pristine/09/091455cdc6f194a4489f195ec445491e245c449f.svn-base


+ 19 - 0
.svn/pristine/09/09985e4ccde8ff8b5b933dc427fb821545035013.svn-base

@@ -0,0 +1,19 @@
+const types = {
+  403: {
+    img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg',
+    title: '403',
+    desc: '抱歉,你无权访问该页面'
+  },
+  404: {
+    img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg',
+    title: '404',
+    desc: '抱歉,你访问的页面不存在或无权访问'
+  },
+  500: {
+    img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg',
+    title: '500',
+    desc: '抱歉,服务器出错了'
+  }
+}
+
+export default types

+ 559 - 0
.svn/pristine/09/0999385bdfde902516210fc804e368375f22f762.svn-base

@@ -0,0 +1,559 @@
+<template>
+    <j-modal
+        :title="title"
+        :width="width"
+        :visible="visible"
+        :confirmLoading="confirmLoading"
+        switchFullscreen
+        :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+        @ok="handleOk"
+        @cancel="handleCancel"
+        cancelText="关闭">
+        <a-spin :spinning="confirmLoading">
+          <j-form-container :disabled="disableSubmit">
+            <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+                <a-row>
+                    <a-col :span="8">
+                        <a-form-model-item label="河(渠)名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hqmc">
+                            <j-popup
+                                v-model="model.hqmc"
+                                field="hqmc"
+                                org-fields="hlmc"
+                                dest-fields="hqmc"
+                                code="hllist"
+                                :multi="true"
+                                @input="popupCallback"
+                            />
+                        </a-form-model-item>
+                    </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="河段类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdlx">
+                      <j-dict-select-tag type="list" v-model="model.hdlx" dictCode="xzhq" placeholder="请选择河段类型" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="断面桩号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dmzh">
+                      <a-input v-model="model.dmzh" placeholder="请输入断面桩号" ></a-input>
+                    </a-form-model-item>
+                  </a-col>
+                  <div v-show="model.hdlx=='hd'">
+                    <a-divider dashed>防洪标准</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzXz">
+                            <a-input v-model="model.fhbzXz" placeholder="请输入现状防洪标准" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzSj">
+                            <a-input v-model="model.fhbzSj" placeholder="请输入设计防洪标准" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzGh">
+                            <a-input v-model="model.fhbzGh" placeholder="请输入规划防洪标准" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>设计防洪水位(m)</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjfhswXz">
+                            <a-input v-model="model.sjfhswXz" placeholder="请输入现状防洪水位" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjfhswSj">
+                            <a-input v-model="model.sjfhswSj" placeholder="请输入设计防洪水位" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjfhswGh">
+                            <a-input v-model="model.sjfhswGh" placeholder="请输入规划防洪水位" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>相应防洪流量(m³/s)</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyfhllXz">
+                            <a-input v-model="model.xyfhllXz" placeholder="请输入现状防洪流量" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyfhllSj">
+                            <a-input v-model="model.xyfhllSj" placeholder="请输入设计防洪流量" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyfhllGh">
+                            <a-input v-model="model.xyfhllGh" placeholder="请输入规划防洪流量" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>排涝标准</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="plbzXz">
+                            <a-input v-model="model.plbzXz" placeholder="请输入现状排涝标准" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="plbzSj">
+                            <a-input v-model="model.plbzSj" placeholder="请输入设计排涝标准" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="plbzGh">
+                            <a-input v-model="model.plbzGh" placeholder="请输入规划排涝标准" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>设计排涝水位(m)</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjplswXz">
+                            <a-input v-model="model.sjplswXz" placeholder="请输入现状排涝水位" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjplswSj">
+                            <a-input v-model="model.sjplswSj" placeholder="请输入设计排涝水位" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjplswGh">
+                            <a-input v-model="model.sjplswGh" placeholder="请输入规划排涝水位" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>相应排涝流量(m³/s)</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyplllXz">
+                            <a-input v-model="model.xyplllXz" placeholder="请输入现状排涝流量" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyplllSj">
+                            <a-input v-model="model.xyplllSj" placeholder="请输入设计排涝流量" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyplllGh">
+                            <a-input v-model="model.xyplllGh" placeholder="请输入规划排涝流量" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                  </div>
+                  <div v-show="model.hdlx=='hq'">
+                  <a-divider dashed>设计输水流量(m³/s)</a-divider>
+                  <a-col :span="8">
+                    <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjssllXz">
+                      <a-input v-model="model.sjssllXz" placeholder="请输入现状输水流量" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjssllSj">
+                      <a-input v-model="model.sjssllSj" placeholder="请输入设计输水流量" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjssllGh">
+                      <a-input v-model="model.sjssllGh" placeholder="请输入规划输水流量" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-divider dashed>相应输水水位(m)</a-divider>
+                  <a-col :span="8">
+                    <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyssswXz">
+                      <a-input v-model="model.xyssswXz" placeholder="请输入现状输水水位" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyssswSj">
+                      <a-input v-model="model.xyssswSj" placeholder="请输入设计输水水位" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xyssswGh">
+                      <a-input v-model="model.xyssswGh" placeholder="请输入规划输水水位" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                  </div>
+                    <a-divider dashed>河底比降</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdbjXz">
+                            <a-input v-model="model.hdbjXz" placeholder="请输入现状河底比降" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdbjSj">
+                            <a-input v-model="model.hdbjSj" placeholder="请输入设计河底比降" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdbjGh">
+                            <a-input v-model="model.hdbjGh" placeholder="请输入规划河底比降" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                  <div v-show="model.hdlx=='hd'">
+                    <a-divider dashed>河底高程(m)</a-divider>
+                    <a-col :span="8">
+                      <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdgcXz">
+                        <a-input v-model="model.hdgcXz" placeholder="请输入现状河底高程(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdgcSj">
+                        <a-input v-model="model.hdgcSj" placeholder="请输入设计河底高程(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdgcGh">
+                        <a-input v-model="model.hdgcGh" placeholder="请输入规划河底高程(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                  </div>
+                  <div v-show="model.hdlx=='hq'">
+                    <a-divider dashed>渠底高程(m)</a-divider>
+                    <a-col :span="8">
+                      <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdgcXz">
+                        <a-input v-model="model.hdgcXz" placeholder="请输入现状渠底高程(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdgcSj">
+                        <a-input v-model="model.hdgcSj" placeholder="请输入设计渠底高程(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hdgcGh">
+                        <a-input v-model="model.hdgcGh" placeholder="请输入规划渠底高程(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                  </div>
+                  <div v-show="model.hdlx=='hd'">
+                    <a-divider dashed>河道底宽(m)</a-divider>
+                    <a-col :span="8">
+                      <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddkXz">
+                        <a-input v-model="model.hddkXz" placeholder="请输入现状河道底宽(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddkSj">
+                        <a-input v-model="model.hddkSj" placeholder="请输入设计河道底宽(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddkGh">
+                        <a-input v-model="model.hddkGh" placeholder="请输入规划河道底宽(m)" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                    </div>
+                  <div v-show="model.hdlx=='hq'">
+                    <a-divider dashed>渠道底宽(m)</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddkXz">
+                            <a-input v-model="model.hddkXz" placeholder="请输入现状渠道底宽(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddkSj">
+                            <a-input v-model="model.hddkSj" placeholder="请输入设计渠道底宽(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddkGh">
+                            <a-input v-model="model.hddkGh" placeholder="请输入规划渠道底宽(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                  </div>
+                  <div v-show="model.hdlx=='hd'" >
+                    <a-divider dashed>河道(堤防)边坡 - 左岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbplXz">
+                            <a-input v-model="model.hddfbplXz" placeholder="请输入现状左岸河道(堤防)边坡" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbplSj">
+                            <a-input v-model="model.hddfbplSj" placeholder="请输入设计左岸河道(堤防)边坡" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbplGh">
+                            <a-input v-model="model.hddfbplGh" placeholder="请输入规划左岸河道(堤防)边坡" ></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                  </div>
+                  <div v-show="model.hdlx=='hq'">
+                    <a-divider dashed>渠道(堤防)边坡 - 左岸</a-divider>
+                    <a-col :span="8">
+                      <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbplXz">
+                        <a-input v-model="model.hddfbplXz" placeholder="请输入现状左岸渠道(堤防)边坡" ></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbplSj">
+                        <a-input v-model="model.hddfbplSj" placeholder="请输入设计左岸渠道(堤防)边坡" ></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbplGh">
+                        <a-input v-model="model.hddfbplGh" placeholder="请输入规划左岸渠道(堤防)边坡" ></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                  </div>
+                  <div v-show="model.hdlx=='hd'">
+                  <a-divider dashed>河道(堤防)边坡 - 右岸</a-divider>
+                  <a-col :span="8">
+                    <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbprXz">
+                      <a-input v-model="model.hddfbprXz" placeholder="请输入现状右岸河道(堤防)边坡" ></a-input>
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbprSj">
+                      <a-input v-model="model.hddfbprSj" placeholder="请输入设计右岸河道(堤防)边坡" ></a-input>
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="8">
+                    <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbprGh">
+                      <a-input v-model="model.hddfbprGh" placeholder="请输入规划右岸河道(堤防)边坡" style="width: 100%" />
+                    </a-form-model-item>
+                  </a-col>
+                </div>
+                  <div v-show="model.hdlx=='hq'">
+                    <a-divider dashed>渠道(堤防)边坡 - 右岸</a-divider>
+                    <a-col :span="8">
+                      <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbprXz">
+                        <a-input v-model="model.hddfbprXz" placeholder="请输入现状右岸渠道(堤防)边坡" ></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbprSj">
+                        <a-input v-model="model.hddfbprSj" placeholder="请输入设计右岸渠道(堤防)边坡" ></a-input>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                      <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hddfbprGh">
+                        <a-input v-model="model.hddfbprGh" placeholder="请输入规划右岸渠道(堤防)边坡" style="width: 100%" />
+                      </a-form-model-item>
+                    </a-col>
+                  </div>
+                    <a-divider dashed>堤顶高程(m) - 左岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddgclXz">
+                            <a-input v-model="model.ddgclXz" placeholder="请输入现状左岸堤顶高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddgclSj">
+                            <a-input v-model="model.ddgclSj" placeholder="请输入设计左岸堤顶高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddgclGh">
+                            <a-input v-model="model.ddgclGh" placeholder="请输入规划左岸堤顶高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>堤顶高程(m) - 右岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddgcrXz">
+                            <a-input v-model="model.ddgcrXz" placeholder="请输入现状右岸堤顶高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddgcrSj">
+                            <a-input v-model="model.ddgcrSj" placeholder="请输入设计右岸堤顶高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddgcrGh">
+                            <a-input v-model="model.ddgcrGh" placeholder="请输入规划右岸堤顶高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>堤顶宽度(m) - 左岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddkdlXz">
+                            <a-input v-model="model.ddkdlXz" placeholder="请输入现状左岸堤顶宽度(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddkdlSj">
+                            <a-input v-model="model.ddkdlSj" placeholder="请输入设计左岸堤顶宽度(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddkdlGh">
+                            <a-input v-model="model.ddkdlGh" placeholder="请输入规划左岸堤顶宽度(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>堤顶宽度(m) - 右岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddkdrXz">
+                            <a-input v-model="model.ddkdrXz" placeholder="请输入现状右岸堤顶宽度(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddkdrSj">
+                            <a-input v-model="model.ddkdrSj" placeholder="请输入设计右岸堤顶宽度(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ddkdrGh">
+                            <a-input v-model="model.ddkdrGh" placeholder="请输入规划右岸堤顶宽度(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>堤外地面高程(m) - 左岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dwdmgclXz">
+                            <a-input v-model="model.dwdmgclXz" placeholder="请输入现状左岸堤外地面高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dwdmgclSj">
+                            <a-input v-model="model.dwdmgclSj" placeholder="请输入设计左岸堤外地面高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dwdmgclGh">
+                            <a-input v-model="model.dwdmgclGh" placeholder="请输入规划左岸堤外地面高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-divider dashed>堤外地面高程(m) - 右岸</a-divider>
+                    <a-col :span="8">
+                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dwdmgcrXz">
+                            <a-input v-model="model.dwdmgcrXz" placeholder="请输入现状右岸堤外地面高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dwdmgcrSj">
+                            <a-input v-model="model.dwdmgcrSj" placeholder="请输入设计右岸堤外地面高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="8">
+                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dwdmgcrGh">
+                            <a-input v-model="model.dwdmgcrGh" placeholder="请输入规划右岸堤外地面高程(m)" style="width: 100%" />
+                        </a-form-model-item>
+                    </a-col>
+
+<!--                    <a-divider dashed>其他指标</a-divider>-->
+<!--                    <a-col :span="8">-->
+<!--                        <a-form-model-item label="现状" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qtzbXz">-->
+<!--                            <a-input v-model="model.qtzbXz" placeholder="请输入其他指标现状" ></a-input>-->
+<!--                        </a-form-model-item>-->
+<!--                    </a-col>-->
+<!--                    <a-col :span="8">-->
+<!--                        <a-form-model-item label="设计" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qtzbSj">-->
+<!--                            <a-input v-model="model.qtzbSj" placeholder="请输入其他指标设计" ></a-input>-->
+<!--                        </a-form-model-item>-->
+<!--                    </a-col>-->
+<!--                    <a-col :span="8">-->
+<!--                        <a-form-model-item label="规划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qtzbGh">-->
+<!--                            <a-input v-model="model.qtzbGh" placeholder="请输入其他指标规划" ></a-input>-->
+<!--                        </a-form-model-item>-->
+<!--                    </a-col>-->
+                </a-row>
+            </a-form-model>
+          </j-form-container>
+        </a-spin>
+    </j-modal>
+</template>
+
+<script>
+
+import {getAction, httpAction} from '@/api/manage'
+import { validateDuplicateValue } from '@/utils/util'
+
+export default {
+    name: "RmAxhdzyzbModal",
+    components: {
+    },
+    props:{
+        mainId:{
+            type:String,
+            required:false,
+            default:''
+        }
+    },
+    data () {
+        return {
+            title:"操作",
+            width:1200,
+            visible: false,
+            model:{
+            },
+            labelCol: {
+                xs: { span: 24 },
+                sm: { span: 5 },
+            },
+            wrapperCol: {
+                xs: { span: 24 },
+                sm: { span: 16 },
+            },
+          disableSubmit:false,
+            confirmLoading: false,
+            validatorRules: {
+                hqmc: [
+                    { required: true, message: '请输入河(渠)名称!'},
+                ],
+              hdlx: [
+                { required: true, message: '请选择河段类型!'},
+              ],
+            },
+            url: {
+                add: "/hzz.shjsgc.xmrk/rmAxxmxx/addRmAxhdzyzb",
+                edit: "/hzz.shjsgc.xmrk/rmAxxmxx/editRmAxhdzyzb",
+
+            }
+
+        }
+    },
+    created () {
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+        add () {
+            this.edit(this.modelDefault);
+        },
+        edit (record) {
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        close () {
+            this.$emit('close');
+            this.visible = false;
+            this.$refs.form.clearValidate();
+        },
+        handleOk () {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let httpurl = '';
+                    let method = '';
+                    if(!this.model.id){
+                        httpurl+=this.url.add;
+                        method = 'post';
+                    }else{
+                        httpurl+=this.url.edit;
+                        method = 'post';
+                    }
+                    this.model['mainId'] = this.mainId
+                    httpAction(httpurl,this.model,method).then((res)=>{
+                        if(res.success){
+                            that.$message.success(res.message);
+                            that.$emit('ok');
+                        }else{
+                            that.$message.warning(res.message);
+                        }
+                    }).finally(() => {
+                        that.confirmLoading = false;
+                        that.close();
+                    })
+                }else{
+                    return false
+                }
+            })
+        },
+        handleCancel () {
+            this.close()
+        },
+        popupCallback(value,row){
+            this.model = Object.assign(this.model, row);
+        },
+
+
+    }
+}
+</script>

+ 49 - 0
.svn/pristine/09/099ff37e45457e6f9834ac069c7bc98e44c5a5a4.svn-base

@@ -0,0 +1,49 @@
+<template>
+  <a-card title="磁盘监控">
+    <a-row>
+      <template v-if="diskInfo && diskInfo.length>0">
+        <a-col :span="8" v-for="(item,index) in diskInfo" :key=" 'diskInfo'+index ">
+          <dash-chart-demo :title="item.name" :datasource="item.restPPT"></dash-chart-demo>
+        </a-col>
+      </template>
+    </a-row>
+  </a-card>
+</template>
+
+<script>
+  import { getAction } from '@/api/manage'
+  import DashChartDemo from '@/components/chart/DashChartDemo'
+  import ARow from 'ant-design-vue/es/grid/Row'
+
+  export default {
+    name: 'DiskMonitoring',
+    components:{
+      ARow,
+      DashChartDemo,
+    },
+    data() {
+      return {
+        description: '磁盘监控',
+        //数据集
+        diskInfo:[],
+        url:{
+          queryDiskInfo:'sys/actuator/redis/queryDiskInfo',
+        }
+      }
+    },
+    created() {
+      getAction(this.url.queryDiskInfo).then((res)=>{
+        if(res.success){
+          for(var i=0;i<res.result.length;i++){
+            res.result[i].restPPT = res.result[i].restPPT/10;
+          }
+          this.diskInfo = res.result;
+        }
+      })
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 59 - 0
.svn/pristine/09/09e205ef68adef95e9935160fad2f2ee92b3ee10.svn-base

@@ -0,0 +1,59 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <tenant-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></tenant-form>
+  </j-modal>
+</template>
+
+<script>
+  import TenantForm from './TenantForm'
+  export default {
+    name: "TenantModal",
+    components: {
+      TenantForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.show();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.show(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 182 - 0
.svn/pristine/0a/0a05c8cc87d9349a35536878cbe47d4834e7e67c.svn-base

@@ -0,0 +1,182 @@
+<template>
+  <a-card :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="48">
+          <a-col :md="8" :sm="24">
+            <a-form-item label="角色ID">
+              <a-input placeholder="请输入"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="8" :sm="24">
+            <a-form-item label="状态">
+              <a-select placeholder="请选择" default-value="0">
+                <a-select-option value="0">全部</a-select-option>
+                <a-select-option value="1">正常</a-select-option>
+                <a-select-option value="2">禁用</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="8" :sm="24">
+            <span class="table-page-search-submitButtons">
+              <a-button type="primary">查询</a-button>
+              <a-button style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+
+    <s-table
+      ref="table"
+      size="default"
+      :columns="columns"
+      :data="loadData"
+    >
+      <div
+        slot="expandedRowRender"
+        slot-scope="record"
+        style="margin: 0">
+        <a-row
+          :gutter="24"
+          :style="{ marginBottom: '12px' }">
+          <a-col :span="12" v-for="(role, index) in record.permissions" :key="index" :style="{ marginBottom: '12px' }">
+            <a-col :span="4">
+              <span>{{ role.permissionName }}:</span>
+            </a-col>
+            <a-col :span="20" v-if="role.actionEntitySet.length > 0">
+              <a-tag color="cyan" v-for="(action, k) in role.actionEntitySet" :key="k">{{ action.describe }}</a-tag>
+            </a-col>
+            <a-col :span="20" v-else>-</a-col>
+          </a-col>
+        </a-row>
+      </div>
+      <span slot="action" slot-scope="text, record">
+        <a @click="$refs.modal.edit(record)">编辑</a>
+        <a-divider type="vertical" />
+        <a-dropdown>
+          <a class="ant-dropdown-link">
+            更多 <a-icon type="down" />
+          </a>
+          <a-menu slot="overlay">
+            <a-menu-item>
+              <a href="javascript:;">详情</a>
+            </a-menu-item>
+            <a-menu-item>
+              <a href="javascript:;">禁用</a>
+            </a-menu-item>
+            <a-menu-item>
+              <a href="javascript:;">删除</a>
+            </a-menu-item>
+          </a-menu>
+        </a-dropdown>
+      </span>
+    </s-table>
+
+    <role-modal ref="modal" @ok="handleOk"></role-modal>
+
+  </a-card>
+</template>
+
+<script>
+  import STable from '@/components/table/'
+  import RoleModal from './modules/RoleModal'
+
+  export default {
+    name: "TableList",
+    components: {
+      STable,
+      RoleModal
+    },
+    data () {
+      return {
+        description: '列表使用场景:后台管理中的权限管理以及角色管理,可用于基于 RBAC 设计的角色权限控制,颗粒度细到每一个操作类型。',
+
+        visible: false,
+
+        form: null,
+        mdl: {},
+
+        // 高级搜索 展开/关闭
+        advanced: false,
+        // 查询参数
+        queryParam: {},
+        // 表头
+        columns: [
+          {
+            title: '唯一识别码',
+            dataIndex: 'id'
+          },
+          {
+            title: '角色名称',
+            dataIndex: 'name',
+          },
+          {
+            title: '状态',
+            dataIndex: 'status'
+          },
+          {
+            title: '创建时间',
+            dataIndex: 'createTime',
+            sorter: true
+          }, {
+            title: '操作',
+            width: '150px',
+            dataIndex: 'action',
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        // 加载数据方法 必须为 Promise 对象
+        loadData: parameter => {
+          return this.$http.get('/mock/api/role', {
+            params: Object.assign(parameter, this.queryParam)
+          }).then(res => {
+            return res.result
+          })
+        },
+
+        selectedRowKeys: [],
+        selectedRows: []
+      }
+    },
+    methods: {
+      handleEdit (record) {
+        this.mdl = Object.assign({}, record)
+
+        this.mdl.permissions.forEach(permission => {
+          permission.actionsOptions = permission.actionEntitySet.map(action => {
+            return { label: action.describe, value: action.action, defaultCheck: action.defaultCheck }
+          })
+        })
+
+        console.log(this.mdl)
+        this.visible = true
+      },
+      handleOk () {
+        // 新增/修改 成功时,重载列表
+        this.$refs.table.refresh()
+      },
+      onChange (selectedRowKeys, selectedRows) {
+        this.selectedRowKeys = selectedRowKeys
+        this.selectedRows = selectedRows
+      },
+      toggleAdvanced () {
+        this.advanced = !this.advanced
+      },
+    },
+    watch: {
+      /*
+      'selectedRows': function (selectedRows) {
+        this.needTotalList = this.needTotalList.map(item => {
+          return {
+            ...item,
+            total: selectedRows.reduce( (sum, val) => {
+              return sum + val[item.dataIndex]
+            }, 0)
+          }
+        })
+      }
+      */
+    }
+  }
+</script>

+ 285 - 0
.svn/pristine/0a/0a4d9c2d5fc7b69160e2530b47b8095eadd7fabf.svn-base

@@ -0,0 +1,285 @@
+<template>
+  <a-card :bordered="false">
+    <!-- table区域-begin -->
+    <a-table
+      ref="table"
+      size="default"
+      bordered
+      rowKey="id"
+      :columns="columns"
+      :pagination="false"
+      :dataSource="dataSource">
+
+    </a-table>
+    <!-- table区域-end -->
+
+
+  </a-card>
+</template>
+
+<script>
+
+  export default {
+    name: "RowspanTable",
+    components: {
+    },
+    data() {
+      return {
+        description: '存放位置设置表管理页面',
+        levelNum:{},
+        gridNum:0,
+        boxNum:0,
+        cabinetNo:"",
+        // 表头
+        columns: [ {
+          title: '分组一',
+          align: "center",
+          dataIndex: 'cabinetNo',
+          customRender: (value, row, index) => {
+            const obj = {
+              children: value,
+              attrs: {},
+            };
+            if(index===0){
+              obj.attrs.rowSpan = this.dataSource.length;
+            }else{
+              obj.attrs.rowSpan = 0;
+            }
+            return obj;
+          },
+        },
+          {
+            title: '分组二',
+            align: "center",
+            dataIndex: 'levelNo',
+            customRender: (value, row, index) => {
+              const obj = {
+                children: value,
+                attrs: {},
+              };
+              //当前列跨行的条数
+              var a = parseInt(this.levelNum);
+              var b = parseInt(this.gridNum)*parseInt(this.boxNum);
+              console.log(a);
+              for(var c=0;c<=a;c++){
+                if(index === (c*b)){
+                  console.log(1);
+                  console.log(c*b);
+                  obj.attrs.rowSpan = b;
+                  break;
+                }else{
+                  obj.attrs.rowSpan = 0;
+                }
+              }
+              return obj;
+            }
+          },
+          {
+            title: '分组三',
+            align: "center",
+            dataIndex: 'gridNo',
+            customRender: (value, row, index) => {
+              const obj = {
+                children: value,
+                attrs: {},
+              };
+              var a = parseInt(this.levelNum)*parseInt(this.gridNum);
+              var b = parseInt(this.boxNum);
+              for(var c=0;c<=a;c++){
+                if(index === (c*b)){
+                  obj.attrs.rowSpan = b;
+                  break;
+                }else{
+                  obj.attrs.rowSpan = 0;
+                }
+              }
+              return obj;
+            },
+          }, {
+            title: '字段一',
+            align: "center",
+            dataIndex: 'boxNo'
+          }, {
+            title: '字段二',
+            align: 'center',
+            dataIndex: 'storedNum'
+          }, {
+            title: '字段三',
+            align: "center",
+            dataIndex: 'maxNum'
+          },],
+        //数据集
+        dataSource: [{
+          "id": "cb1dfd12cbeca3f8ba121439ee7e2411",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "1",
+          "gridNo": "1",
+          "boxNo": "1",
+          "storedNum": 2,
+          "maxNum": 2,
+          "unitNum": 2,
+          "assignStatus": "1",
+          "storageStatus": "1",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-02"
+        }, {
+          "id": "f903d50d02904b14175dccf2a7948777",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "1",
+          "gridNo": "1",
+          "boxNo": "2",
+          "storedNum": 2,
+          "maxNum": 2,
+          "unitNum": 2,
+          "assignStatus": "1",
+          "storageStatus": "1",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-02"
+        }, {
+          "id": "4f04c0ca4202535d678871b07e706cf6",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "1",
+          "gridNo": "2",
+          "boxNo": "1",
+          "storedNum": 2,
+          "maxNum": 2,
+          "unitNum": 2,
+          "assignStatus": "1",
+          "storageStatus": "1",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-02"
+        }, {
+          "id": "d0c91dabedfc03efad0126e50ea72e80",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "1",
+          "gridNo": "2",
+          "boxNo": "2",
+          "storedNum": 2,
+          "maxNum": 2,
+          "unitNum": 2,
+          "assignStatus": "1",
+          "storageStatus": "1",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-08"
+        }, {
+          "id": "1e8bfcbe4352afbab8878f9fd368e007",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "2",
+          "gridNo": "1",
+          "boxNo": "1",
+          "storedNum": 1,
+          "maxNum": 2,
+          "unitNum": 1,
+          "assignStatus": "1",
+          "storageStatus": "0",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-08"
+        }, {
+          "id": "d76087d8d3ebc7a59d43458588f26941",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "2",
+          "gridNo": "1",
+          "boxNo": "2",
+          "storedNum": 0,
+          "maxNum": 2,
+          "unitNum": 0,
+          "assignStatus": "1",
+          "storageStatus": "0",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-02"
+        }, {
+          "id": "7bf7754f12e1bf95edcd501cc6b85e62",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "2",
+          "gridNo": "2",
+          "boxNo": "1",
+          "storedNum": 0,
+          "maxNum": 2,
+          "unitNum": 0,
+          "assignStatus": "1",
+          "storageStatus": "0",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-02"
+        }, {
+          "id": "9cd08d733657d5b286bec870f12f6ecf",
+          "attributeId": "e62831f314e1390edbd884e9d9e6aca6",
+          "cabinetNo": "1",
+          "levelNo": "2",
+          "gridNo": "2",
+          "boxNo": "2",
+          "storedNum": 0,
+          "maxNum": 2,
+          "unitNum": 0,
+          "assignStatus": "1",
+          "storageStatus": "0",
+          "remark": null,
+          "createBy": "admin",
+          "createTime": "2019-04-02",
+          "updateBy": "admin",
+          "updateTime": "2019-04-02"
+        }],
+        isorter: {
+          column: 'createTime',
+          order: 'desc',
+        },
+        url: {
+        },
+      }
+    },
+    created() {
+      this.loadData();
+    },
+    methods: {
+      loadData(){
+        this.levelNum=4;
+        this.gridNum = 2;
+        this.boxNum = 2;
+
+      }
+    }
+  }
+</script>
+<style scoped>
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>
+

+ 123 - 0
.svn/pristine/0b/0b33348dc03e390f6dd6e3cffcbafd0d572b715a.svn-base

@@ -0,0 +1,123 @@
+<template>
+  <a-modal
+    v-model="show"
+    :width="900"
+    :keyboard="false"
+    :closable="false"
+    :centered="true"
+    @ok="ok"
+    @cancel="cancel"
+    :maskClosable="false"
+    :mask="false"
+    okText="确认"
+    cancelText="取消">
+    <a-tabs>
+      <a-tab-pane tab="方向性图标" key="1">
+        <ul>
+          <li v-for="icon in icons.directionIcons" :key="icon">
+            <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/>
+          </li>
+        </ul>
+      </a-tab-pane>
+      <a-tab-pane tab="指示性图标" key="2">
+        <ul>
+          <li v-for="icon in icons.suggestionIcons" :key="icon">
+            <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/>
+          </li>
+        </ul>
+      </a-tab-pane>
+      <a-tab-pane tab="编辑类图标" key="3">
+        <ul>
+          <li v-for="icon in icons.editIcons" :key="icon">
+            <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/>
+          </li>
+        </ul>
+      </a-tab-pane>
+      <a-tab-pane tab="数据类图标" key="4">
+        <ul>
+          <li v-for="icon in icons.dataIcons" :key="icon">
+            <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/>
+          </li>
+        </ul>
+      </a-tab-pane>
+      <a-tab-pane tab="网站通用图标" key="5">
+        <ul>
+          <li v-for="icon in icons.webIcons" :key="icon">
+            <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/>
+          </li>
+        </ul>
+      </a-tab-pane>
+      <a-tab-pane tab="品牌和标识" key="6">
+        <ul>
+          <li v-for="icon in icons.logoIcons" :key="icon">
+            <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/>
+          </li>
+        </ul>
+      </a-tab-pane>
+    </a-tabs>
+  </a-modal>
+</template>
+<script>
+const directionIcons = ['step-backward', 'step-forward', 'fast-backward', 'fast-forward', 'shrink', 'arrows-alt', 'down', 'up', 'left', 'right', 'caret-up', 'caret-down', 'caret-left', 'caret-right', 'up-circle', 'down-circle', 'left-circle', 'right-circle', 'up-circle-o', 'down-circle-o', 'right-circle-o', 'left-circle-o', 'double-right', 'double-left', 'vertical-left', 'vertical-right', 'forward', 'backward', 'rollback', 'enter', 'retweet', 'swap', 'swap-left', 'swap-right', 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'play-circle', 'play-circle-o', 'up-square', 'down-square', 'left-square', 'right-square', 'up-square-o', 'down-square-o', 'left-square-o', 'right-square-o', 'login', 'logout', 'menu-fold', 'menu-unfold', 'border-bottom', 'border-horizontal', 'border-inner', 'border-left', 'border-right', 'border-top', 'border-verticle', 'pic-center', 'pic-left', 'pic-right', 'radius-bottomleft', 'radius-bottomright', 'radius-upleft', 'radius-upright', 'fullscreen', 'fullscreen-exit']
+const suggestionIcons = ['question', 'question-circle', 'plus', 'plus-circle', 'pause', 'pause-circle', 'minus', 'minus-circle', 'plus-square', 'minus-square', 'info', 'info-circle', 'exclamation', 'exclamation-circle', 'close', 'close-circle', 'close-square', 'check', 'check-circle', 'check-square', 'clock-circle', 'warning', 'issues-close', 'stop']
+const editIcons = ['edit', 'form', 'copy', 'scissor', 'delete', 'snippets', 'diff', 'highlight', 'align-center', 'align-left', 'align-right', 'bg-colors', 'bold', 'italic', 'underline', 'strikethrough', 'redo', 'undo', 'zoom-in', 'zoom-out', 'font-colors', 'font-size', 'line-height', 'colum-height', 'dash', 'small-dash', 'sort-ascending', 'sort-descending', 'drag', 'ordered-list', 'radius-setting']
+const dataIcons = ['area-chart', 'pie-chart', 'bar-chart', 'dot-chart', 'line-chart', 'radar-chart', 'heat-map', 'fall', 'rise', 'stock', 'box-plot', 'fund', 'sliders']
+const webIcons = ['lock', 'unlock', 'bars', 'book', 'calendar', 'cloud', 'cloud-download', 'code', 'copy', 'credit-card', 'delete', 'desktop', 'download', 'ellipsis', 'file', 'file-text', 'file-unknown', 'file-pdf', 'file-word', 'file-excel', 'file-jpg', 'file-ppt', 'file-markdown', 'file-add', 'folder', 'folder-open', 'folder-add', 'hdd', 'frown', 'meh', 'smile', 'inbox', 'laptop', 'appstore', 'link', 'mail', 'mobile', 'notification', 'paper-clip', 'picture', 'poweroff', 'reload', 'search', 'setting', 'share-alt', 'shopping-cart', 'tablet', 'tag', 'tags', 'to-top', 'upload', 'user', 'video-camera', 'home', 'loading', 'loading-3-quarters', 'cloud-upload', 'star', 'heart', 'environment', 'eye', 'camera', 'save', 'team', 'solution', 'phone', 'filter', 'exception', 'export', 'customer-service', 'qrcode', 'scan', 'like', 'dislike', 'message', 'pay-circle', 'calculator', 'pushpin', 'bulb', 'select', 'switcher', 'rocket', 'bell', 'disconnect', 'database', 'compass', 'barcode', 'hourglass', 'key', 'flag', 'layout', 'printer', 'sound', 'usb', 'skin', 'tool', 'sync', 'wifi', 'car', 'schedule', 'user-add', 'user-delete', 'usergroup-add', 'usergroup-delete', 'man', 'woman', 'shop', 'gift', 'idcard', 'medicine-box', 'red-envelope', 'coffee', 'copyright', 'trademark', 'safety', 'wallet', 'bank', 'trophy', 'contacts', 'global', 'shake', 'api', 'fork', 'dashboard', 'table', 'profile', 'alert', 'audit', 'branches', 'build', 'border', 'crown', 'experiment', 'fire', 'money-collect', 'property-safety', 'read', 'reconciliation', 'rest', 'security-scan', 'insurance', 'interation', 'safety-certificate', 'project', 'thunderbolt', 'block', 'cluster', 'deployment-unit', 'dollar', 'euro', 'pound', 'file-done', 'file-exclamation', 'file-protect', 'file-search', 'file-sync', 'gateway', 'gold', 'robot', 'shopping']
+const logoIcons = ['android', 'apple', 'windows', 'ie', 'chrome', 'github', 'aliwangwang', 'dingding', 'weibo-square', 'weibo-circle', 'taobao-circle', 'html5', 'weibo', 'twitter', 'wechat', 'youtube', 'alipay-circle', 'taobao', 'skype', 'qq', 'medium-workmark', 'gitlab', 'medium', 'linkedin', 'google-plus', 'dropbox', 'facebook', 'codepen', 'amazon', 'google', 'codepen-circle', 'alipay', 'ant-design', 'aliyun', 'zhihu', 'slack', 'slack-square', 'behance', 'behance-square', 'dribbble', 'dribbble-square', 'instagram', 'yuque', 'alibaba', 'yahoo']
+export default {
+  name: 'Icons',
+  props: {
+    iconChooseVisible: {
+      default: false
+    }
+  },
+  data () {
+    return {
+      icons: {
+        directionIcons,
+        suggestionIcons,
+        editIcons,
+        dataIcons,
+        webIcons,
+        logoIcons
+      },
+      choosedIcon: '',
+      activeIndex: ''
+    }
+  },
+  computed: {
+    show: {
+      get: function () {
+        return this.iconChooseVisible
+      },
+      set: function () {
+      }
+    }
+  },
+  methods: {
+    reset () {
+      this.activeIndex = ''
+    },
+    chooseIcon (icon) {
+      this.activeIndex = icon
+      this.choosedIcon = icon
+      this.$message.success(`选中 ${icon}`)
+    },
+    ok () {
+      if (this.choosedIcon === '') {
+        this.$message.warning('尚未选择任何图标')
+        return
+      }
+      this.reset()
+      this.$emit('choose', this.choosedIcon)
+    },
+    cancel () {
+      this.reset()
+      this.$emit('close')
+    }
+  }
+}
+</script>
+<style lang="less" scoped>
+@import "Icon";
+</style>

+ 84 - 0
.svn/pristine/0b/0b3870c71d399f23d73eada7fa0e54ed1b76bba4.svn-base

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <rm-skqktjb-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></rm-skqktjb-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import RmSkqktjbForm from './RmSkqktjbForm'
+
+  export default {
+    name: 'RmSkqktjbModal',
+    components: {
+      RmSkqktjbForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:896,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 325 - 0
.svn/pristine/0b/0b699409959c1a3a9e992bd40fa5ce3302e4582d.svn-base

@@ -0,0 +1,325 @@
+<template>
+    <a-spin :spinning="confirmLoading">
+        <j-form-container :disabled="formDisabled">
+            <!-- 主表单区域 -->
+            <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+                <a-row>
+                    <a-col :span="12">
+                        <a-form-model-item label="项目名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xmmc">
+                            <a-input v-model="model.xmmc" placeholder="请输入项目名称"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="所在水系" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="szsx">
+                            <j-dict-select-tag type="list" v-model="model.szsx" dictCode="shuixi"
+                                               placeholder="请选择所在水系"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="行政区划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xzqh">
+                            <j-area-linkage type="cascader" v-model="model.xzqh" placeholder="请输入省市区"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="项目负责人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xmfzr">
+                            <a-input v-model="model.xmfzr" placeholder="请输入项目负责人"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="县级区划代码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xjqhdm">
+                            <a-input v-model="model.xjqhdm" placeholder="请输入县级区划代码"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="横坐标" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hzb">
+                            <a-input v-model="model.hzb" placeholder="请输入横坐标"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="纵坐标" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zzb">
+                            <a-input v-model="model.zzb" placeholder="请输入纵坐标"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="电话" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dha">
+                            <a-input v-model="model.dha" placeholder="请输入电话"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="立项情况" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lxqk">
+                            <a-input v-model="model.lxqk" placeholder="请输入立项情况"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="审批年度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spnd">
+                            <j-date placeholder="请选择审批年度" v-model="model.spnd" style="width: 100%"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="防洪标准" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbz">
+                            <a-input v-model="model.fhbz" placeholder="请输入防洪标准"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="审批单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spdw">
+                            <a-input v-model="model.spdw" placeholder="请输入审批单位"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="审批级别" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spjb">
+                            <a-input v-model="model.spjb" placeholder="请输入审批级别"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="审批情况" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spqk">
+                            <j-dict-select-tag type="list" v-model="model.spqk" dictCode="spzt" placeholder="请选择审批情况"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="总体布置简述" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ztbzjs">
+                            <a-textarea v-model="model.ztbzjs" placeholder="请输入总体布置简述" rows="4"></a-textarea>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="建设状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jszt">
+                            <j-dict-select-tag type="list" v-model="model.jszt" dictCode="gcjsqk"
+                                               placeholder="请选择建设状态"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="12">
+                        <a-form-model-item label="其他" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qt">
+                            <a-textarea v-model="model.qt" placeholder="请输入其他" rows="4"></a-textarea>
+                        </a-form-model-item>
+                    </a-col>
+                </a-row>
+                <div v-for="user in obj1" :key="user.id">
+                    <a-divider dashed>涉河工程信息</a-divider>
+                    <a-col :span="6">
+                        <a-form-model-item label="涉河工程名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzXz">
+                            <a-input v-model="user.gcmc" placeholder="请输入涉河工程名称"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="6">
+                        <a-form-model-item label="涉河类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzSj">
+                            <j-category-select placeholder="请选择涉河类型" v-model="user.shlx" pcode="A02"/>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="6">
+                        <a-form-model-item label="所在河道" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzGh">
+                            <a-input v-model="user.sjhd" placeholder="请输入所在河道"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                    <a-col :span="6">
+                        <a-form-model-item label="位置信息" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbzGh">
+                            <a-input v-model="user.jd+','+user.wd" placeholder="请输入位置信息"></a-input>
+                        </a-form-model-item>
+                    </a-col>
+                </div>
+            </a-form-model>
+        </j-form-container>
+        <!-- 子表单区域 -->
+        <a-tabs v-model="activeKey" @change="handleChangeTabs">
+            <a-tab-pane tab="监管记录" :key="refKeys[0]" :forceRender="true">
+                <j-editable-table
+                    :ref="refKeys[0]"
+                    :loading="rmJgjlTable.loading"
+                    :columns="rmJgjlTable.columns"
+                    :dataSource="rmJgjlTable.dataSource"
+                    :maxHeight="300"
+                    :disabled="formDisabled"
+                    :rowNumber="true"
+                    :rowSelection="true"
+                    :actionButton="false"/>
+            </a-tab-pane>
+        </a-tabs>
+    </a-spin>
+</template>
+
+<script>
+
+import {postAction, getAction} from '@/api/manage'
+import {FormTypes, getRefPromise, VALIDATE_NO_PASSED} from '@/utils/JEditableTableUtil'
+import {JEditableTableModelMixin} from '@/mixins/JEditableTableModelMixin'
+import {validateDuplicateValue} from '@/utils/util'
+
+export default {
+    name: 'RmXmxxForm',
+    mixins: [JEditableTableModelMixin],
+    components: {},
+    data() {
+        return {
+            labelCol: {
+                xs: {span: 24},
+                sm: {span: 6},
+            },
+            wrapperCol: {
+                xs: {span: 24},
+                sm: {span: 16},
+            },
+            labelCol2: {
+                xs: {span: 24},
+                sm: {span: 3},
+            },
+            wrapperCol2: {
+                xs: {span: 24},
+                sm: {span: 20},
+            },
+            model: {},
+            obj1: [],
+            // 新增时子表默认添加几行空数据
+            addDefaultRowNum: 1,
+            validatorRules: {},
+            refKeys: ['rmJgjl',],
+            tableKeys: ['rmJgjl',],
+            activeKey: 'rmJgjl',
+            // 监管记录
+            rmJgjlTable: {
+                loading: false,
+                dataSource: [],
+                columns: [
+
+                    {
+                        title: '检查名称',
+                        key: 'jcmc',
+                        type: FormTypes.input,
+                        width: "200px",
+                      align:"center",
+                        placeholder: '请输入${title}',
+                        defaultValue: '',
+                    },
+                    {
+                        title: '检查日期',
+                        key: 'createTime',
+                        type: FormTypes.input,
+                      align:"center",
+                        width: "200px",
+                        placeholder: '请输入${title}',
+                        defaultValue: '',
+                    },
+                    {
+                        title: '监管单位',
+                        key: 'jgdw',
+                        type: FormTypes.input,
+                      align:"center",
+                        width: "200px",
+                        placeholder: '请输入${title}',
+                        defaultValue: '',
+                    },
+                    {
+                        title: '监管负责人',
+                        key: 'jgfzr',
+                        type: FormTypes.input,
+                      align:"center",
+                        width: "200px",
+                        placeholder: '请输入${title}',
+                        defaultValue: '',
+                    },
+                  {
+                    title: '填报人',
+                    key: 'tbr',
+                    type: FormTypes.input,
+                    align:"center",
+                    width: "200px",
+                    placeholder: '请输入${title}',
+                    defaultValue: '',
+                  },
+                    {
+                        title: '存在问题及处理情况',
+                        key: 'czwtjclqk',
+                        type: FormTypes.input,
+                      align:"center",
+                        width: "800px",
+                        placeholder: '请输入${title}',
+                        defaultValue: '',
+                    },
+                ]
+            },
+            url: {
+                add: "/hzz.shjsgc.xmxx/rmXmxx/add",
+                edit: "/hzz.shjsgc.xmxx/rmXmxx/edit",
+                queryById: "/hzz.shjsgc.xmxx/rmXmxx/queryById",
+                SelectById: "/hzz.shjsgc.xmxx/rmXmxx/SelectById",
+                rmJgjl: {
+                    list: '/hzz.shjsgc.xmxx/rmXmxx/queryRmJgjlByMainId'
+                },
+            }
+        }
+    },
+    props: {
+        //表单禁用
+        disabled: {
+            type: Boolean,
+            default: false,
+            required: false
+        }
+    },
+    computed: {
+        formDisabled() {
+            return this.disabled
+        },
+    },
+    created() {
+    },
+    mounted() {
+        // this.SelectById();
+    },
+    methods: {
+        addBefore() {
+            this.rmJgjlTable.dataSource = []
+        },
+        getAllTable() {
+            let values = this.tableKeys.map(key => getRefPromise(this, key))
+            return Promise.all(values)
+        },
+        /** 调用完edit()方法之后会自动调用此方法 */
+        editAfter() {
+            this.SelectById();
+            this.$nextTick(() => {
+            })
+            // 加载子表数据
+            if (this.model.id) {
+                let params = {id: this.model.id}
+                this.requestSubTableData(this.url.rmJgjl.list, params, this.rmJgjlTable)
+            }
+        },
+        //校验所有一对一子表表单
+        validateSubForm(allValues) {
+            return new Promise((resolve, reject) => {
+                Promise.all([]).then(() => {
+                    resolve(allValues)
+                }).catch(e => {
+                    if (e.error === VALIDATE_NO_PASSED) {
+                        // 如果有未通过表单验证的子表,就自动跳转到它所在的tab
+                        this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
+                    } else {
+                        console.error(e)
+                    }
+                })
+            })
+        },
+        /** 整理成formData */
+        classifyIntoFormData(allValues) {
+            let main = Object.assign(this.model, allValues.formValue)
+            return {
+                ...main, // 展开
+                rmJgjlList: allValues.tablesValue[0].values,
+            }
+        },
+        validateError(msg) {
+            this.$message.error(msg)
+        },
+        SelectById() {
+            getAction(this.url.SelectById, {id: this.model.id}).then((res) => {
+                let arr = res.result
+                this.obj1 = arr
+                // this.loadData()
+                console.log("结果:", this.obj1)
+            })
+        },
+
+    }
+}
+</script>
+
+<style scoped>
+</style>

+ 220 - 0
.svn/pristine/0c/0c5a19c28252a41c94454c99ce21245b7a830893.svn-base

@@ -0,0 +1,220 @@
+<template>
+    <simple-marker ref="simpleMarker"></simple-marker>
+</template>
+
+<script>
+import {LineString, MultiLineString, MultiPolygon, Polygon} from "ol/geom";
+import {Vector as VectorSource} from "ol/source";
+import {Vector as VectorLayer} from "ol/layer";
+import Style from "ol/style/Style";
+import Fill from "ol/style/Fill";
+import Stroke from "ol/style/Stroke";
+import Text from 'ol/style/Text';
+import CircleStyle from "ol/style/Circle";
+import Feature from "ol/Feature";
+import SimpleMarker from "@/components/BasicMap/Tools/SimpleMarker.vue";
+import * as bussLayerFn from '@/utils/oneMap/bussLayer';
+
+export default {
+    name: "LocateByGeoinfo",
+    components: {SimpleMarker},
+    data() {
+        return {
+            map: {},
+            vectorLayer: '',
+        }
+    },
+    inject: ['baseMap'],
+    methods: {
+        locate(record, map) {
+            this.map = map;
+            if (record.lat && record.lng && !record.geoinfo) {
+                this.$refs.simpleMarker.hideMarker();
+                this.locateByCoords([record.lng, record.lat]);
+                return;
+            }
+            let geoStr = record.geoinfo;
+            if (!geoStr) {
+                this.$message.warn('没有空间信息!')
+                return;
+            }
+            if (record.layerName) {
+                if (record.layerName.includes(',')) {
+                    let layerNames = record.layerName.split(',');
+                    layerNames.forEach((item) => {
+                        this.getTreeExpandKeys(this.baseMap.list, item);
+                    })
+                } else {
+                    // 显示图层
+                    this.getTreeExpandKeys(this.baseMap.list, record.layerName);
+                }
+            }
+            this.$refs.simpleMarker.hideMarker();
+            this.clear();
+            let jsonStr;
+            let geomType;
+            if (JSON.parse(geoStr).coordinates) {
+                jsonStr = JSON.parse(geoStr).coordinates;
+                geomType = JSON.parse(geoStr).type;
+            }else{
+                jsonStr = JSON.parse(geoStr).geometry.coordinates;
+                geomType = JSON.parse(geoStr).geometry.type;
+            }
+            let geom = null;
+            switch (geomType) {
+                case "Point":
+                    this.locateByCoords(jsonStr);
+                    break;
+                case "MultiPolygon":
+                    geom = new MultiPolygon(jsonStr);
+                    this.locateByGeometry(geom);
+                    break;
+                case "MultiLineString":
+                    geom = new MultiLineString(jsonStr);
+                    this.locateByGeometry(geom);
+                    break;
+                case "Polygon":
+                    geom = new Polygon(jsonStr);
+                    this.locateByGeometry(geom);
+                    break;
+                case "LineString":
+                    geom = new LineString(jsonStr);
+                    this.locateByGeometry(geom);
+                    break;
+                default:
+                    break;
+            }
+        },
+        // 递归查找
+        getTreeExpandKeys(obj, name) {
+            if (obj && obj.length !== 0) {
+                obj.forEach((item, index) => {
+                    if (item.alias === name) {
+                        item.visible = true;
+                        let m_layer = this.getLayerByName(name);
+                        if (!m_layer) {
+                            bussLayerFn.loadBussLayer(this.map, item.url, item.name, item.alias, item.sourceName,
+                                item.zIndex,
+                                item.visible);
+                        } else {
+                            m_layer.setVisible(true);
+                        }
+                    }
+                    // 如果此列表有children, 进行递归
+                    if (item.layers) {
+                        // console.log(index)
+                        this.getTreeExpandKeys(item.layers, name)
+                    }
+                })
+            }
+        },
+        getLayerByName(layerName) {
+            var map = this.baseMap.map;
+            if (!map) {
+                return;
+            }
+            let layer = null;
+            let layers = map.getLayers();
+            let layerCount = layers.getLength();
+            for (let i = 0; i < layerCount; i++) {
+                let name = layers.item(i).get('alias');
+                if (name === layerName) {
+                    layer = layers.item(i);
+                    return layer;
+                }
+            }
+            return layer;
+        },
+        locateByCoords(coords) {
+            this.map = this.baseMap.map;
+            let view = this.map.getView();
+            const zoom = view.getZoom();
+            view.animate({
+                zoom: zoom - 1,
+                duration: 300
+            }, {
+                center: coords,
+                zoom: 16,
+                duration: 1700
+            })
+            setTimeout(() => {
+                this.$refs.simpleMarker.init(coords);
+            }, 2000)
+        },
+        locateByGeometry(geom) {
+            if (this.vectorLayer === '') {
+                const vectorSource = new VectorSource();
+                this.vectorLayer = new VectorLayer({
+                    name: 'locMap',
+                    source: vectorSource,
+                    style: new Style({
+                        fill: new Fill({
+                            color: 'rgba(255, 255, 255, 0.6)',
+                        }),
+                        stroke: new Stroke({
+                            color: '#ff0000',
+                            lineDash: [6, 6],
+                            width: 5
+                        }),
+                        image: new CircleStyle({
+                            radius: 7,
+                            fill: new Fill({
+                                color: '#ffcc33',
+                            }),
+                        }),
+                        // text: new Text({
+                        //     textAlign:'center',
+                        //     textBaseline:'bottom',
+                        //     font:'bold 2em Microsoft YaHei',
+                        //     text:'文字提示',
+                        //     placement:'line',
+                        //     fill:new Fill({
+                        //         color:'#FF0000'
+                        //     })
+                        // })
+                    }),
+                    zIndex: 100
+                })
+                this.map.addLayer(this.vectorLayer);
+            }
+            let view = this.map.getView()
+            let zoom = view.getZoom();
+            if (geom == null) {
+                return;
+            }
+            view.animate({
+                zoom: zoom - 1,
+                duration: 300
+            });
+            view.fit(geom, {
+                size: [800, 600],
+                duration: 1700
+                // padding:[30,30,30,30]
+            });
+
+            let feature = null;
+            let vectorSource = null;
+            feature = new Feature({
+                geometry: geom
+            })
+            vectorSource = new VectorSource();
+            vectorSource.addFeature(feature);
+            this.vectorLayer.setSource(vectorSource);
+            this.vectorLayer.setZIndex(100);
+        },
+        clear() {
+            if (this.vectorLayer) {
+                this.vectorLayer.setSource(null);
+                this.map.removeLayer(this.vectorLayer);
+                this.vectorLayer = '';
+            }
+        }
+    }
+}
+</script>
+
+<style scoped>
+.aa{
+    font-family: "";
+}
+</style>

+ 623 - 0
.svn/pristine/0c/0c6e2a5a7bdfce32227ea50464d4b826cd50cb58.svn-base

@@ -0,0 +1,623 @@
+<template xmlns:background-color="http://www.w3.org/1999/xhtml">
+  <a-row :gutter="10">
+    <a-col :md="12" :sm="24">
+      <a-card :bordered="false">
+
+        <!-- 按钮操作区域 -->
+        <a-row style="margin-left: 14px">
+          <a-button @click="handleAdd(1)" type="primary">添加部门</a-button>
+          <a-button @click="handleAdd(2)" type="primary">添加下级</a-button>
+          <a-button type="primary" icon="download" @click="handleExportXls('部门信息')">导出</a-button>
+          <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+            <a-button type="primary" icon="import">导入</a-button>
+          </a-upload>
+          <a-button title="删除多条数据" @click="batchDel" type="default">批量删除</a-button>
+          <!--<a-button @click="refresh" type="default" icon="reload" :loading="loading">刷新</a-button>-->
+        </a-row>
+        <div style="background: #fff;padding-left:16px;height: 100%; margin-top: 5px">
+          <a-alert type="info" :showIcon="true">
+            <div slot="message">
+              当前选择:<span v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</span>
+              <a v-if="this.currSelected.title" style="margin-left: 10px" @click="onClearSelected">取消选择</a>
+            </div>
+          </a-alert>
+          <a-input-search @search="onSearch" style="width:100%;margin-top: 10px" placeholder="请输入部门名称"/>
+          <!-- 树-->
+          <a-col :md="10" :sm="24">
+            <template>
+              <a-dropdown :trigger="[this.dropTrigger]" @visibleChange="dropStatus">
+               <span style="user-select: none">
+            <a-tree
+              checkable
+              multiple
+              @select="onSelect"
+              @check="onCheck"
+              @rightClick="rightHandle"
+              :selectedKeys="selectedKeys"
+              :checkedKeys="checkedKeys"
+              :treeData="departTree"
+              :checkStrictly="checkStrictly"
+              :expandedKeys="iExpandedKeys"
+              :autoExpandParent="autoExpandParent"
+              @expand="onExpand"/>
+                </span>
+                <!--新增右键点击事件,和增加添加和删除功能-->
+                <a-menu slot="overlay">
+                  <a-menu-item @click="handleAdd(3)" key="1">添加</a-menu-item>
+                  <a-menu-item @click="handleDelete" key="2">删除</a-menu-item>
+                  <a-menu-item @click="closeDrop" key="3">取消</a-menu-item>
+                </a-menu>
+              </a-dropdown>
+            </template>
+          </a-col>
+        </div>
+      </a-card>
+      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      <div class="drawer-bootom-button">
+        <a-dropdown :trigger="['click']" placement="topCenter">
+          <a-menu slot="overlay">
+            <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
+            <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
+            <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
+            <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
+            <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
+            <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
+          </a-menu>
+          <a-button>
+            树操作 <a-icon type="up" />
+          </a-button>
+        </a-dropdown>
+      </div>
+      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+    </a-col>
+    <a-col :md="12" :sm="24">
+      <a-tabs defaultActiveKey="1">
+        <a-tab-pane tab="基本信息" key="1" >
+          <a-card :bordered="false" v-if="selectedKeys.length>0">
+            <a-form-model ref="form" :model="model" :rules="validatorRules">
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="departName" label="机构名称">
+                <a-input placeholder="请输入机构/部门名称" v-model="model.departName" />
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门">
+                <a-tree-select
+                  style="width:100%"
+                  :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
+                  :treeData="treeData"
+                  :disabled="disable"
+                  v-model="model.parentId"
+                  placeholder="无">
+                </a-tree-select>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orgCode" label="机构编码">
+                <a-input disabled placeholder="请输入机构编码" v-model="model.orgCode" />
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orgCategory" label="机构类型">
+                <template v-if="orgCategoryDisabled">
+                  <a-radio-group v-model="model.orgCategory" placeholder="请选择机构类型">
+                    <a-radio value="1">
+                      公司
+                    </a-radio>
+                  </a-radio-group>
+                </template>
+                <template v-else>
+                  <a-radio-group v-model="model.orgCategory" placeholder="请选择机构类型">
+                    <a-radio value="2">
+                      部门
+                    </a-radio>
+                    <a-radio value="3">
+                      岗位
+                    </a-radio>
+                  </a-radio-group>
+                </template>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="排序">
+                <a-input-number v-model="model.departOrder" />
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="手机号">
+                <a-input placeholder="请输入手机号" v-model="model.mobile" />
+              </a-form-model-item>
+              <a-form-model-item  :labelCol="labelCol" :wrapperCol="wrapperCol"  label="地址">
+                <a-input placeholder="请输入地址" v-model="model.address"/>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="备注">
+                <a-textarea placeholder="请输入备注" v-model="model.memo"/>
+              </a-form-model-item>
+            </a-form-model>
+            <div class="anty-form-btn">
+              <a-button @click="emptyCurrForm" type="default" htmlType="button" icon="sync">重置</a-button>
+              <a-button @click="submitCurrForm" type="primary" htmlType="button" icon="form">保存</a-button>
+            </div>
+          </a-card>
+          <a-card v-else >
+            <a-empty>
+              <span slot="description"> 请先选择一个部门! </span>
+            </a-empty>
+          </a-card>
+        </a-tab-pane>
+        <a-tab-pane tab="部门权限" key="2" forceRender>
+          <depart-auth-modal ref="departAuth"/>
+        </a-tab-pane>
+      </a-tabs>
+
+    </a-col>
+    <depart-modal ref="departModal" @ok="loadTree"></depart-modal>
+  </a-row>
+</template>
+<script>
+  import DepartModal from './modules/DepartModal'
+  import {queryDepartTreeList, searchByKeywords, deleteByDepartId} from '@/api/api'
+  import {httpAction, deleteAction} from '@/api/manage'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import DepartAuthModal from './modules/DepartAuthModal'
+  // 表头
+  const columns = [
+    {
+      title: '机构名称',
+      dataIndex: 'departName'
+    },
+    {
+      title: '机构类型',
+      align: 'center',
+      dataIndex: 'orgType'
+    },
+    {
+      title: '机构编码',
+      dataIndex: 'orgCode',
+    },
+    {
+      title: '手机号',
+      dataIndex: 'mobile'
+    },
+    {
+      title: '传真',
+      dataIndex: 'fax'
+    },
+    {
+      title: '地址',
+      dataIndex: 'address'
+    },
+    {
+      title: '排序',
+      align: 'center',
+      dataIndex: 'departOrder'
+    },
+    {
+      title: '操作',
+      align: 'center',
+      dataIndex: 'action',
+      scopedSlots: {customRender: 'action'}
+    }
+  ]
+  export default {
+    name: 'DepartList',
+    mixins: [JeecgListMixin],
+    components: {
+      DepartAuthModal,
+      DepartModal
+    },
+    data() {
+      return {
+        iExpandedKeys: [],
+        loading: false,
+        autoExpandParent: true,
+        currFlowId: '',
+        currFlowName: '',
+        disable: true,
+        treeData: [],
+        visible: false,
+        departTree: [],
+        rightClickSelectedKey: '',
+        rightClickSelectedOrgCode: '',
+        hiding: true,
+        model: {},
+        dropTrigger: '',
+        depart: {},
+        columns: columns,
+        disableSubmit: false,
+        checkedKeys: [],
+        selectedKeys: [],
+        autoIncr: 1,
+        currSelected: {},
+        allTreeKeys:[],
+        checkStrictly: true,
+        labelCol: {
+          xs: {span: 24},
+          sm: {span: 5}
+        },
+        wrapperCol: {
+          xs: {span: 24},
+          sm: {span: 16}
+        },
+        graphDatasource: {
+          nodes: [],
+          edges: []
+        },
+        validatorRules: {
+          departName: [{required: true, message: '请输入机构/部门名称!'}],
+          orgCode: [{required: true, message: '请输入机构编码!'}],
+          orgCategory:[{required: true, message: '请输入机构类型!'}],
+          mobile:[{validator: this.validateMobile}]
+        },
+        url: {
+          delete: '/sys/sysDepart/delete',
+          edit: '/sys/sysDepart/edit',
+          deleteBatch: '/sys/sysDepart/deleteBatch',
+          exportXlsUrl: "sys/sysDepart/exportXls",
+          importExcelUrl: "sys/sysDepart/importExcel",
+        },
+        orgCategoryDisabled:false,
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      loadData() {
+        this.refresh();
+      },
+      loadTree() {
+        var that = this
+        that.treeData = []
+        that.departTree = []
+        queryDepartTreeList().then((res) => {
+          if (res.success) {
+            //部门全选后,再添加部门,选中数量增多
+            this.allTreeKeys = [];
+            for (let i = 0; i < res.result.length; i++) {
+              let temp = res.result[i]
+              that.treeData.push(temp)
+              that.departTree.push(temp)
+              that.setThisExpandedKeys(temp)
+              that.getAllKeys(temp);
+              // console.log(temp.id)
+            }
+            this.loading = false
+          }
+        })
+      },
+      setThisExpandedKeys(node) {
+        if (node.children && node.children.length > 0) {
+          this.iExpandedKeys.push(node.key)
+          for (let a = 0; a < node.children.length; a++) {
+            this.setThisExpandedKeys(node.children[a])
+          }
+        }
+      },
+      refresh() {
+        this.loading = true
+        this.loadTree()
+      },
+      // 右键操作方法
+      rightHandle(node) {
+        this.dropTrigger = 'contextmenu'
+        console.log(node.node.eventKey)
+        this.rightClickSelectedKey = node.node.eventKey
+        this.rightClickSelectedOrgCode = node.node.dataRef.orgCode
+      },
+      onExpand(expandedKeys) {
+        console.log('onExpand', expandedKeys)
+        this.iExpandedKeys = expandedKeys
+        this.autoExpandParent = false
+      },
+      backFlowList() {
+        this.$router.back(-1)
+      },
+      // 右键点击下拉框改变事件
+      dropStatus(visible) {
+        if (visible == false) {
+          this.dropTrigger = ''
+        }
+      },
+      // 右键下拉关闭下拉框
+      closeDrop() {
+        this.dropTrigger = ''
+      },
+      addRootNode() {
+        this.$refs.nodeModal.add(this.currFlowId, '')
+      },
+      batchDel: function () {
+        console.log(this.checkedKeys)
+        if (this.checkedKeys.length <= 0) {
+          this.$message.warning('请选择一条记录!')
+        } else {
+          var ids = ''
+          for (var a = 0; a < this.checkedKeys.length; a++) {
+            ids += this.checkedKeys[a] + ','
+          }
+          var that = this
+          this.$confirm({
+            title: '确认删除',
+            content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据,以及子节点数据吗?',
+            onOk: function () {
+              deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
+                if (res.success) {
+                  that.$message.success(res.message)
+                  that.loadTree()
+                  that.onClearSelected()
+                } else {
+                  that.$message.warning(res.message)
+                }
+              })
+            }
+          })
+        }
+      },
+      onSearch(value) {
+        let that = this
+        if (value) {
+          searchByKeywords({keyWord: value}).then((res) => {
+            if (res.success) {
+              that.departTree = []
+              for (let i = 0; i < res.result.length; i++) {
+                let temp = res.result[i]
+                that.departTree.push(temp)
+              }
+            } else {
+              that.$message.warning(res.message)
+            }
+          })
+        } else {
+          that.loadTree()
+        }
+
+      },
+      nodeModalOk() {
+        this.loadTree()
+      },
+      nodeModalClose() {
+      },
+      hide() {
+        console.log(111)
+        this.visible = false
+      },
+      onCheck(checkedKeys, info) {
+        console.log('onCheck', checkedKeys, info)
+        this.hiding = false
+        //---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------
+        if(this.checkStrictly){
+          this.checkedKeys = checkedKeys.checked;
+        }else{
+          this.checkedKeys = checkedKeys
+        }
+        //---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------
+      },
+      onSelect(selectedKeys, e) {
+        console.log('selected', selectedKeys, e)
+        this.hiding = false
+        let record = e.node.dataRef
+        console.log('onSelect-record', record)
+        this.currSelected = Object.assign({}, record)
+        this.model = this.currSelected
+        this.selectedKeys = [record.key]
+        this.model.parentId = record.parentId
+        this.setValuesToForm(record)
+        this.$refs.departAuth.show(record.id);
+
+      },
+      // 触发onSelect事件时,为部门树右侧的form表单赋值
+      setValuesToForm(record) {
+        if(record.orgCategory == '1'){
+          this.orgCategoryDisabled = true;
+        }else{
+          this.orgCategoryDisabled = false;
+        }
+      },
+      getCurrSelectedTitle() {
+        return !this.currSelected.title ? '' : this.currSelected.title
+      },
+      onClearSelected() {
+        this.hiding = true
+        this.checkedKeys = []
+        this.currSelected = {}
+        this.selectedKeys = []
+        this.$refs.departAuth.departId = ''
+      },
+      handleNodeTypeChange(val) {
+        this.currSelected.nodeType = val
+      },
+      notifyTriggerTypeChange(value) {
+        this.currSelected.notifyTriggerType = value
+      },
+      receiptTriggerTypeChange(value) {
+        this.currSelected.receiptTriggerType = value
+      },
+      submitCurrForm() {
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            if (!this.currSelected.id) {
+              this.$message.warning('请点击选择要修改部门!')
+              return
+            }
+
+            httpAction(this.url.edit, this.currSelected, 'post').then((res) => {
+              if (res.success) {
+                this.$message.success('保存成功!')
+                this.loadTree()
+              } else {
+                this.$message.error(res.message)
+              }
+            })
+          }
+        })
+      },
+      emptyCurrForm() {
+        this.$refs.form.resetFields();
+        this.model={}
+      },
+      nodeSettingFormSubmit() {
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            console.log('Received values of form: ', this.model)
+          }
+        })
+      },
+      openSelect() {
+        this.$refs.sysDirectiveModal.show()
+      },
+      handleAdd(num) {
+        if (num == 1) {
+          this.$refs.departModal.add()
+          this.$refs.departModal.title = '新增'
+        } else if (num == 2) {
+          let key = this.currSelected.key
+          if (!key) {
+            this.$message.warning('请先点击选中上级部门!')
+            return false
+          }
+          this.$refs.departModal.add(this.selectedKeys)
+          this.$refs.departModal.title = '新增'
+        } else {
+          this.$refs.departModal.add(this.rightClickSelectedKey)
+          this.$refs.departModal.title = '新增'
+        }
+      },
+      handleDelete() {
+        var that = this
+        this.$confirm({
+          title: '确认删除',
+          content: '确定要删除此部门以及子节点数据吗?',
+          onOk: function () {
+            deleteByDepartId({id: that.rightClickSelectedKey}).then((resp) => {
+              if (resp.success) {
+                //删除成功后,去除已选中中的数据
+                that.checkedKeys.splice(that.checkedKeys.findIndex(key => key === that.rightClickSelectedKey), 1);
+                that.$message.success('删除成功!')
+                that.loadTree()
+                //删除后同步清空右侧基本信息内容
+                let orgCode=that.model.orgCode;
+                if(orgCode && orgCode === that.rightClickSelectedOrgCode){
+                  that.onClearSelected()
+                }
+              } else {
+                that.$message.warning('删除失败!')
+              }
+            })
+          }
+        })
+      },
+      selectDirectiveOk(record) {
+        console.log('选中指令数据', record)
+        this.nodeSettingForm.setFieldsValue({directiveCode: record.directiveCode})
+        this.currSelected.sysCode = record.sysCode
+      },
+      getFlowGraphData(node) {
+        this.graphDatasource.nodes.push({
+          id: node.id,
+          text: node.flowNodeName
+        })
+        if (node.children.length > 0) {
+          for (let a = 0; a < node.children.length; a++) {
+            let temp = node.children[a]
+            this.graphDatasource.edges.push({
+              source: node.id,
+              target: temp.id
+            })
+            this.getFlowGraphData(temp)
+          }
+        }
+      },
+     //---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------
+      expandAll () {
+        this.iExpandedKeys = this.allTreeKeys
+      },
+      closeAll () {
+        this.iExpandedKeys = []
+      },
+      checkALL () {
+        this.checkStriccheckStrictlytly = false
+        this.checkedKeys = this.allTreeKeys
+      },
+      cancelCheckALL () {
+        //this.checkedKeys = this.defaultCheckedKeys
+        this.checkedKeys = []
+      },
+      switchCheckStrictly (v) {
+        if(v==1){
+          this.checkStrictly = false
+        }else if(v==2){
+          this.checkStrictly = true
+        }
+      },
+      getAllKeys(node) {
+        // console.log('node',node);
+        this.allTreeKeys.push(node.key)
+        if (node.children && node.children.length > 0) {
+          for (let a = 0; a < node.children.length; a++) {
+            this.getAllKeys(node.children[a])
+          }
+        }
+      }
+      //---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------
+      
+    },
+    created() {
+      this.currFlowId = this.$route.params.id
+      this.currFlowName = this.$route.params.name
+      // this.loadTree()
+    },
+
+  }
+</script>
+<style scoped>
+  .ant-card-body .table-operator {
+    margin: 15px;
+  }
+
+  .anty-form-btn {
+    width: 100%;
+    text-align: center;
+  }
+
+  .anty-form-btn button {
+    margin: 0 5px;
+  }
+
+  .anty-node-layout .ant-layout-header {
+    padding-right: 0
+  }
+
+  .header {
+    padding: 0 8px;
+  }
+
+  .header button {
+    margin: 0 3px
+  }
+
+  .ant-modal-cust-warp {
+    height: 100%
+  }
+
+  .ant-modal-cust-warp .ant-modal-body {
+    height: calc(100% - 110px) !important;
+    overflow-y: auto
+  }
+
+  .ant-modal-cust-warp .ant-modal-content {
+    height: 90% !important;
+    overflow-y: hidden
+  }
+
+  #app .desktop {
+    height: auto !important;
+  }
+
+  /** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+
+  .drawer-bootom-button {
+    /*position: absolute;*/
+    bottom: 0;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: left;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 110 - 0
.svn/pristine/0d/0d6673bf2784b1438584ac143e7750ab434e4dcc.svn-base

@@ -0,0 +1,110 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="geom" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="geom">
+              <a-input v-model="model.geom" placeholder="请输入geom"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="szbm" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="szbm">
+              <a-input v-model="model.szbm" placeholder="请输入szbm"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'RmZbgcgeoForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+        },
+        url: {
+          add: "/hzz.shjsgc.zbgc.geo/rmZbgcgeo/add",
+          edit: "/hzz.shjsgc.zbgc.geo/rmZbgcgeo/edit",
+          queryById: "/hzz.shjsgc.zbgc.geo/rmZbgcgeo/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               //method = 'put';
+                method = 'post';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 103 - 0
.svn/pristine/0d/0d66f409a972a7bbaaffc33242d6865881a2aef4.svn-base

@@ -0,0 +1,103 @@
+<template>
+  <a-modal :visible="visible" title="修改头像" :maskClosable="false" :confirmLoading="confirmLoading" :width="800" @cancel="cancelHandel">
+    <a-row>
+      <a-col :xs="24" :md="12" :style="{height: '350px'}">
+        <vue-cropper
+          ref="cropper"
+          :img="options.img"
+          :info="true"
+          :autoCrop="options.autoCrop"
+          :autoCropWidth="options.autoCropWidth"
+          :autoCropHeight="options.autoCropHeight"
+          :fixedBox="options.fixedBox"
+          @realTime="realTime"
+        >
+        </vue-cropper>
+      </a-col>
+      <a-col :xs="24" :md="12" :style="{height: '350px'}">
+        <div class="avatar-upload-preview">
+          <img :src="previews.url" :style="previews.img"/>
+        </div>
+      </a-col>
+    </a-row>
+
+    <template slot="footer">
+      <a-button key="back" @click="cancelHandel">取消</a-button>
+      <a-button key="submit" type="primary" :loading="confirmLoading" @click="okHandel">保存</a-button>
+    </template>
+  </a-modal>
+</template>
+<script>
+  import { VueCropper } from 'vue-cropper'
+
+  export default {
+    components: {
+      VueCropper
+    },
+    data() {
+      return {
+        visible: false,
+        id: null,
+        confirmLoading: false,
+
+        options: {
+          img: '/avatar2.jpg',
+          autoCrop: true,
+          autoCropWidth: 200,
+          autoCropHeight: 200,
+          fixedBox: true
+        },
+        previews: {},
+      };
+    },
+    methods: {
+      edit(id) {
+        this.visible = true;
+        this.id = id;
+        /* 获取原始头像 */
+
+      },
+      close() {
+        this.id = null;
+        this.visible = false;
+      },
+      cancelHandel() {
+        this.close();
+      },
+      okHandel() {
+        const vm = this
+
+        vm.confirmLoading = true
+        setTimeout(() => {
+          vm.confirmLoading = false
+          vm.close()
+          vm.$message.success('上传头像成功');
+        }, 2000)
+
+      },
+
+      realTime(data) {
+        this.previews = data
+      }
+    }
+  };
+</script>
+
+<style lang="less" scoped>
+
+  .avatar-upload-preview {
+    position: absolute;
+    top: 50%;
+    transform: translate(50%, -50%);
+    width: 180px;
+    height: 180px;
+    border-radius: 50%;
+    box-shadow: 0 0 4px #ccc;
+    overflow: hidden;
+
+    img {
+      width: 100%;
+      height: 100%;
+    }
+  }
+</style>

+ 60 - 0
.svn/pristine/0d/0de3463a7ccc561c64550b2493afef0412bcfc01.svn-base

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <rm-qlgeo-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></rm-qlgeo-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import RmQlgeoForm from './RmQlgeoForm'
+  export default {
+    name: 'RmQlgeoModal',
+    components: {
+      RmQlgeoForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 162 - 0
.svn/pristine/0d/0de50984826d71b4eeb3165b9e6d585496e51e86.svn-base

@@ -0,0 +1,162 @@
+<template>
+  <div class="j-area-linkage">
+    <div v-if="reloading">
+      <span> Reloading... </span>
+    </div>
+    <area-cascader
+      v-else-if="_type === enums.type[0]"
+      :value="innerValue"
+      :data="pcaa"
+      :level="1"
+      :style="{width}"
+      v-bind="$attrs"
+      v-on="_listeners"
+      @change="handleChange"
+    />
+    <area-select
+      v-else-if="_type === enums.type[1]"
+      :value="innerValue"
+      :data="pcaa"
+      :level="2"
+      v-bind="$attrs"
+      v-on="_listeners"
+      @change="handleChange"
+    />
+    <div v-else>
+      <span style="color:red;"> Bad type value: {{_type}}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+  import Area from '@/components/_util/Area'
+
+  export default {
+    name: 'JAreaLinkage',
+    props: {
+      value: {
+        type: String,
+        required:false
+      },
+      // 组件的类型,可选值:
+      // select 下拉样式
+      // cascader 级联样式(默认)
+      type: {
+        type: String,
+        default: 'cascader'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      }
+    },
+    data() {
+      return {
+        pcaa: this.$Jpcaa,
+        innerValue: [],
+        usedListeners: ['change'],
+        enums: {
+          type: ['cascader', 'select']
+        },
+        reloading: false,
+        areaData:''
+      }
+    },
+    computed: {
+      _listeners() {
+        let listeners = { ...this.$listeners }
+        // 去掉已使用的事件,防止冲突
+        this.usedListeners.forEach(key => {
+          delete listeners[key]
+        })
+        return listeners
+      },
+      _type() {
+        if (this.enums.type.includes(this.type)) {
+          return this.type
+        } else {
+          console.error(`JAreaLinkage的type属性只能接收指定的值(${this.enums.type.join('|')})`)
+          return this.enums.type[0]
+        }
+      },
+    },
+    watch: {
+      value: {
+        immediate: true,
+        handler() {
+          this.loadDataByValue(this.value)
+        }
+      },
+    },
+    created() {
+      this.initAreaData();
+    },
+    methods: {
+
+      /** 重新加载组件 */
+      reload() {
+        this.reloading = true
+        this.$nextTick(() => this.reloading = false)
+      },
+
+      /** 通过 value 反推 options */
+      loadDataByValue(value) {
+        if (!value || value.length === 0) {
+          this.innerValue = []
+        } else {
+          this.initAreaData()
+          let arr = this.areaData.getRealCode(value)
+          this.innerValue = arr
+        }
+        this.reload()
+      },
+      /** 通过地区code获取子级 */
+      loadDataByCode(value) {
+        let options = []
+        let data = this.pcaa[value]
+        if (data) {
+          for (let key in data) {
+            if (data.hasOwnProperty(key)) {
+              options.push({ value: key, label: data[key], })
+            }
+          }
+          return options
+        } else {
+          return []
+        }
+      },
+      /** 判断是否有子节点 */
+      hasChildren(options) {
+        options.forEach(option => {
+          let data = this.loadDataByCode(option.value)
+          option.isLeaf = data.length === 0
+        })
+      },
+      handleChange(values) {
+        let value = values[values.length - 1]
+        this.$emit('change', value)
+      },
+      initAreaData(){
+        if(!this.areaData){
+          this.areaData = new Area(this.$Jpcaa);
+        }
+      },
+
+    },
+    model: { prop: 'value', event: 'change' },
+  }
+</script>
+
+<style lang="less" scoped>
+  .j-area-linkage {
+    height:40px;
+    /deep/ .area-cascader-wrap .area-select {
+      width: 100%;
+    }
+
+    /deep/ .area-select .area-selected-trigger {
+      line-height: 1.15;
+    }
+  }
+
+</style>

+ 136 - 0
.svn/pristine/0e/0e1a6e6fda09d38a50a2222cc57c22661cca85c0.svn-base

@@ -0,0 +1,136 @@
+<template>
+  <div>
+    <a-input
+      v-show="!userIds"
+      @click="openSelect"
+      placeholder="请选择用户"
+      v-model="userNames"
+      readOnly
+      class="jvxe-select-input"
+      :disabled="componentDisabled">
+      <a-icon slot="prefix" type="user" title="用户选择控件"/>
+    </a-input>
+    <j-select-user-by-dep-modal
+      ref="selectModal"
+      :modal-width="modalWidth"
+      :multi="multi"
+      :user-ids="userIds"
+      @ok="selectOK"
+      @initComp="initComp"/>
+    <span style="display: inline-block;height:100%;padding-left:14px" v-if="userIds" >
+      <span @click="openSelect" style="display: inline-block;vertical-align: middle">{{ userNames }}</span>
+      <a-icon style="margin-left:5px;vertical-align: middle" type="close-circle" @click="handleEmpty" title="清空"/>
+    </span>
+  </div>
+
+ <!-- <j-select-user-by-dep
+    v-bind="custProps"
+    @change="handleChange"
+    :trigger-change="true">
+  </j-select-user-by-dep>-->
+</template>
+
+<script>
+  import JVxeCellMixins, { dispatchEvent } from '@/components/jeecg/JVxeTable/mixins/JVxeCellMixins'
+  import JSelectUserByDepModal from '@/components/jeecgbiz/modal/JSelectUserByDepModal'
+
+  export default {
+    name: 'JVxeUserSelectCell',
+    mixins: [JVxeCellMixins],
+    components: { JSelectUserByDepModal },
+    data() {
+      return {
+        userIds:'',
+        userNames:'',
+        innerUserValue: '',
+        selectedOptions: []
+      }
+    },
+    computed: {
+      custProps() {
+        const {userIds, originColumn: col, caseId, cellProps} = this
+        return {
+          ...cellProps,
+          value: userIds,
+          field: col.field || col.key,
+          groupId: caseId,
+          class: 'jvxe-select'
+        }
+      },
+      componentDisabled(){
+        console.log('333',this.cellProps)
+        if(this.cellProps.disabled==true){
+          return true
+        }
+        return false
+      },
+      modalWidth(){
+        if(this.cellProps.modalWidth){
+          return this.cellProps.modalWidth
+        }else{
+          return 1250
+        }
+      },
+      multi(){
+        if(this.cellProps.multi==false){
+          return false
+        }else{
+          return true
+        }
+      }
+    },
+    watch: {
+      innerValue: {
+        immediate: true,
+        handler(val) {
+          if (val == null || val === '') {
+            this.userIds = ''
+          } else {
+            this.userIds = val
+          }
+        }
+      }
+    },
+    methods: {
+      openSelect() {
+        this.$refs.selectModal.showModal()
+      },
+      selectOK(rows, idstr) {
+        console.log("当前选中用户", rows)
+        console.log("当前选中用户ID", idstr)
+        if (!rows) {
+          this.userNames = ''
+          this.userIds = ''
+        } else {
+          let temp = ''
+          for (let item of rows) {
+            temp += ',' + item.realname
+          }
+          this.userNames = temp.substring(1)
+          this.userIds = idstr
+        }
+        this.handleChangeCommon(this.userIds)
+      },
+      handleEmpty(){
+        this.selectOK('')
+      },
+      initComp(userNames) {
+        this.userNames = userNames
+      },
+    },
+    enhanced: {
+      switches: {
+        visible: true
+      },
+      translate: {
+        enabled: false
+      }
+    }
+  }
+</script>
+
+<style scoped>
+  /deep/ .jvxe-select-input .ant-input {
+    border: none !important;
+  }
+</style>

+ 123 - 0
.svn/pristine/0e/0e45702626a54c1b69afc5e14494dc7017ca5a1e.svn-base

@@ -0,0 +1,123 @@
+<template>
+  <a-card :visible="visible">
+    <a-form-model ref="form" :model="model">
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="机构名称">
+        <a-input style="border:0;" placeholder="" v-model="model.departName"/>
+      </a-form-model-item>
+      <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门">
+        <a-tree-select
+          disabled
+          style="width:100%;border: 0;border: none;outline:none;"
+          :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
+          :treeData="treeData"
+          v-model="model.parentId"
+          placeholder="无">
+        </a-tree-select>
+      </a-form-model-item>
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="机构编码">
+        <a-input style="border:0;" placeholder="" v-model="model.orgCode"/>
+      </a-form-model-item>
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="机构类型">
+          <a-radio-group :disabled="true" v-model="model.orgCategory" read-only>
+            <a-radio value="1">
+              公司
+            </a-radio>
+            <a-radio value="2">
+              部门
+            </a-radio>
+            <a-radio value="3">
+              岗位
+            </a-radio>
+          </a-radio-group>
+      </a-form-model-item>
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="排序">
+        <a-input style="border:0;" v-model="model.departOrder"/>
+      </a-form-model-item>
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="手机号">
+        <a-input style="border:0;" placeholder="" v-model="model.mobile"/>
+      </a-form-model-item>
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="地址">
+        <a-input style="border:0;" placeholder="" v-model="model.address"/>
+      </a-form-model-item>
+      <a-form-model-item
+        :labelCol="labelCol"
+        :wrapperCol="wrapperCol"
+        label="备注">
+        <a-textarea style="border:0;" placeholder="" v-model="model.memo"/>
+      </a-form-model-item>
+    </a-form-model>
+  </a-card>
+</template>
+<script>
+  import { queryIdTree } from '@/api/api'
+
+  export default {
+    name: 'DeptBaseInfo',
+    components: {},
+    data() {
+      return {
+        departTree: [],
+        id: '',
+        model: {},
+        visible: false,
+        disable: true,
+        treeData: [],
+        labelCol: {
+          xs: {span: 24},
+          sm: {span: 3}
+        },
+        wrapperCol: {
+          xs: {span: 24},
+          sm: {span: 16}
+        },
+      }
+    },
+    created() {
+      this.loadTreeData();
+    },
+    methods: {
+      loadTreeData() {
+        queryIdTree().then((res) => {
+          if (res.success) {
+            for (let i = 0; i < res.result.length; i++) {
+              let temp = res.result[i];
+              this.treeData.push(temp);
+            }
+          }
+        })
+      },
+      open(record) {
+        this.visible = true;
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.model = Object.assign({}, record)
+        })
+      },
+      clearForm() {
+        this.$refs.form.resetFields();
+        this.treeData = [];
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 101 - 0
.svn/pristine/0e/0e6f13de28d50bfecab5a70b4be45bb50fb2a2f2.svn-base

@@ -0,0 +1,101 @@
+<template>
+  <div class="config-list">
+    <a-radio-group v-model="type">
+      <div class="item">
+        <a-radio value="TYPE_NOT_SET" class="choice" :disabled="disableChoice">不设置</a-radio>
+        <span class="tip-info">日和周只能设置其中之一</span>
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_EVERY" class="choice" :disabled="disableChoice">每日</a-radio>
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_RANGE" class="choice" :disabled="disableChoice">区间</a-radio>
+        从
+        <a-input :disabled="type!==TYPE_RANGE || disableChoice" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueRange.start"/>
+        日
+        至
+        <a-input :disabled="type!==TYPE_RANGE || disableChoice" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueRange.end"/>
+        日
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_LOOP" class="choice" :disabled="disableChoice">循环</a-radio>
+        从
+        <a-input :disabled="type!==TYPE_LOOP || disableChoice" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueLoop.start"/>
+        日开始,间隔
+        <a-input :disabled="type!==TYPE_LOOP || disableChoice" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueLoop.interval"/>
+        日
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_WORK" class="choice" :disabled="disableChoice">工作日</a-radio>
+        本月
+        <a-input :disabled="type!==TYPE_WORK || disableChoice" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueWork"/>
+        日,最近的工作日
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_LAST" class="choice" :disabled="disableChoice">最后一日</a-radio>
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_SPECIFY" class="choice" :disabled="disableChoice">指定</a-radio>
+        <div class="list">
+          <a-checkbox-group v-model="valueList">
+            <template v-for="i of specifyRange">
+              <a-checkbox class="list-check-item" :key="`key-${i}`" :value="i" :disabled="type!==TYPE_SPECIFY || disabled">{{i}}</a-checkbox>
+            </template>
+          </a-checkbox-group>
+        </div>
+      </div>
+    </a-radio-group>
+  </div>
+</template>
+
+<script>
+import mixin from './mixin'
+
+export default {
+  name: 'day',
+  mixins: [mixin],
+  props: {
+    week: {
+      type: String,
+      default: '?'
+    }
+  },
+  data() {
+    return {}
+  },
+  computed: {
+    disableChoice() {
+      return (this.week && this.week !== '?') || this.disabled
+    }
+  },
+  watch: {
+    value_c(newVal, oldVal) {
+      // 数值变化
+      this.updateValue()
+    },
+    week(newVal, oldVal) {
+      // console.info('new week: ' + newVal)
+      this.updateValue()
+    }
+  },
+  methods: {
+    updateValue() {
+      this.$emit('change', this.disableChoice ? '?' : this.value_c)
+    }
+  },
+  created() {
+    this.DEFAULT_VALUE = '*'
+    this.minValue = 1
+    this.maxValue = 31
+    this.valueRange.start = 1
+    this.valueRange.end = 31
+    this.valueLoop.start = 1
+    this.valueLoop.interval = 1
+    this.parseProp(this.prop)
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  @import "mixin.less";
+</style>

+ 425 - 0
.svn/pristine/0e/0ea9a36275b9a6327c00e6df29af58fe713d12f8.svn-base

@@ -0,0 +1,425 @@
+<template>
+    <div>
+        <div id="toolBar" class="toolBar ol-unselectable">
+            <ul class="nav nav-pills">
+                <li v-if="isRes"
+                    @click="resShow=!resShow;coordsShow=false;measureShow=false;queryShow=false;drawShow = false;">
+                    <a><img
+                        src="@/assets/layers.png" width="24"> 图层</a></li>
+                <res-catalog v-if="isRes" id="resourceCatalog" v-model="resShow"></res-catalog>
+                <li v-if="isQuery" @click="queryShow=!queryShow; resShow=false;coordsShow=false;measureShow=false;drawShow = false;">
+                    <a><img src="@/assets/query.png" width="24"> 查询</a>
+                </li>
+                <query-tool v-if="isQuery" id="queryTool" ref="queryTool" v-model="queryShow"></query-tool>
+                <li v-if="isCoords"
+                    @click="coordsShow=!coordsShow;resShow=false;measureShow=false;queryShow=false;drawShow = false;">
+                    <a><img
+                        src="@/assets/locationTool.png" width="24"> 定位</a></li>
+                <coords-locate v-if="isCoords" id="coordsLocate" ref="coordsLocate"
+                               v-model="coordsShow"></coords-locate>
+                <!--        <li v-if="isExtent" id="zoomToFullExtent" @click="zoomToFullExtent"><a><img src="@/assets/ZoomFullExtent.png" width="24">
+                          全图</a></li>-->
+                <li v-if="isMeasure" @click="handleMeasure"><a><img src="@/assets/measureTool.png" width="24"> 测量</a>
+                </li>
+                <measure-tool v-if="isMeasure" ref="measureToll" id="measureTool" v-model="measureShow"
+                              :output.sync="output"></measure-tool>
+                <li v-if="isDraw" @click="handleDrawTool"><a><img
+                    src="@/assets/drawPencil.png" width="24"> 标绘</a></li>
+                <draw-tool v-if="isDraw" ref="drawTool" id="drawTool" v-model="drawShow"></draw-tool>
+                <li v-if="isClear" id="clearTool" @click="handleClear"><a><img src="@/assets/clear.png" width="24">
+                    清除</a></li>
+            </ul>
+        </div>
+        <!--    点选查询弹框-->
+        <div class="ant-popover ant-popover-placement-top popup" id="popup" ref="popup" v-show="tabs.length!==0">
+            <div class="ant-popover-content">
+                <div class="ant-popover-arrow"></div>
+                <div role="tooltip" class="ant-popover-inner">
+                    <div>
+                        <div class="ant-popover-inner-content">
+                            <div style="width: 320px">
+                                <a-tabs default-active-key="1" tab-position="top" :style="{ 'min-height': '200px' }">
+                                    <a-tab-pane v-for="(tab,i) in tabs" :key="i" :tab="tab.name">
+                                        <a-descriptions bordered :column='1'>
+                                            <a-descriptions-item v-for="(item,index) in tab.inner" :label="item.label">
+                                                {{ item.content }}
+                                            </a-descriptions-item>
+                                        </a-descriptions>
+                                    </a-tab-pane>
+                                </a-tabs>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+</template>
+
+<script>
+import * as olEasing from 'ol/easing';
+import axios from "axios";
+import Overlay from "ol/Overlay";
+import {getAction} from "../../../api/manage";
+
+// 组件
+import CoordsLocate from '@/components/BasicMap/Tools/CoordsLocate.vue';
+import ResCatalog from "@/components/BasicMap/Tools/ResCatalog";
+import MeasureTool from '@/components/BasicMap/Tools/MeasureTool.vue'
+import QueryTool from '@/components/BasicMap/Tools/QueryTool.vue'
+import DrawTool from '@/components/BasicMap/Tools/DrawTool.vue';
+import {DragBox} from "ol/interaction";
+import {platformModifierKeyOnly} from "ol/events/condition";
+
+export default {
+    name: 'Toolbar',
+    components: {
+        CoordsLocate,
+        ResCatalog,
+        MeasureTool,
+        QueryTool,
+        DrawTool
+    },
+    data() {
+        return {
+            isRes: false,
+            isQuery: false,
+            isCoords: false,
+            isMeasure: false,
+            isDraw: false,
+            isClear: false,
+            isExtent: false,
+            coordsShow: false,
+            resShow: false,
+            measureShow: false,
+            queryShow: false,
+            drawShow: false,
+            properties: {},
+            labels: [],
+            tabs: [],
+            map: {},
+            currentCoordinate: null, // 弹窗坐标数据
+            overlay: null,
+            mapCursorKey: '',
+            output: '',
+            dataport: '',
+            relfield: '',
+        }
+
+    },
+    props: {
+        tools: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        splitScreen: {}
+    },
+    mounted() {
+        if (this.tools.length === 0) {
+            this.isRes = true;
+            this.isClear = true;
+            this.isDraw = true;
+            this.isCoords = true;
+            this.isExtent = true;
+            this.isMeasure = true;
+            this.isQuery = true;
+        } else {
+            this.tools.forEach((item) => {
+                this[item] = true;
+            })
+        }
+        // this.initPopup();
+    },
+    watch: {
+        measureShow: function (newValue) {
+            debugger;
+            if (newValue === false) {
+                this.$refs.measureToll.closeMeasureTool(this.baseMap.map);
+                this.baseMap.map.getOverlays().clear();
+                if (this.drawShow === false) {
+                    this.initPopup();
+                }
+            } else {
+                //移除点击事件
+                this.map.un(this.mapCursorKey.type, this.mapCursorKey.listener);
+                this.overlay.setPosition(undefined);
+                this.currentCoordinate = null;
+            }
+        }
+    },
+    provide() {
+        return {
+            splitScreen: this.splitScreen,
+        }
+    },
+    inject: ['baseMap'],
+    methods: {
+        handleDrawTool() {
+            this.measureShow = false;
+            this.coordsShow = false;
+            this.resShow = false;
+            this.queryShow = false;
+            this.drawShow = !this.drawShow;
+            if (this.drawShow) {
+                this.baseMap.map.getOverlays().clear();
+                this.$refs.drawTool.initDrawLayer();
+                // initVectorLayer(this.baseMap.map);
+                // this.output = initMeasureTool();
+            }
+        },
+        handleMeasure() {
+            this.measureShow = !this.measureShow;
+            this.coordsShow = false;
+            this.resShow = false;
+            this.queryShow = false;
+            this.drawShow = false;
+            if (this.measureShow) {
+                this.baseMap.map.getOverlays().clear();
+                this.$refs.measureToll.onChange();
+                // initVectorLayer(this.baseMap.map);
+                // this.output = initMeasureTool();
+            }
+        },
+        handleClear() {
+            this.measureShow = false;
+            this.coordsShow = false;
+            this.resShow = false;
+            this.queryShow = false;
+            this.drawShow = false;
+            this.$refs.measureToll.closeMeasureTool(this.baseMap.map);
+            this.$refs.coordsLocate.resetForm();
+            this.$refs.queryTool.clear();
+            this.$refs.drawTool.clearFeature();
+        },
+        zoomToFullExtent() {
+            let extent = [115.75550079345703, 36.407955169677734, 117.60053253173828, 38.01062774658203];
+            this.baseMap.map.getView().fit(extent, {
+                // size:[500,300],
+                duration: 500,
+                padding: [10, 10, 10, 10],
+                easing: olEasing.inAndOut
+            })
+        },
+        // 递归查找
+        getTreeExpandKeys(obj, name) {
+            // obj是传入的array
+            if (obj && obj.length !== 0) {
+                obj.forEach((item, index) => {
+                    if (item.alias === name) {
+                        this.labels = item.fields;
+                        this.relfield = item.relfield;
+                        this.dataport = item.dataport;
+                        return;
+                    }
+                    // 如果此列表有children, 进行递归
+                    if (item.layers) {
+                        this.getTreeExpandKeys(item.layers, name)
+                    }
+                })
+            }
+        },
+        initPopup() {
+            // 弹窗
+            this.overlay = new Overlay({
+                element: this.$refs.popup, // 弹窗标签,在html里
+                autoPan: true, // 如果弹窗在底图边缘时,底图会移动
+                autoPanAnimation: { // 底图移动动画
+                    duration: 250
+                },
+            });
+            this.map = this.baseMap.map;
+            this.map.addOverlay(this.overlay);
+            this.mapClick() // 初始化地图成功后,给地图添加点击事件
+            const dragBox = new DragBox({
+                condition: platformModifierKeyOnly,
+            });
+            this.map.addInteraction(dragBox);
+            dragBox.on('boxend', (evt) => {
+                const extent = dragBox.getGeometry().getExtent();
+                let queryLayer = this.getVisibleLayers();
+                if (queryLayer.length === 0) return;
+                queryLayer.forEach((item) => {
+                    let vectorSource = item.layer.getSource();
+                    /*const boxFeatures = vectorSource
+                      .getFeaturesInExtent(extent)
+                      .filter((feature) => feature.getGeometry().intersectsExtent(extent));*/
+                    // console.log(boxFeatures);
+                })
+
+
+            });
+        },
+        mapClick() { // 地图点击事件
+            // 通过 map.on() 监听,singleclick 是单击的意思。也可以用 click 代替 singleclick。
+            this.mapCursorKey = this.map.on('singleclick', evt => {
+                this.currentCoordinate = evt.coordinate; // 获取坐标
+                this.tabs = [];
+                let viewResolution = this.map.getView().getResolution();
+                // 获取可查的图层
+                let queryLayer = this.getVisibleLayers();
+                if (queryLayer.length === 0) return;
+                queryLayer.forEach((item) => {
+                    let url = item.layer.getSource().getFeatureInfoUrl(
+                        this.currentCoordinate,
+                        viewResolution,
+                        'EPSG:4490',
+                        {
+                            'INFO_FORMAT': 'application/json', //geoserver支持jsonp才能输出为jsonp的格式
+                            'FEATURE_COUNT': 50 //点击查询能返回的数量上限
+                        });
+                    axios({url, method: 'get'})
+                        .then(async (res) => {
+                            let {status, data: {features}} = res;
+                            if (status === 200) {
+                                if (features.length === 0) return;
+                                this.properties = features[0].properties;
+                                this.getTreeExpandKeys(this.baseMap.list, item.name);
+                                let labels = this.labels;
+                                // 点类型服务数据不全,需要再次查询
+                                if (this.dataport) {
+                                    let {
+                                        message,
+                                        success,
+                                        result
+                                    } = await getAction(this.dataport, {id: this.properties[this.relfield]});
+                                    if (success) {
+                                        this.properties = result;
+                                    } else {
+                                        this.$message.error(message);
+                                        return;
+                                    }
+                                    this.dataport = '';
+                                }
+                                // 弹窗内容(详细列表形式)
+                                if (labels.length > 0) {
+                                    labels.forEach((itemA) => {
+                                        itemA.content = this.properties[itemA.name];
+                                    });
+                                    let tab = {name: item.name, inner: labels};
+                                    this.tabs.push({...tab});
+                                    setTimeout(() => {
+                                        // 设置弹窗位置
+                                        // 这里要设置定时器, 不然弹窗首次出现, 底图会跑偏
+                                        this.overlay.setPosition(this.currentCoordinate);
+                                    }, 0)
+                                }
+                            } else {
+                                console.log('错误');
+                            }
+                        });
+
+                })
+            });
+
+        },
+
+        getVisibleLayers(layerName) {
+            let layer = [];
+            let item = {};
+            let layers = this.map.getLayers();
+            let layerCount = layers.getLength();
+            for (let i = 0; i < layerCount; i++) {
+                let visible = layers.item(i).get('visible');
+                let name = layers.item(i).get('alias');
+                if (visible && name) {
+                    item = {name, 'layer': layers.item(i)}
+                    layer.push(item);
+                }
+            }
+            return layer;
+        },
+    }
+}
+</script>
+
+<style scoped="scoped">
+.toolBar {
+    position: absolute;
+    top: 0.8em;
+    left: 5em;
+    border-radius: 4px;
+    padding: 0;
+    margin: 0;
+    background-color: whitesmoke;
+    cursor: pointer;
+    z-index: 1;
+    box-shadow: 0 0 5px #357ee5;
+    opacity: 0.9;
+}
+
+.nav {
+    padding-left: 0;
+    margin-bottom: 0;
+    list-style: none;
+    display: flex;
+}
+
+.nav-pills > li {
+    float: left;
+}
+
+.nav > li {
+    position: relative;
+    display: block;
+}
+
+.nav-pills > li + li {
+    margin-left: 2px;
+}
+
+.nav-pills > li > a {
+    border-radius: 4px;
+}
+
+.nav > li > a {
+    position: relative;
+    display: block;
+    padding: 10px 15px;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+    text-decoration: none;
+    background-color: #eeeeee;
+}
+
+a {
+    color: #337ab7;
+    text-decoration: none;
+}
+
+.nav > li > a > img {
+    max-width: none;
+}
+
+img {
+    vertical-align: middle;
+}
+
+#measureTool, #drawTool {
+    position: absolute;
+    top: 52px;
+    left: 0px;
+}
+
+#coordsLocate {
+    position: absolute;
+    top: 52px;
+    left: 0;
+}
+
+#resourceCatalog {
+    position: absolute;
+    top: 52px;
+    left: 0;
+}
+
+#queryTool {
+    position: absolute;
+    top: 52px;
+    left: 0;
+}
+</style>

+ 164 - 0
.svn/pristine/0f/0f085b39194988c0e27888a8be77566119959130.svn-base

@@ -0,0 +1,164 @@
+<template>
+  <div>
+    <a-card :bordered="false">
+      <a-row>
+        <a-col :sm="8" :xs="24">
+          <head-info title="我的待办" content="8个任务" :bordered="true"/>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <head-info title="本周任务平均处理时间" content="32分钟" :bordered="true"/>
+        </a-col>
+        <a-col :sm="8" :xs="24">
+          <head-info title="本周完成任务数" content="24个"/>
+        </a-col>
+      </a-row>
+    </a-card>
+
+    <a-card
+      style="margin-top: 24px"
+      :bordered="false"
+      title="标准列表">
+
+      <div slot="extra">
+        <a-radio-group>
+          <a-radio-button>全部</a-radio-button>
+          <a-radio-button>进行中</a-radio-button>
+          <a-radio-button>等待中</a-radio-button>
+        </a-radio-group>
+        <a-input-search style="margin-left: 16px; width: 272px;" />
+      </div>
+
+      <div class="operate">
+        <a-button type="dashed" style="width: 100%" icon="plus">添加</a-button>
+      </div>
+
+      <a-list size="large" :pagination="{showSizeChanger: true, showQuickJumper: true, pageSize: 5, total: 50}">
+        <a-list-item :key="index" v-for="(item, index) in data">
+          <a-list-item-meta :description="item.description">
+            <a-avatar slot="avatar" size="large" shape="square" :src="item.avatar"/>
+            <a slot="title">{{ item.title }}</a>
+          </a-list-item-meta>
+          <div slot="actions">
+            <a>编辑</a>
+          </div>
+          <div slot="actions">
+            <a-dropdown>
+              <a-menu slot="overlay">
+                <a-menu-item><a>编辑</a></a-menu-item>
+                <a-menu-item><a>删除</a></a-menu-item>
+              </a-menu>
+              <a>更多<a-icon type="down"/></a>
+            </a-dropdown>
+          </div>
+          <div class="list-content">
+            <div class="list-content-item">
+              <span>Owner</span>
+              <p>{{ item.owner }}</p>
+            </div>
+            <div class="list-content-item">
+              <span>开始时间</span>
+              <p>{{ item.startAt }}</p>
+            </div>
+            <div class="list-content-item">
+              <a-progress :percent="item.progress.value" :status="!item.progress.status ? null : item.progress.status" style="width: 180px" />
+            </div>
+          </div>
+        </a-list-item>
+      </a-list>
+
+    </a-card>
+  </div>
+</template>
+
+<script>
+  import HeadInfo from '@/components/tools/HeadInfo'
+
+  const data = []
+  data.push({
+    title: 'Alipay',
+    avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png',
+    description: '那是一种内在的东西, 他们到达不了,也无法触及的',
+    owner: '付晓晓',
+    startAt: '2018-07-26 22:44',
+    progress: {
+      value: 90
+    }
+  })
+  data.push({
+    title: 'Angular',
+    avatar: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png',
+    description: '希望是一个好东西,也许是最好的,好东西是不会消亡的',
+    owner: '曲丽丽',
+    startAt: '2018-07-26 22:44',
+    progress: {
+      value: 54
+    }
+  })
+  data.push({
+    title: 'Ant Design',
+    avatar: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png',
+    description: '生命就像一盒巧克力,结果往往出人意料',
+    owner: '林东东',
+    startAt: '2018-07-26 22:44',
+    progress: {
+      value: 66
+    }
+  })
+  data.push({
+    title: 'Ant Design Pro',
+    avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png',
+    description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆',
+    owner: '周星星',
+    startAt: '2018-07-26 22:44',
+    progress: {
+      value: 30
+    }
+  })
+  data.push({
+    title: 'Bootstrap',
+    avatar: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png',
+    description: '那时候我只会想自己想要什么,从不想自己拥有什么',
+    owner: '吴加好',
+    startAt: '2018-07-26 22:44',
+    progress: {
+      status: 'exception',
+      value: 100
+    }
+  })
+
+  export default {
+    name: "StandardList",
+    components: {
+      HeadInfo
+    },
+    data () {
+      return {
+        data
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+    .ant-avatar-lg {
+        width: 48px;
+        height: 48px;
+        line-height: 48px;
+    }
+
+    .list-content-item {
+        color: rgba(0, 0, 0, .45);
+        display: inline-block;
+        vertical-align: middle;
+        font-size: 14px;
+        margin-left: 40px;
+        span {
+            line-height: 20px;
+        }
+        p {
+            margin-top: 4px;
+            margin-bottom: 0;
+            line-height: 22px;
+        }
+    }
+</style>

+ 289 - 0
.svn/pristine/0f/0f787dbfd811fd604dfb31513e7a417d2d85205d.svn-base

@@ -0,0 +1,289 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="项目检查名称">
+              <a-input placeholder="请输入检查名称" v-model="queryParam.jcmc"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="数据来源">
+              <j-dict-select-tag placeholder="请选择数据来源" v-model="queryParam.sjly" dictCode="laiyuan"/>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="审批情况">
+              <j-dict-select-tag placeholder="请选择审批情况" v-model="queryParam.spqk" dictCode="spzt"/>
+            </a-form-item>
+          </a-col>
+
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+<!--              <a @click="handleToggleSearch" style="margin-left: 8px">-->
+<!--                {{ toggleSearchStatus ? '收起' : '展开' }}-->
+<!--                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>-->
+<!--              </a>-->
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" v-has="'xcjgjl:add'" type="primary" icon="plus">新增</a-button>
+      <a-button v-has="'xcjgjl:dc'" type="primary" icon="download" @click="handleExportXls('现场监管记录')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button v-has="'xcjgjl:dr'" type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px" v-has="'xcjgjl:pldelete'"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+        <template slot="jsxmmc" slot-scope="text,record">
+          <a @click="handleDetail(record)">{{ text }}</a>
+        </template>
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a-space>
+              <a-button @click='handleEdit(record)' v-has="'xcjgjl:bj'" size='small' type='primary'>编辑</a-button>
+              <a-popconfirm title='确定删除吗?' @confirm='() => handleDelete(record.id)'>
+                  <a-button size='small' v-has="'xcjgjl:delete'" type='danger'>删除</a-button>
+              </a-popconfirm>
+          </a-space>
+<!--          <a-divider type="vertical" />-->
+<!--          <a-dropdown>-->
+<!--            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>-->
+<!--            <a-menu slot="overlay">-->
+<!--              <a-menu-item>-->
+<!--                <a @click="handleDetail(record)">详情</a>-->
+<!--              </a-menu-item>-->
+<!--              <a-menu-item>-->
+<!--                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">-->
+<!--                  <a>删除</a>-->
+<!--                </a-popconfirm>-->
+<!--              </a-menu-item>-->
+<!--            </a-menu>-->
+<!--          </a-dropdown>-->
+        </span>
+
+      </a-table>
+    </div>
+
+    <rm-xcjgjl-modal ref="modalForm" @ok="modalFormOk"></rm-xcjgjl-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmXcjgjlModal from './modules/RmXcjgjlModal'
+  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
+
+  export default {
+    name: 'RmXcjgjlList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      RmXcjgjlModal
+    },
+    data () {
+      return {
+        description: '现场监管记录管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'项目名称',
+            align:"center",
+            dataIndex: 'jsxmmc',
+            scopedSlots: { customRender: 'jsxmmc'}
+          },
+          {
+            title:'工程名称',
+            align:"center",
+            dataIndex: 'gcmc',
+            scopedSlots: { customRender: 'gcmc'}
+          },
+          {
+            title:'施工单位',
+            align:"center",
+            dataIndex: 'sgdw'
+          },
+          {
+            title:'监管单位',
+            align:"center",
+            dataIndex: 'jgdw'
+          },
+          // {
+          //   title:'开工日期',
+          //   align:"center",
+          //   dataIndex: 'kgrq',
+          //   customRender:function (text) {
+          //     return !text?"":(text.length>10?text.substr(0,10):text)
+          //   }
+          // },
+          // {
+          //   title:'竣工日期',
+          //   align:"center",
+          //   dataIndex: 'jgrq',
+          //   customRender:function (text) {
+          //     return !text?"":(text.length>10?text.substr(0,10):text)
+          //   }
+          // },
+          {
+            title:'填报人',
+            align:"center",
+            dataIndex: 'tbr'
+          },
+          {
+            title:'检查时间',
+            align:"center",
+            dataIndex: 'createTime'
+          },
+          // {
+          //   title:'建设项目是否已竣工验收',
+          //   align:"center",
+          //   dataIndex: 'jsxmsfyjgys_dictText'
+          // },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/hzz.shjsgc.xcjgjl/rmXcjgjl/list",
+          delete: "/hzz.shjsgc.xcjgjl/rmXcjgjl/delete",
+          deleteBatch: "/hzz.shjsgc.xcjgjl/rmXcjgjl/deleteBatch",
+          exportXlsUrl: "/hzz.shjsgc.xcjgjl/rmXcjgjl/exportXls",
+          importExcelUrl: "hzz.shjsgc.xcjgjl/rmXcjgjl/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      handleDetail: function (record) {
+        this.$refs.modalForm.edit(record);
+        this.$refs.modalForm.title = "详情";
+        this.$refs.modalForm.disableSubmit = true;
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'jsxmmc',text:'建设项目名称',popup:{code:'xmlist',field:'xmmc',orgFields:'xmmc,xmlx',destFields:'xmmc,xmlx'}})
+          fieldList.push({type:'string',value:'jsxmid',text:'建设项目ID',dictCode:''})
+        fieldList.push({type:'string',value:'yzdwmc',text:'业主单位名称',dictCode:''})
+        fieldList.push({type:'string',value:'jsxmszd',text:'建设项目所在地',dictCode:''})
+        fieldList.push({type:'string',value:'jsxmszhd',text:'建设项目所在河道',dictCode:''})
+        fieldList.push({type:'date',value:'kgrq',text:'开工日期'})
+        fieldList.push({type:'date',value:'jgrq',text:'竣工日期'})
+        fieldList.push({type:'string',value:'jsqk',text:'建设情况',dictCode:'gcjsqk'})
+        fieldList.push({type:'string',value:'sfxybz',text:'是否需要编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfbz',text:'是否编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfps',text:'是否评审',dictCode:'yn'})
+        fieldList.push({type:'string',value:'spjg',text:'审批机关',dictCode:''})
+        fieldList.push({type:'string',value:'spwh',text:'审批文号',dictCode:''})
+        fieldList.push({type:'string',value:'sfsh',text:'是否审核',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sgshjgwjsj',text:'施工审核机关、文件、时间',dictCode:''})
+        fieldList.push({type:'string',value:'sgdw',text:'施工单位',dictCode:''})
+        fieldList.push({type:'string',value:'jgdw',text:'监管单位',dictCode:''})
+        fieldList.push({type:'string',value:'sgxcsffhyq',text:'施工现场是否符合要求',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sgjssfhfhdyz',text:'施工结束是否恢复河道原状',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfkxsg',text:'是否跨汛施工',dictCode:'yn'})
+        fieldList.push({type:'string',value:'dxfasfbz',text:'度汛方案是否编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'zrzsfls',text:'责任制是否落实',dictCode:'yn'})
+        fieldList.push({type:'string',value:'rywzsfls',text:'人员、物资是否落实',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfyq',text:'是否要求',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ayqwcqk',text:'按要求完成情况',dictCode:'ayqwcqk'})
+        fieldList.push({type:'string',value:'sfys',text:'是否验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'jsxmsfyjgys',text:'建设项目是否已竣工验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfcjjsxmjgys',text:'是否参加建设项目竣工验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ygzlsfbb',text:'有关资料是否报备',dictCode:'yn'})
+        fieldList.push({type:'Text',value:'czwtjclqk',text:'存在问题及处理情况',dictCode:''})
+          fieldList.push({type:'string',value:'xgtj',text:'相关图件',dictCode:''})
+          fieldList.push({type:'string',value:'wbfa',text:'视频上传',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 67 - 0
.svn/pristine/0f/0fc6b26a3b674d59327371bcb796334fce68635b.svn-base

@@ -0,0 +1,67 @@
+<template>
+  <div class="config-list">
+    <a-radio-group v-model="type">
+      <div class="item">
+        <a-radio value="TYPE_EVERY" class="choice" :disabled="disabled">每月</a-radio>
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_RANGE" class="choice" :disabled="disabled">区间</a-radio>
+        从
+        <a-input-number :disabled="type!==TYPE_RANGE || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueRange.start"/>
+        月
+        至
+        <a-input-number :disabled="type!==TYPE_RANGE || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueRange.end"/>
+        月
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_LOOP" class="choice" :disabled="disabled">循环</a-radio>
+        从
+        <a-input-number :disabled="type!==TYPE_LOOP || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueLoop.start"/>
+        月开始,间隔
+        <a-input-number :disabled="type!==TYPE_LOOP || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueLoop.interval"/>
+        月
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_SPECIFY" class="choice" :disabled="disabled">指定</a-radio>
+        <div class="list">
+          <a-checkbox-group v-model="valueList">
+            <template v-for="i of specifyRange">
+              <a-checkbox class="list-check-item" :key="`key-${i}`" :value="i" :disabled="type!==TYPE_SPECIFY || disabled">{{i}}</a-checkbox>
+            </template>
+          </a-checkbox-group>
+        </div>
+      </div>
+    </a-radio-group>
+  </div>
+</template>
+
+<script>
+import mixin from './mixin'
+
+export default {
+  name: 'month',
+  mixins: [mixin],
+  data() {
+    return {}
+  },
+  watch: {
+    value_c(newVal, oldVal) {
+      this.$emit('change', newVal)
+    }
+  },
+  created() {
+    this.DEFAULT_VALUE = '*'
+    this.minValue = 1
+    this.maxValue = 12
+    this.valueRange.start = 1
+    this.valueRange.end = 12
+    this.valueLoop.start = 1
+    this.valueLoop.interval = 1
+    this.parseProp(this.prop)
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  @import "mixin.less";
+</style>

+ 288 - 0
.svn/pristine/10/100d729eb43efe5488b3c8d955b0611aeb386af2.svn-base

@@ -0,0 +1,288 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="项目名称">
+              <a-input placeholder="请输入项目名称" v-model="queryParam.xmmc"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="行政区划">
+              <j-area-linkage type="cascader" v-model="queryParam.xzqh" placeholder="请选择省市区"/>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="审批年度">
+                <j-year-picker placeholder="请选择审批年度" v-model="queryParam.spnd" style="width: 100%"></j-year-picker>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="审批级别">
+<!--                <a-input placeholder="请输入审批级别" v-model="queryParam.spjb"></a-input>-->
+                <j-dict-select-tag placeholder="请选择审批级别" v-model="queryParam.spjb" dictCode="spjb"/>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="审批情况">
+                <j-dict-select-tag placeholder="请选择审批情况" v-model="queryParam.spqk" dictCode="spzt"/>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="建设状态">
+                <j-dict-select-tag placeholder="请选择建设状态" v-model="queryParam.jszt" dictCode="gcjsqk"/>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" v-has="'xmxx:add'" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" v-has="'xmxx:dc'" icon="download" @click="handleExportXls('项目信息')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" v-has="'xmxx:dr'" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+<!--      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>-->
+<!--      <a-dropdown v-if="selectedRowKeys.length > 0">-->
+<!--        <a-menu slot="overlay">-->
+<!--          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>-->
+<!--        </a-menu>-->
+<!--        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>-->
+<!--      </a-dropdown>-->
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        class="j-table-force-nowrap"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+        <template slot="xmmc" slot-scope="text,record">
+          <a @click="handleDetail(record)">{{ text }}</a>
+        </template>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+        <span slot="action" slot-scope="text, record">
+           <a-space>
+              <a-button @click='handleEdit(record)' v-has="'xmxx:bj'" size='small' type='primary'>编辑</a-button>
+              <a-popconfirm title='确定删除吗?' @confirm='() => handleDelete(record.id)'>
+                  <a-button size='small' v-has="'xmxx:delete'" type='danger'>删除</a-button>
+              </a-popconfirm>
+          </a-space>
+
+<!--          <a-divider type="vertical" />-->
+<!--          <a-dropdown>-->
+<!--            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>-->
+<!--            <a-menu slot="overlay">-->
+<!--              <a-menu-item>-->
+<!--                <a @click="handleDetail(record)">详情</a>-->
+<!--              </a-menu-item>-->
+<!--              <a-menu-item>-->
+<!--                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">-->
+<!--                  <a>删除</a>-->
+<!--                </a-popconfirm>-->
+<!--              </a-menu-item>-->
+<!--            </a-menu>-->
+<!--          </a-dropdown>-->
+        </span>
+
+      </a-table>
+    </div>
+
+    <rm-xmxx-modal ref="modalForm" @ok="modalFormOk"/>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmXmxxModal from './modules/RmXmxxModal'
+  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
+  import Area from '@/components/_util/Area'
+  import '@/assets/less/TableExpand.less'
+  import JYearPicker from "../../../../components/jeecg/JYearPicker";
+
+  export default {
+    name: "RmXmxxList",
+    mixins:[JeecgListMixin],
+    components: {
+      RmXmxxModal,
+      JYearPicker
+    },
+    data () {
+      return {
+        description: '项目信息管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'检查名称',
+            align:"center",
+            dataIndex: 'xmmc',
+            scopedSlots: { customRender: 'xmmc'}
+          },
+          {
+            title:'所在水系',
+            align:"center",
+            dataIndex: 'szsx_dictText'
+          },
+
+          {
+            title:'审批年度',
+            align:"center",
+            dataIndex: 'spnd',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'审批单位',
+            align:"center",
+            dataIndex: 'spdw'
+          },
+          {
+            title:'审批级别',
+            align:"center",
+            dataIndex: 'spjb'
+          },
+          {
+            title:'审批情况',
+            align:"center",
+            dataIndex: 'spqk_dictText'
+          },
+          // {
+          //   title:'总体布置简述',
+          //   align:"center",
+          //   dataIndex: 'ztbzjs'
+          // },
+          {
+            title:'建设状态',
+            align:"center",
+            dataIndex: 'jszt_dictText'
+          },
+            {
+                title:'项目负责人',
+                align:"center",
+                dataIndex: 'xmfzr'
+            },
+          // {
+          //   title: '操作',
+          //   dataIndex: 'action',
+          //   align:"center",
+          //   fixed:"right",
+          //   width:147,
+          //   scopedSlots: { customRender: 'action' },
+          // }
+        ],
+        url: {
+          list: "/hzz.shjsgc.xmxx/rmXmxx/list",
+          delete: "/hzz.shjsgc.xmxx/rmXmxx/delete",
+          deleteBatch: "/hzz.shjsgc.xmxx/rmXmxx/deleteBatch",
+          exportXlsUrl: "/hzz.shjsgc.xmxx/rmXmxx/exportXls",
+          importExcelUrl: "hzz.shjsgc.xmxx/rmXmxx/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.pcaData = new Area()
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      getPcaText(code){
+        return this.pcaData.getText(code);
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+         fieldList.push({type:'string',value:'xmmc',text:'项目名称',dictCode:''})
+         fieldList.push({type:'string',value:'szsx',text:'所在水系',dictCode:'shuixi'})
+         fieldList.push({type:'pca',value:'xzqh',text:'行政区划'})
+         fieldList.push({type:'string',value:'xmfzr',text:'项目负责人',dictCode:''})
+         fieldList.push({type:'string',value:'xjqhdm',text:'县级区划代码',dictCode:''})
+         fieldList.push({type:'string',value:'hzb',text:'横坐标',dictCode:''})
+         fieldList.push({type:'string',value:'zzb',text:'纵坐标',dictCode:''})
+         fieldList.push({type:'string',value:'dha',text:'电话',dictCode:''})
+         fieldList.push({type:'string',value:'lxqk',text:'立项情况',dictCode:''})
+         fieldList.push({type:'date',value:'spnd',text:'审批年度'})
+         fieldList.push({type:'string',value:'fhbz',text:'防洪标准',dictCode:''})
+         fieldList.push({type:'string',value:'spdw',text:'审批单位',dictCode:''})
+         fieldList.push({type:'string',value:'spjb',text:'审批级别',dictCode:''})
+         fieldList.push({type:'string',value:'spqk',text:'审批情况',dictCode:'spzt'})
+         fieldList.push({type:'string',value:'ztbzjs',text:'总体布置简述',dictCode:''})
+         fieldList.push({type:'string',value:'jszt',text:'建设状态',dictCode:'gcjsqk'})
+         fieldList.push({type:'string',value:'qt',text:'其他',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 41 - 0
.svn/pristine/10/1018cfbfea91d2dbb5bedd9a587a7beddcd8d83b.svn-base

@@ -0,0 +1,41 @@
+<template>
+  <div>
+    <index-chart v-if="indexStyle==1"></index-chart>
+    <index-bdc v-if="indexStyle==2"></index-bdc>
+    <index-task v-if="indexStyle==3"></index-task>
+<!--    <div style="width: 100%;text-align: right;margin-top: 20px">-->
+<!--      请选择首页样式:-->
+<!--      <a-radio-group v-model="indexStyle">-->
+<!--        <a-radio :value="1">统计图表</a-radio>-->
+<!--        <a-radio :value="2">统计图表2</a-radio>-->
+<!--        <a-radio :value="3">任务表格</a-radio>-->
+<!--      </a-radio-group>-->
+<!--    </div>-->
+  </div>
+</template>
+
+<script>
+  import IndexChart from './IndexChart'
+  import IndexTask from "./IndexTask"
+  import IndexBdc from './IndexBdc'
+
+  export default {
+    name: "Analysis",
+    components: {
+      IndexChart,
+      IndexTask,
+      IndexBdc
+    },
+    data() {
+      return {
+        indexStyle:1
+      }
+    },
+    created() {
+
+    },
+    methods: {
+
+    }
+  }
+</script>

BIN
.svn/pristine/11/112f3023fb56d82571a0d71a6d16ce7d0c0d822a.svn-base


+ 23 - 0
.svn/pristine/11/1131f881b49bd4cb746dfcc1d55e45bac52d4b8b.svn-base

@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import { USER_INFO, ENHANCE_PRE } from "@/store/mutation-types"
+const getters = {
+  device: state => state.app.device,
+  theme: state => state.app.theme,
+  color: state => state.app.color,
+  token: state => state.user.token,
+  avatar: state => {state.user.avatar = Vue.ls.get(USER_INFO).avatar; return state.user.avatar},
+  username: state => state.user.username,
+  nickname: state => {state.user.realname = Vue.ls.get(USER_INFO).realname; return state.user.realname},
+  welcome: state => state.user.welcome,
+  permissionList: state => state.user.permissionList,
+  userInfo: state => {state.user.info = Vue.ls.get(USER_INFO); return state.user.info},
+  addRouters: state => state.permission.addRouters,
+  onlAuthFields: state => {return state.online.authFields },
+  enhanceJs:(state) => (code) => {
+    state.enhance.enhanceJs[code] = Vue.ls.get(ENHANCE_PRE+code);
+    return state.enhance.enhanceJs[code]
+  }
+
+}
+
+export default getters

+ 134 - 0
.svn/pristine/11/1192b3789a17616ab1bbd962f7fbbbd5a0d6aab8.svn-base

@@ -0,0 +1,134 @@
+<template>
+    <j-modal
+        :title='title'
+        :width='width'
+        :visible='visible'
+        switchFullscreen
+        @ok='handleOk'
+        :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+        @cancel='handleCancel'
+        cancelText='关闭'>
+        <div class='attrPane'>
+            <rm-boundary-marker-form ref='realForm' @ok='submitCallback' :lng='this.lng' :lat='this.lat'
+                                     :disabled='disableSubmit' @coordsChange='coordsChange'></rm-boundary-marker-form>
+        </div>
+        <div class='geomPane'>
+          <basic-map ref="locMap" height='775px' layersUrl='/resManager.catalog/rescatalog/resList' :model="{...model,layerName:'界桩点'}"></basic-map>
+        </div>
+    </j-modal>
+</template>
+
+<script>
+
+import RmBoundaryMarkerForm from './RmBoundaryMarkerForm'
+import BasicMap from "../../../../../components/BasicMap/BasicMap";
+import proj4 from "proj4";
+import {register} from "ol/proj/proj4";
+import {transform} from "ol/proj";
+
+export default {
+    name: 'RmBoundaryMarkerModal',
+    components: {
+      BasicMap,
+        RmBoundaryMarkerForm
+    },
+    data() {
+        return {
+            lng: 0,
+            lat: 0,
+            title: '',
+            width: 1200,
+            visible: false,
+            disableSubmit: false,
+          model:{},
+        }
+    },
+  beforeCreate() {
+    proj4.defs("EPSG:4548",
+      "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
+    proj4.defs("EPSG:4527",
+      "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
+    proj4.defs("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs");
+
+    register(proj4);
+  },
+    methods: {
+        add() {
+            this.visible = true
+            this.$nextTick(() => {
+                this.$refs.realForm.add()
+            })
+        },
+        edit(record) {
+          this.model = record;
+          let coord=[record.hzb,record.zzb];
+          //测绘系统的坐标系与正常坐标系XY轴是反的,横坐标对应纬度
+          if (record.hzb > 39000000 || record.zzb > 39000000) {        //情况1:4527坐标,带带号投影坐标,坐标位数应为前8后7
+            this.lng = record.hzb>record.zzb?record.hzb:record.zzb;
+            this.lat = record.hzb>record.zzb?record.zzb:record.hzb;
+            coord= transform([this.lng,this.lat], 'EPSG:4527', 'EPSG:4490');
+          } else if (record.hzb > 180 || record.zzb > 180) {           //情况2:4548坐标,无带号投影坐标,坐标位数应为前6后7
+            this.lng = record.hzb<record.zzb?record.hzb:record.zzb
+            this.lat = record.hzb<record.zzb?record.zzb:record.hzb
+            coord = transform([this.lng,this.lat], 'EPSG:4548', 'EPSG:4490');
+          } else {                                                     //情况3:4490坐标,经纬度坐标
+            this.lng = record.hzb>record.zzb?record.hzb:record.zzb
+            this.lat = record.hzb>record.zzb?record.zzb:record.hzb
+          }
+          this.lng=parseFloat(coord[0].toFixed(6));
+          this.lat=parseFloat(coord[1].toFixed(6));
+            this.visible = true
+            this.$nextTick(() => {
+                this.$refs.realForm.edit({...record})
+            })
+          this.model=record;
+        },
+        close() {
+            this.$emit('close')
+            this.visible = false
+        },
+        handleOk() {
+            this.$refs.realForm.submitForm()
+        },
+        submitCallback() {
+            this.$emit('ok')
+            this.visible = false
+        },
+        handleCancel() {
+            this.close()
+        },
+        locateByCoords() {
+            let loc_x = this.hzb
+            let loc_y = this.zzb
+            this.$nextTick(() => {
+                this.$refs.locMap.locateByCoords(loc_x, loc_y)
+            })
+        },
+        coordsTranslated(coords) {
+            this.lng = coords[0].toFixed(6)
+            this.lat = coords[1].toFixed(6)
+        },
+        locMapReady() {
+            this.locateByCoords()
+        },
+        coordsChange(x,y) {
+            this.$refs.locMap.locateByCoords({...this.model,lng:x,lat:y,geoinfo:''});
+            this.edit({...this.model,hzb:x,zzb:y});
+        }
+    }
+}
+</script>
+
+<style scoped>
+.attrPane {
+    width: 33%;
+    display: inline-block;
+    overflow-y: auto;
+    height: 775px;
+}
+
+.geomPane {
+    width: 66%;
+    display: inline-block;
+}
+</style>

+ 63 - 0
.svn/pristine/11/11a3b6fa0f9ce3cae83723f2b1a3d712d8451da6.svn-base

@@ -0,0 +1,63 @@
+<template>
+  <a-config-provider :locale="locale">
+    <div id="app">
+      <router-view/>
+    </div>
+  </a-config-provider>
+</template>
+<script>
+import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
+import enquireScreen from '@/utils/device'
+
+export default {
+  data() {
+    return {
+      locale: zhCN,
+    }
+  },
+  created() {
+    let that = this
+    enquireScreen(deviceType => {
+      // tablet
+      if (deviceType === 0) {
+        that.$store.commit('TOGGLE_DEVICE', 'mobile')
+        that.$store.dispatch('setSidebar', false)
+      }
+      // mobile
+      else if (deviceType === 1) {
+        that.$store.commit('TOGGLE_DEVICE', 'mobile')
+        that.$store.dispatch('setSidebar', false)
+      } else {
+        that.$store.commit('TOGGLE_DEVICE', 'desktop')
+        that.$store.dispatch('setSidebar', true)
+      }
+
+    })
+  }
+}
+</script>
+<style>
+.ant-form-item .ant-form-item-label label{
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  display: block;
+}
+
+ul {
+  padding: 0;
+}
+
+ul > li {
+  list-style: none;
+}
+
+#app {
+  height: 100%;
+}
+.sidemenu{
+  display: flex;
+  flex-direction: column;
+}
+
+</style>

+ 175 - 0
.svn/pristine/12/1216105a3ad3c92e9f58e88e4d55f354a049c199.svn-base

@@ -0,0 +1,175 @@
+<template>
+  <a-card :bordered="false" :class="{'abcdefg':true}">
+    <div class="no-print" style="text-align: right">
+      <a-button v-print="'#printContent'" ghost type="primary">打印</a-button>
+    </div>
+    <section ref="print" id="printContent" class="abcdefg">
+      <div style="text-align: center">
+        <p style="font-size: 24px;font-weight: 800">打印测试表单</p>
+      </div>
+      <!--签字-->
+      <a-col :md="24" :sm="24">
+      <div class="sign" style="text-align: left;height: inherit">
+        <a-col :span="24">
+          <span>
+            打印人员:
+          </span>
+          <a-input style="width: 30%" v-model="printer"/>
+          <span style="margin-left: 12.5%">打印日期:</span>
+          <a-input style="width: 30%" v-model="printTime"/>
+        </a-col>
+        <a-col :span="24">
+        </a-col>
+        <a-col :span="24" style="margin-top: 20px">
+          <span>打印内容:</span>
+          <a-input style="width: 80%" v-model="printContent"/>
+        </a-col>
+        <a-col :span="24" style="margin-top: 20px">
+          <span>打印目的:</span>
+          <a-input style="width: 80%" v-model="printReason"/>
+        </a-col>
+        <a-col style="margin-top: 20px" :span="24">
+          <span>打印图片:</span>
+          <br/>
+          <a-upload
+            action="/jsonplaceholder.typicode.com/posts/"
+            listType="picture-card"
+            :fileList="fileList"
+            @preview="handlePreview"
+            @change="handleChange">
+            <div v-if="fileList.length < 3">
+              <a-icon type="plus" />
+              <div class="ant-upload-text">Upload</div>
+            </div>
+          </a-upload>
+          <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
+            <img alt="example" style="width: 100%" :src="previewImage" />
+          </a-modal>
+        </a-col>
+      </div>
+      </a-col>
+    </section>
+  </a-card>
+  <!--</page-layout>-->
+</template>
+<script>
+  import ACol from "ant-design-vue/es/grid/Col";
+  import ARow from "ant-design-vue/es/grid/Row";
+  import ATextarea from 'ant-design-vue/es/input/TextArea'
+
+  export default {
+    components: {
+      ATextarea,
+      ARow,
+      ACol,
+    },
+    name: 'Printgzsld',
+    props:{
+      reBizCode:{
+        type: String,
+        default: ''
+      }
+    },
+    data(){
+      return {
+        columns: [{
+        }
+        ],
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 2 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 8 },
+        },
+        printer:'张三',
+        printTime:'2019-02-01 12:00:00',
+        printContent:'打印内容就是,做一个打印测试',
+        printReason:'做一个打印测试',
+        previewVisible: false,
+        previewImage: '',
+        fileList: [{
+          uid: '-1',
+          name: 'xxx.png',
+          status: 'done',
+          url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
+        },
+          {
+            uid:'-2',
+            name:'pic1.png',
+            status:'done',
+            url:'https://www.gizbot.com/img/2016/11/whatsapp-error-lead-image-08-1478607387.jpg',
+          }
+        ],
+        url:{
+          loadApplicant:"/sps/register/loadApplicants",
+          loadRegisterFiles:"/sps/register/getRegisterFilesConfig",
+        }
+      }
+    },
+    created() {
+      this.getDate();
+    },
+    methods: {
+      loadData(){
+
+      },
+      getDate(){
+        // 当前时间
+      },
+      handleCancel () {
+        this.previewVisible = false
+      },
+      handlePreview (file) {
+        this.previewImage = file.url || file.thumbUrl
+        this.previewVisible = true
+      },
+      handleChange ({ fileList }) {
+        this.fileList = fileList
+      }
+    }
+  }
+</script>
+<style scoped>
+  /*update_begin author:scott date:20191203 for:打印机打印的字体模糊问题 */
+  * {
+    color: #000000!important;
+    -webkit-tap-highlight-color: #000000!important;
+  }
+  /*update_end author:scott date:20191203 for:打印机打印的字体模糊问题 */
+
+  .abcdefg .ant-card-body{
+    margin-left: 0%;
+    margin-right: 0%;
+    margin-bottom: 1%;
+    border:0px solid black;
+    min-width: 800px;
+    color:#000000!important;
+  }
+  .explain{
+    text-align: left;
+    margin-left: 50px;
+    color:#000000!important;
+  }
+  .explain .ant-input,.sign .ant-input{
+    font-weight:bolder;
+    text-align:center;
+    border-left-width:0px!important;
+    border-top-width:0px!important;
+    border-right-width:0px!important;
+  }
+  .explain div{
+    margin-bottom: 10px;
+  }
+  /* you can make up upload button and sample style by using stylesheets */
+  .ant-upload-select-picture-card i {
+    font-size: 32px;
+    color: #999;
+  }
+
+  .ant-upload-select-picture-card .ant-upload-text {
+    margin-top: 8px;
+    color: #666;
+  }
+</style>

+ 189 - 0
.svn/pristine/12/1250c1bb2f00c666a090d1cc086b2c0640aefe95.svn-base

@@ -0,0 +1,189 @@
+<template>
+  <div ref="tableWarp" class="tableWarp">
+    <!-- 操作按钮区域 -->
+    <slot name="extra_" slot="extra"></slot>
+    <div class="table-operator">
+      <a-row type="flex" :gutter="24" justify="space-between">
+        <a-col :xl="16" :lg="16" :md="16" :sm="16" >
+          <a-button type="primary" icon="download" >导出</a-button>
+          <h5 style="display:inline-block;">{{cggraphreportData.head.annotation}}</h5>
+        </a-col>
+        <a-col :xl="4" :lg="4" :md="4" :sm="4" style="text-align:end">
+          <a-switch checked-children="分页" un-checked-children="分页" v-model="ipagination"/>
+        </a-col>
+      </a-row>
+    </div>
+    <a-table
+      size="middle"
+      bordered
+      :rowKey="(record, index) => index"
+      :columns="columns"
+      :data-source="getTableAddTotalRow"
+      :pagination="ipagination"
+      :scroll="{x:getTableScroll}"
+    >
+      <template v-for="(key,i) in Object.keys(customRender)" :slot="key" slot-scope="text, record, index">
+        <div class="custom-render" :key="i" @click="addComment(text,record,index,$event)" v-html="customRender[key](text, record)"></div>
+      </template>
+    </a-table>
+  </div>
+</template>
+<script>
+import { filterDictTextByCache } from '@/components/dict/JDictSelectUtil'
+export default {
+  name: 'GraphreportAutoTable',
+  computed: {
+    getTableAddTotalRow() { // 根据配置获取表格数据
+      let tableDataSource_
+      if (this.cggraphreportData.head.dataType === 'json') {
+        tableDataSource_ = JSON.parse(JSON.stringify(this.chartData))
+      } else if (this.cggraphreportData.head.dataType === 'sql' || this.cggraphreportData.head.dataType === 'bean') {
+        tableDataSource_ = JSON.parse(JSON.stringify(this.cggraphreportData.data.data))
+      }
+      if (!this.isTotal) {
+        return tableDataSource_
+      }
+      const numKey = 'rowIndex'
+      const totalRow = { [numKey]: '合计' }
+      this.columns.forEach(column => {
+        const { key, dataIndex } = column
+        if (![key, dataIndex].includes(numKey)) {
+          let total = 0
+          tableDataSource_.forEach(data => {
+            total += /^\d+\.?\d?$/.test(data[dataIndex]) ? Number.parseFloat(data[dataIndex]) : Number.NaN
+          })
+          if (Number.isNaN(total) || !column.isTotal) {
+            total = '-'
+          }
+          totalRow[dataIndex] = total
+        }
+      })
+      tableDataSource_.push(totalRow)
+      return tableDataSource_
+    },
+    getTableScroll() {
+      const width = this.columns.length * 100 - 40
+      // 解决表格列分配宽度小于表格宽度时 多一列bug
+      if (width < this.tableWarpWidth) {
+        this.columns.forEach(function(item) {
+          if (item.dataIndex !== 'rowIndex') {
+            delete item.width
+          }
+        })
+      }
+      return width > this.tableWarpWidth ? width : false
+    }
+  },
+  data() {
+    return {
+      columns: [], // 需要渲染的表头
+      rowIndexColumns: {// 序号列头
+        title: '#',
+        dataIndex: 'rowIndex',
+        width: 60,
+        align: 'center',
+        fixed: 'left',
+        customRender: function(text, r, index) {
+          return parseInt(index) + 1
+        }
+      },
+      rowIndexTotalColumns: {// 序号列头
+        title: '#',
+        dataIndex: 'rowIndex',
+        width: 60,
+        align: 'center',
+        fixed: 'left',
+        customRender: function(text, r, index) {
+          return (text !== '合计') ? (parseInt(index) + 1) : text
+        }
+      },
+      customRender: {},
+      ipagination: true,
+      spinning: true,
+      tableWarpWidth: 0, // 判断table是否超宽
+      isTotal: false // 判断是否合计
+    }
+  },
+  props: ['items', 'cggraphreportData', 'chartData'],
+  watch: {
+    items: {
+      handler(val, oldVal) {
+        this.getColunms()
+      },
+      deep: true // true 深度监听
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      if (this.$refs.tableWarp) {
+        this.tableWarpWidth = this.$refs.tableWarp.offsetWidth
+      }
+      this.getColunms()
+    })
+  },
+  methods: {
+    getColunms() { // 根据弹窗的数据获取表格的表头
+      const that = this
+      that.columns = [this.rowIndexColumns]
+      const items = JSON.parse(JSON.stringify(this.items))
+      items.sort(function(a, b) {
+        return a.orderNum - b.orderNum
+      })
+      items.forEach((item, i) => {
+        if (item.isShow) {
+          const column = {
+            title: item.fieldTxt,
+            align: 'center',
+            dataIndex: item.fieldName,
+            isTotal: item.isTotal,
+            width: item.fieldWidth || 100
+          }
+          if (item.dictCode) {
+            column.customRender = function(t, r, i) {
+              return filterDictTextByCache(item.dictCode, t)
+            }
+          }
+          if (item.jsEnhance) {
+            column.scopedSlots = { customRender: column.dataIndex }
+            var obj = eval('(' + item.jsEnhance + ')')
+            that.customRender[column.dataIndex] = obj.customRender
+          }
+          that.columns.push(column)
+        }
+        if (item.isTotal) {
+          this.isTotal = true
+        }
+      })
+      if (this.isTotal) {
+        that.columns.splice(0, 1, this.rowIndexTotalColumns)
+      }
+      if (that.getTableScroll) {
+        this.rowIndexColumns.fixed = 'left'
+      } else {
+        this.rowIndexColumns.fixed = false
+      }
+    },
+    addComment(text, record, index, $event) { // 处理js增强添加的方法  目前只支持click
+      var domClick = $event.target.getAttribute('@click')
+      if (domClick) {
+        domClick = eval('(' + domClick + ')')
+        domClick.call(this, text, record, index)
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+.ant-table td { white-space: nowrap; }
+</style>
+<style>
+  .custom-render>*{
+    display: inline-block;
+    min-width: 20px;
+    height: 100%;
+    border-radius: 5px;
+  }
+  .custom-render{
+    display: inline-block;
+  }
+</style>

+ 239 - 0
.svn/pristine/12/12ad7564160d3a48fbb3d2cda843ae25bddb5cdf.svn-base

@@ -0,0 +1,239 @@
+<template>
+    <a-card :bordered="false">
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline" @keyup.enter.native="searchQuery">
+                <a-row :gutter="24">
+                    <a-col :xl="6" :lg="7" :md="8" :sm="24">
+                        <a-form-item label="河湖编码">
+                            <a-input placeholder="请输入河湖编码" v-model="queryParam.hhbm"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :xl="6" :lg="7" :md="8" :sm="24">
+                        <a-form-item label="河湖名称">
+                            <a-input placeholder="请输入河湖名称" v-model="queryParam.hhmc"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :xl="6" :lg="7" :md="8" :sm="24">
+                        <a-form-item label="岸别">
+                            <j-dict-select-tag placeholder="请选择岸别" v-model="queryParam.zya" dictCode="ab"/>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :xl="6" :lg="7" :md="8" :sm="24">
+           <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+               <!--              <a @click="handleToggleSearch" style="margin-left: 8px">-->
+               <!--              {{ toggleSearchStatus ? '收起' : '展开' }}-->
+               <!--              <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>-->
+               <!--              </a>-->
+            </span>
+                    </a-col>
+                </a-row>
+            </a-form>
+        </div>
+        <!-- 查询区域-END -->
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" v-has="'axbhq:add'" type="primary" icon="plus">新增</a-button>
+            <a-button v-has="'axbhq:dc'" type="primary" icon="download" @click="handleExportXls('rm_axghgnqgeo')">导出
+            </a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button v-has="'axbhq:dr'" type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <!-- 高级查询区域 -->
+            <j-super-query :fieldList="superFieldList" ref="superQueryModal"
+                           @handleSuperQuery="handleSuperQuery"></j-super-query>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px" v-has="'axbhq:pldelete'"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a
+                style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                ref="table"
+                size="middle"
+                :scroll="{x:true}"
+                bordered
+                rowKey="id"
+                :columns="columns"
+                :dataSource="dataSource"
+                :pagination="ipagination"
+                :loading="loading"
+                :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                class="j-table-force-nowrap"
+                @change="handleTableChange">
+                <template slot="hhmc" slot-scope="text,record">
+                    <a @click="handleDetail(record)">{{ text }}</a>
+                </template>
+                <template slot="htmlSlot" slot-scope="text">
+                    <div v-html="text"></div>
+                </template>
+                <template slot="imgSlot" slot-scope="text">
+                    <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+                    <img v-else :src="getImgView(text)" height="25px" alt=""
+                         style="max-width:80px;font-size: 12px;font-style: italic;"/>
+                </template>
+                <template slot="fileSlot" slot-scope="text">
+                    <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+                    <a-button
+                        v-else
+                        :ghost="true"
+                        type="primary"
+                        icon="download"
+                        size="small"
+                        @click="downloadFile(text)">
+                        下载
+                    </a-button>
+                </template>
+
+                <span slot="action" slot-scope="text, record">
+                    <a-space>
+                        <a-button @click='handleEdit(record)' v-has="'axbhq:bj'" size='small' type='primary'>编辑</a-button>
+                        <a-popconfirm title='确定删除吗?' @confirm='() => handleDelete(record.id)'>
+                            <a-button size='small' v-has="'axbhq:delete'" type='danger'>删除</a-button>
+                        </a-popconfirm>
+                    </a-space>
+                </span>
+            </a-table>
+        </div>
+
+        <rm-axghgnqgeo-modal ref="modalForm" @ok="modalFormOk"></rm-axghgnqgeo-modal>
+    </a-card>
+</template>
+
+<script>
+
+import '@/assets/less/TableExpand.less'
+import {mixinDevice} from '@/utils/mixin'
+import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+import RmAxghgnqgeoModal from './modules/RmAxghgnqgeoModal'
+
+export default {
+    name: 'RmAxghgnqgeoList',
+    mixins: [JeecgListMixin, mixinDevice],
+    components: {
+        RmAxghgnqgeoModal
+    },
+    data() {
+        return {
+            description: 'rm_axghgnqgeo管理页面',
+            // 表头
+            columns: [
+                {
+                    title: '序号',
+                    dataIndex: '',
+                    key: 'rowIndex',
+                    width: 60,
+                    align: "center",
+                    customRender: function (t, r, index) {
+                        return parseInt(index) + 1;
+                    }
+                },
+                {
+                    title: '河湖名称',
+                    align: "center",
+                    dataIndex: 'hhmc',
+                    scopedSlots: {customRender: 'hhmc'}
+
+                },
+                {
+                    title: '河湖编码',
+                    align: "center",
+                    dataIndex: 'hhbm'
+
+                },
+                {
+                    title: '河湖类型',
+                    align: "center",
+                    dataIndex: 'hhlx'
+                },
+                {
+                    title: '县区编码',
+                    align: "center",
+                    dataIndex: 'xqbm'
+                },
+                {
+                    title: '县区名称',
+                    align: "center",
+                    dataIndex: 'xqmc'
+                },
+                {
+                    title: '岸别',
+                    align: "center",
+                    dataIndex: 'zya'
+                },
+                {
+                    title: '功能区类型',
+                    align: "center",
+                    dataIndex: 'gnqlx'
+                },
+
+                {
+                    title: '操作',
+                    dataIndex: 'action',
+                    align: "center",
+                    fixed: "right",
+                    width: 147,
+                    scopedSlots: {customRender: 'action'}
+                }
+            ],
+            url: {
+                list: "/hzz.axgh.axghgnq/rmAxghgnqgeo/list_bh",
+                delete: "/hzz.axgh.axghgnq/rmAxghgnqgeo/delete",
+                deleteBatch: "/hzz.axgh.axghgnq/rmAxghgnqgeo/deleteBatch",
+                exportXlsUrl: "/hzz.axgh.axghgnq/rmAxghgnqgeo/exportXls",
+                importExcelUrl: "hzz.axgh.axghgnq/rmAxghgnqgeo/importExcel",
+
+            },
+            dictOptions: {},
+            superFieldList: [],
+        }
+    },
+    created() {
+        this.getSuperFieldList();
+    },
+    computed: {
+        importExcelUrl: function () {
+            return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+        },
+    },
+    methods: {
+        initDictConfig() {
+        },
+        getSuperFieldList() {
+            let fieldList = [];
+            fieldList.push({type: 'string', value: 'hhbm', text: '河湖编码', dictCode: ''})
+            fieldList.push({type: 'string', value: 'hhlx', text: '河湖类型', dictCode: ''})
+            fieldList.push({type: 'string', value: 'hhmc', text: '河湖名称', dictCode: ''})
+            fieldList.push({type: 'string', value: 'xqbm', text: '县区编码', dictCode: ''})
+            fieldList.push({type: 'string', value: 'xqmc', text: '县区名称', dictCode: ''})
+            fieldList.push({type: 'string', value: 'zya', text: '岸别', dictCode: 'ab'})
+            fieldList.push({type: 'string', value: 'gnqlx', text: '功能区类型', dictCode: ''})
+
+            this.superFieldList = fieldList
+        }
+    }
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>

+ 192 - 0
.svn/pristine/12/12e991e4b75a7e5bad3dd1d072cb2c6e7c435f7c.svn-base

@@ -0,0 +1,192 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="24">
+            <a-form-item label="订单号">
+              <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="24">
+            <a-form-item label="订单类型">
+              <a-select placeholder="请输入订单类型"  v-model="queryParam.ctype">
+                <a-select-option value="1">国内订单</a-select-option>
+                <a-select-option value="2">国际订单</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="6" :sm="24" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('一对多示例')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <jeecgOrderMain-modal ref="modalForm" @ok="modalFormOk"></jeecgOrderMain-modal>
+  </a-card>
+</template>
+
+<script>
+  import JeecgOrderMainModal from './modules/JeecgOrderMainModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "JeecgOrderMainList",
+    mixins: [JeecgListMixin],
+    components: {
+      JeecgOrderMainModal
+    },
+    data () {
+      return {
+        description: '订单管理页面',
+        importExcelUrl:`${window._CONFIG['domianURL']}/test/jeecgOrderMain/importExcel`,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title: '订单号',
+            align:"center",
+            dataIndex: 'orderCode'
+          },
+          {
+            title: '订单类型',
+            align:"center",
+            dataIndex: 'ctype',
+            customRender: (text, record, index) => {
+              let re = "";
+              if (text === '1') {
+                re = "国内订单";
+              } else if (text === '2') {
+                re = "国际订单";
+              }
+              return re;
+            }
+          },
+          {
+            title: '订单日期',
+            align:"center",
+            dataIndex: 'orderDate'
+          },
+          {
+            title: '订单金额',
+            align:"center",
+            dataIndex: 'orderMoney'
+          },
+          {
+            title: '订单备注',
+            align:"center",
+            dataIndex: 'content'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+
+		url: {
+          list: "/test/jeecgOrderMain/list",
+          delete: "/test/jeecgOrderMain/delete",
+          deleteBatch: "/test/jeecgOrderMain/deleteBatch",
+          exportXlsUrl: "/test/jeecgOrderMain/exportXls",
+        }
+      }
+    },
+    methods: {
+    }
+  }
+</script>
+<style scoped>
+  /** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>

+ 225 - 0
.svn/pristine/13/1380280f667590c36863f94f5b964cbe162b22c8.svn-base

@@ -0,0 +1,225 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :ok=false
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    :okButtonProps="{ props: {disabled: disableSubmit} }"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+
+    <a-spin :spinning="confirmLoading">
+      <a-form-model ref="form" :model="model" :rules="validatorRules">
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="机构名称"
+          prop="departName"
+          :hidden="false"
+          hasFeedback >
+          <a-input id="departName" placeholder="请输入机构/部门名称" v-model="model.departName"/>
+        </a-form-model-item>
+        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" :hidden="seen" label="上级部门" hasFeedback>
+        <a-tree-select
+          style="width:100%"
+          :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
+          :treeData="departTree"
+          v-model="model.parentId"
+          placeholder="请选择上级部门"
+          :disabled="condition">
+        </a-tree-select>
+        </a-form-model-item>
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="机构类型">
+         <template v-if="seen">
+            <a-radio-group v-model="model.orgCategory" placeholder="请选择机构类型">
+              <a-radio value="1">
+                公司
+              </a-radio>
+            </a-radio-group>
+          </template>
+          <template v-else>
+            <a-radio-group v-model="model.orgCategory" placeholder="请选择机构类型">
+              <a-radio value="2">
+                部门
+              </a-radio>
+              <a-radio value="3">
+                岗位
+              </a-radio>
+            </a-radio-group>
+       </template>
+        </a-form-model-item>
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          prop="mobile"
+          label="电话">
+          <a-input placeholder="请输入电话" v-model="model.mobile"/>
+        </a-form-model-item>
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="传真">
+          <a-input placeholder="请输入传真" v-model="model.fax"/>
+        </a-form-model-item>
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="地址">
+          <a-input placeholder="请输入地址" v-model="model.address"/>
+        </a-form-model-item>
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="排序">
+          <a-input v-model="model.departOrder"/>
+        </a-form-model-item>
+        <a-form-model-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-textarea placeholder="请输入备注" v-model="model.memo"/>
+        </a-form-model-item>
+
+      </a-form-model>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import { queryIdTree } from '@/api/api'
+  import pick from 'lodash.pick'
+  import ATextarea from 'ant-design-vue/es/input/TextArea'
+  export default {
+    name: "SysDepartModal",
+    components: { ATextarea },
+    data () {
+      return {
+        departTree:[],
+        orgTypeData:[],
+        phoneWarning:'',
+        departName:"",
+        title:"操作",
+        seen:false,
+        visible: false,
+        condition:true,
+        disableSubmit:false,
+        model: {},
+        defaultModel:{
+          departOrder:0,
+          orgCategory:'1'
+        },
+        menuhidden:false,
+        menuusing:true,
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        validatorRules:{
+          departName:[{ required: true, message: '请输入机构/部门名称!' }],
+          orgCode:[{ required: true, message: '请输入机构编码!' }],
+          mobile: [{validator:this.validateMobile}],
+          orgCategory:[{required: true, message: '请输入机构类型!'}]
+        },
+        url: {
+          add: "/sys/sysDepart/add",
+        },
+        dictDisabled:true,
+      }
+    },
+    created () {
+    },
+    methods: {
+      loadTreeData(){
+        var that = this;
+        queryIdTree().then((res)=>{
+          if(res.success){
+            that.departTree = [];
+            for (let i = 0; i < res.result.length; i++) {
+              let temp = res.result[i];
+              that.departTree.push(temp);
+            }
+          }
+
+        })
+      },
+      add (depart) {
+        if(depart){
+          this.seen = false;
+          this.dictDisabled = false;
+        }else{
+          this.seen = true;
+          this.dictDisabled = true;
+        }
+        this.edit(depart);
+      },
+      edit (record) {
+          this.visible = true;
+          this.model = Object.assign({}, this.defaultModel, record)
+          this.loadTreeData();
+          this.model.parentId = record!=null?record.toString():null;
+           if(this.seen){
+             this.model.orgCategory = '1';
+           }else{
+             this.model.orgCategory = '2';
+           }
+      },
+      close () {
+        this.$emit('close');
+        this.disableSubmit = false;
+        this.visible = false;
+        this.$refs.form.resetFields();
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            httpAction(this.url.add,this.model,"post").then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.loadTreeData();
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+          }else{
+            return false;
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+      validateMobile(rule,value,callback){
+        if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){
+          callback();
+        }else{
+          callback("您的手机号码格式不正确!");
+        }
+
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 225 - 0
.svn/pristine/13/13c28174e7a88b43d075228334444f3c75105fb2.svn-base

@@ -0,0 +1,225 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 抽屉 -->
+    <a-drawer
+      title="字典列表"
+      :width="screenWidth"
+      @close="onClose"
+      :visible="visible"
+    >
+      <!-- 抽屉内容的border -->
+      <div
+        :style="{
+          padding:'10px',
+          border: '1px solid #e9e9e9',
+          background: '#fff',
+        }">
+
+        <div class="table-page-search-wrapper">
+          <a-form layout="inline" :form="form" @keyup.enter.native="searchQuery">
+            <a-row :gutter="10">
+              <a-col :md="8" :sm="12">
+                <a-form-item label="名称">
+                  <a-input style="width: 120px;" placeholder="请输入名称" v-model="queryParam.itemText"></a-input>
+                </a-form-item>
+              </a-col>
+              <a-col :md="9" :sm="24">
+                <a-form-item label="状态" style="width: 170px" :labelCol="labelCol" :wrapperCol="wrapperCol">
+                  <a-select
+                    placeholder="请选择"
+                    v-model="queryParam.status"
+                  >
+                    <a-select-option value="1">正常</a-select-option>
+                    <a-select-option value="0">禁用</a-select-option>
+                  </a-select>
+                </a-form-item>
+              </a-col>
+              <a-col :md="7" :sm="24">
+              <span style="float: left;" class="table-page-search-submitButtons">
+                <a-button type="primary" @click="searchQuery">搜索</a-button>
+                <a-button type="primary" @click="searchReset" style="margin-left: 8px">重置</a-button>
+              </span>
+              </a-col>
+            </a-row>
+            <a-row>
+              <a-col :md="2" :sm="24">
+                <a-button style="margin-bottom: 10px" type="primary" @click="handleAdd">新增</a-button>
+              </a-col>
+            </a-row>
+          </a-form>
+        </div>
+        <div>
+          <a-table
+            ref="table"
+            rowKey="id"
+            size="middle"
+            :columns="columns"
+            :dataSource="dataSource"
+            :pagination="ipagination"
+            :loading="loading"
+            @change="handleTableChange"
+            :rowClassName="getRowClassname"
+          >
+
+          <span slot="action" slot-scope="text, record">
+            <a @click="handleEdit(record)">编辑</a>
+            <a-divider type="vertical"/>
+            <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+              <a>删除</a>
+            </a-popconfirm>
+          </span>
+
+          </a-table>
+        </div>
+      </div>
+    </a-drawer>
+    <dict-item-modal ref="modalForm" @ok="modalFormOk"></dict-item-modal> <!-- 字典数据 -->
+  </a-card>
+</template>
+
+<script>
+  import pick from 'lodash.pick'
+  import {filterObj} from '@/utils/util';
+  import DictItemModal from './modules/DictItemModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "DictItemList",
+    mixins: [JeecgListMixin],
+    components: {DictItemModal},
+    data() {
+      return {
+        columns: [
+          {
+            title: '名称',
+            align: "center",
+            dataIndex: 'itemText',
+          },
+          {
+            title: '数据值',
+            align: "center",
+            dataIndex: 'itemValue',
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        queryParam: {
+          dictId: "",
+          dictName: "",
+          itemText: "",
+          delFlag: "1",
+          status: [],
+        },
+        title: "操作",
+        visible: false,
+        screenWidth: 800,
+        model: {},
+        dictId: "",
+        status: 1,
+        labelCol: {
+          xs: {span: 5},
+          sm: {span: 5},
+        },
+        wrapperCol: {
+          xs: {span: 12},
+          sm: {span: 12},
+        },
+        form: this.$form.createForm(this),
+        validatorRules: {
+          itemText: {rules: [{required: true, message: '请输入名称!'}]},
+          itemValue: {rules: [{required: true, message: '请输入数据值!'}]},
+        },
+        url: {
+          list: "/sys/dictItem/list",
+          delete: "/sys/dictItem/delete",
+          deleteBatch: "/sys/dictItem/deleteBatch",
+        },
+      }
+    },
+    created() {
+      // 当页面初始化时,根据屏幕大小来给抽屉设置宽度
+      this.resetScreenSize();
+    },
+    methods: {
+      add(dictId) {
+        this.dictId = dictId;
+        this.edit({});
+      },
+      edit(record) {
+        if (record.id) {
+          this.dictId = record.id;
+        }
+        this.queryParam = {}
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.model.dictId = this.dictId;
+        this.model.status = this.status;
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model, 'itemText', 'itemValue'))
+        });
+        // 当其它模块调用该模块时,调用此方法加载字典数据
+        this.loadData();
+      },
+
+      getQueryParams() {
+        //update--begin--autor:wangshuai-----date:20191204------for:清空总条数 teambition JT-113------
+        this.ipagination.total=0;
+        //update--end--autor:wangshuai-----date:20191204------for:清空总条数 teambition JT-113------
+        var param = Object.assign({}, this.queryParam);
+        param.dictId = this.dictId;
+        param.field = this.getQueryField();
+        param.pageNo = this.ipagination.current;
+        param.pageSize = this.ipagination.pageSize;
+        if (this.superQueryParams) {
+          param['superQueryParams'] = encodeURI(this.superQueryParams)
+          param['superQueryMatchType'] = this.superQueryMatchType
+        }
+        return filterObj(param);
+      },
+
+      // 添加字典数据
+      handleAdd() {
+        this.$refs.modalForm.add(this.dictId);
+        this.$refs.modalForm.title = "新增";
+      },
+      showDrawer() {
+        this.visible = true
+      },
+      onClose() {
+        this.visible = false
+        this.form.resetFields();
+        this.dataSource = [];
+      },
+      // 抽屉的宽度随着屏幕大小来改变
+      resetScreenSize() {
+        let screenWidth = document.body.clientWidth;
+        if (screenWidth < 600) {
+          this.screenWidth = screenWidth;
+        } else {
+          this.screenWidth = 600;
+        }
+      },
+      //update--begin--autor:wangshuai-----date:20191204------for:系统管理 数据字典禁用和正常区别开,添加背景颜色 teambition JT-22------
+      //增加样式方法返回值
+      getRowClassname(record){
+        if(record.status==0){
+          return "data-rule-invalid"
+        }
+      }
+      //update--end--autor:wangshuai-----date:20191204------for:系统管理 数据字典禁用和正常区别开,添加背景颜色 teambition JT-22------
+    }
+  }
+</script>
+<style lang="less" scoped>
+//update--begin--autor:wangshuai-----date:20191204------for:系统管理 数据字典禁用和正常区别开,添加背景颜色 teambition JT-22------
+/deep/ .data-rule-invalid{
+  background: #f4f4f4;
+  color: #bababa;
+}
+//update--begin--autor:wangshuai-----date:20191204------for:系统管理 数据字典禁用和正常区别开,添加背景颜色 teambition JT-22------
+</style>

+ 84 - 0
.svn/pristine/14/14120cfd0ec6de98dc95be6c3ce95cb73e7824a1.svn-base

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <rm-river-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></rm-river-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import RmRiverForm from './RmRiverForm'
+
+  export default {
+    name: 'RmRiverModal',
+    components: {
+      RmRiverForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:896,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 381 - 0
.svn/pristine/14/142b6acc41e22fa9322372386d31c563bb4947ea.svn-base

@@ -0,0 +1,381 @@
+<template>
+    <j-modal
+        :title="title"
+        :width="width"
+        :visible="visible"
+        :confirmLoading="confirmLoading"
+        switchFullscreen
+        @ok="handleOk"
+        :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+        @cancel="handleCancel"
+        cancelText="关闭">
+      <a-tabs default-active-key="attrs" >
+        <a-tab-pane key="attrs" tab="属性信息">
+        <a-spin :spinning="confirmLoading">
+            <j-form-container :disabled="disableSubmit">
+                <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+                    <a-row>
+                        <a-col :span="12">
+                            <a-form-model-item label="项目名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xmmc">
+                                <a-input v-model="model.xmmc" placeholder="请输入项目名称"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="所在水系" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="szsx">
+                                <j-dict-select-tag type="list" v-model="model.szsx" dictCode="shuixi"
+                                                   placeholder="请选择所在水系"/>
+                            </a-form-model-item>
+                        </a-col>
+                      <a-col :span="12">
+                        <a-form-model-item label="项目类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xangmlx">
+                          <j-dict-select-tag type="list" v-model="model.xmlx" dictCode="xangmlx"
+                                             placeholder="请选择项目类型"/>
+                        </a-form-model-item>
+                      </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="行政区划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xzqh">
+                            <j-multi-select-tag v-model="model.xzqh"  dictCode="xzqh" placeholder="请选择行政区划"></j-multi-select-tag>
+                                <!--              <a-input v-model="model.xzqh" placeholder="请输入行政区划" ></a-input>-->
+                               <!--   <j-area-linkage type="cascader" v-model="model.xzqh" placeholder="请输入省市区"
+                                                @change="xzqhChange"/>-->
+
+                            </a-form-model-item>
+                        </a-col>
+                        <!-- <a-col :span="12">
+                            <a-form-model-item label="区划代码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xjqhdm">
+                                <a-input v-model="model.xjqhdm" placeholder="请输入区划代码" disabled></a-input>
+                            </a-form-model-item>
+                        </a-col>-->
+                      <a-col :span="12">
+                        <a-form-model-item label="主要工程涉及河道" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zygcsjhd">
+                          <j-popup placeholder="请选择主要工程涉及河道" v-model="model.zygcsjhd" code="hllist"  field="zygcsjhd"
+                                   org-fields="hlmc" dest-fields="zygcsjhd"
+                                   :multi="true"/>
+                        </a-form-model-item>
+                      </a-col>
+                                  <a-col :span="12">
+                                    <a-form-model-item label="主要工程位置经度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hzb">
+                                      <a-input v-model="model.hzb" placeholder="请输入经度" style="width: 100%" />
+                                    </a-form-model-item>
+                                  </a-col>
+                                  <a-col :span="12">
+                                    <a-form-model-item label="主要工程位置纬度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zzb">
+                                      <a-input v-model="model.zzb" placeholder="请输入纬度" style="width: 100%" />
+                                    </a-form-model-item>
+                                  </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="项目负责人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xmfzr">
+                                <a-input v-model="model.xmfzr" placeholder="请输入项目负责人"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="电话" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dh">
+                                <a-input v-model="model.dh" placeholder="请输入电话"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="审批文号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spwh">
+                                <a-input v-model="model.spwh" placeholder="请输入审批文号"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="立项情况" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lxqk">
+                                <a-input v-model="model.lxqk" placeholder="请输入立项情况"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="审批年度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spnd">
+                                <j-year-picker placeholder="请选择审批年度" v-model="model.spnd"
+                                               style="width: 100%"></j-year-picker>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="防洪标准" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhbz">
+                                <a-input v-model="model.fhbz" placeholder="请输入防洪标准"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="审批单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spdw">
+                                <a-input v-model="model.spdw" placeholder="请输入审批单位"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="建设状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jszt">
+                                <j-dict-select-tag type="list" v-model="model.jszt" dictCode="gcjsqk"
+                                                   placeholder="请选择建设状态"/>
+                            </a-form-model-item>
+                        </a-col>
+
+                        <a-col :span="12">
+                            <a-form-model-item label="审批情况" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spzt">
+                                <j-dict-select-tag type="list" v-model="model.spzt" dictCode="spzt"
+                                                   placeholder="请选择审批情况"/>
+                            </a-form-model-item>
+                        </a-col>
+                        <!--          <a-col :span="24">-->
+                        <!--            <a-form-model-item label="是否批建不符" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sfpjbf">-->
+                        <!--              <j-dict-select-tag type="list" v-model="model.sfpjbf" dictCode="yn" placeholder="请选择是否批建不符" />-->
+                        <!--            </a-form-model-item>-->
+                        <!--          </a-col>-->
+                        <!--          <a-col :span="24">-->
+                        <!--            <a-form-model-item label="是否为无审批" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sfpjbf">-->
+                        <!--              <j-dict-select-tag type="list" v-model="model.sfwsp" dictCode="yn" placeholder="请选择是否无审批" />-->
+                        <!--            </a-form-model-item>-->
+                        <!--          </a-col>-->
+                        <!--          <a-col :span="24">-->
+                        <!--            <a-form-model-item label="是否补办审批" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sfbbsp">-->
+                        <!--              <j-dict-select-tag type="list" v-model="model.sfbbsp" dictCode="yn" placeholder="请选择是否补办审批" />-->
+                        <!--            </a-form-model-item>-->
+                        <!--          </a-col>-->
+                        <a-col :span="12">
+                            <a-form-model-item label="总体布置简述" :labelCol="labelCol" :wrapperCol="wrapperCol"
+                                               prop="ztbzjs">
+
+                                <a-input v-model="model.ztbzjs" placeholder="请输入总体布置简述"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="审批级别" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spjb">
+                                <j-dict-select-tag type="list" v-model="model.spjb" dictCode="spjb"
+                                                   placeholder="请选择审批级别"/>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="其他" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qt">
+                                <a-input v-model="model.qt" placeholder="请输入其他" rows="4"></a-input>
+                            </a-form-model-item>
+                        </a-col>
+                        <a-col :span="24">
+
+                        </a-col>
+                        <a-col :span="12">
+                            <a-form-model-item label="审批文件" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="wjsc">
+                                <j-upload biz-path="xmrk" v-model="model.wjsc"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+                         <a-col :span="12">
+                            <a-form-model-item label=" 立项文件" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lxwj">
+                                <j-upload biz-path="xmrk" v-model="model.lxwj"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+                         <a-col :span="12">
+                            <a-form-model-item label="防洪(输水)影响评价报告" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fhpjbg">
+                                <j-upload biz-path="xmrk" v-model="model.fhpjbg"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+                         <a-col :span="12">
+                            <a-form-model-item label="申请许可的文件" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sqxkwj">
+                                <j-upload biz-path="xmrk" v-model="model.sqxkwj"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+
+                        <a-col :span="12">
+                            <a-form-model-item label="建设项目涉及河道与防洪部分的建设方案" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjhdyfhbf">
+                                <j-upload biz-path="xmrk" v-model="model.sjhdyfhbf"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+                         <a-col :span="12">
+                            <a-form-model-item label="根据需要编制的防洪影响补救工程专项设计方案" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="bzfhyxbjgc">
+                                <j-upload biz-path="xmrk" v-model="model.bzfhyxbjgc"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+                         <a-col :span="12">
+                            <a-form-model-item label="建设项目主管部门作出的工程建设期间和运营期间服从
+水利建设和管理的相关承诺函;" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xgcns">
+                                <j-upload biz-path="xmrk" v-model="model.xgcns"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+                         <a-col :span="12">
+                            <a-form-model-item label="涉及第三人合法水事权益的,提供与第三人签订的协议" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dsfxy">
+                                <j-upload biz-path="xmrk" v-model="model.dsfxy"></j-upload>
+                            </a-form-model-item>
+                        </a-col>
+
+
+                    </a-row>
+                </a-form-model>
+            </j-form-container>
+        </a-spin>
+        </a-tab-pane>
+
+      <a-tab-pane key="map" tab="位置信息">
+        <basic-map ref="locMap" layersUrl='/resManager.catalog/rescatalog/resList' :model="{...model,layerName:'拟建项目,在建项目'}"></basic-map>
+      </a-tab-pane>
+      </a-tabs>
+      <span class="message">注意:填写完项目信息后,请继续填写单位信息,河段主要指标,涉河工程主要指标,涉河工程主要指标,分析计算主要成果,影响情况及消除或减轻影响措施信息表</span>
+    </j-modal>
+</template>
+
+<script>
+
+import {httpAction} from '@/api/manage'
+import {validateDuplicateValue} from '@/utils/util'
+import JYearPicker from "@comp/jeecg/JYearPicker";
+import BasicMap from "../../../../../components/BasicMap/BasicMap";
+import JMultiSelectTag from "@comp/dict/JMultiSelectTag";
+
+export default {
+    name: "RmAxxmxxModal",
+    components: {
+        JYearPicker,
+        BasicMap,
+      JMultiSelectTag
+    },
+    data() {
+        return {
+            title: "操作",
+            width: 1200,
+            visible: false,
+            model: {},
+            disableSubmit: false,
+            labelCol: {
+                xs: {span: 24},
+                sm: {span: 5},
+            },
+            wrapperCol: {
+                xs: {span: 24},
+                sm: {span: 16},
+            },
+
+            confirmLoading: false,
+            validatorRules: {
+              xmmc: [
+                { required: true, message: '请输入项目名称!'},
+              ],
+              szsx:[
+                {
+                  required: true, message: '请输入所在水系!'
+                }
+              ],
+              hzb:[
+                {
+                  required: true, message: '请输入主要工程位置横坐标!'
+                }
+              ],
+              zzb:[
+                {
+                  required: true, message: '请输入主要工程位置纵坐标!'
+                }
+              ],
+              jszt:[
+                {
+                  required: true, message: '请输入建设状态!'
+                }
+              ],
+              spnd:[
+                {
+                  required: true, message: '请输入审批年度!'
+                }
+              ],
+              spjb:[
+                {
+                  required: true, message: '请输入审批级别!'
+                }
+              ],
+              dh:[
+                {
+                  required: true, message: '请输入电话!'
+                }
+              ],
+              xzqh:[
+                {
+                  required: true, message: '请输行政区划!'
+                }
+              ],
+              zygcsjhd:[
+                {
+                  required: true, message: '请输入主要涉及河道(可多选)!'
+                }
+              ],
+              xmfzr:[
+                {
+                  required: true, message: '请输入项目负责人!'
+                }
+              ],
+            },
+            url: {
+                add: "/hzz.shjsgc.xmrk/rmAxxmxx/add",
+                edit: "/hzz.shjsgc.xmrk/rmAxxmxx/edit",
+            }
+
+        }
+    },
+    created() {
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+        add() {
+            this.edit(this.modelDefault);
+        },
+        edit(record) {
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        close() {
+            this.$emit('close');
+            this.visible = false;
+            this.$refs.form.clearValidate();
+        },
+        handleOk() {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let httpurl = '';
+                    let method = '';
+                    if (!this.model.id) {
+                        httpurl += this.url.add;
+                        method = 'post';
+                    } else {
+                        httpurl += this.url.edit;
+                        method = 'post';
+                    }
+                    httpAction(httpurl, this.model, method).then((res) => {
+                        if (res.success) {
+                            that.$message.success(res.message);
+                            that.$emit('ok');
+                        } else {
+                            that.$message.warning(res.message);
+                        }
+                    }).finally(() => {
+                        that.confirmLoading = false;
+                        that.close();
+                    })
+                } else {
+                    return false
+                }
+            })
+        },
+        handleCancel() {
+            this.close()
+        },
+      tabsChange(key) {
+        let that = this;
+        if (key == "map") {
+          this.$nextTick(() => {
+            this.$refs.locMap.locateByCoords({...that.model});
+          })
+        }
+      },
+      locateByCoords() {
+        let loc_x = this.hzb;
+        let loc_y = this.zzb;
+        this.$refs.locMap.locateByCoords(loc_x, loc_y);
+      },
+        xzqhChange(value) {
+            this.model.xjqhdm = value;
+        },
+
+
+    }
+}
+</script>
+<style type="text/css">
+  .message {
+    margin-left: 18%;
+    font-size: 16px;
+    color:red
+  }
+</style>

BIN
.svn/pristine/14/1442f4ed0e0f725cf0d07de40ecb03bba455da75.svn-base


+ 680 - 0
.svn/pristine/14/14b92be3430b9ae5b9699e8f023100e0d2a58b9b.svn-base

@@ -0,0 +1,680 @@
+<template>
+<div class="j-super-query-box">
+
+  <slot name="button" :isActive="superQueryFlag" :isMobile="izMobile" :open="handleOpen" :reset="handleReset">
+    <a-tooltip v-if="superQueryFlag" v-bind="tooltipProps" :mouseLeaveDelay="0.2">
+      <!-- begin 不知道为什么不加上这段代码就无法生效 -->
+      <span v-show="false">{{tooltipProps}}</span>
+      <!-- end 不知道为什么不加上这段代码就无法生效 -->
+      <template slot="title">
+        <span>已有高级查询条件生效</span>
+        <a-divider type="vertical"/>
+        <a @click="handleReset">清空</a>
+      </template>
+      <a-button-group>
+        <a-button type="primary" @click="handleOpen">
+          <a-icon type="appstore" theme="twoTone" spin/>
+          <span>高级查询</span>
+        </a-button>
+        <a-button v-if="izMobile" type="primary" icon="delete" @click="handleReset"/>
+      </a-button-group>
+    </a-tooltip>
+    <a-button v-else type="primary" icon="filter" @click="handleOpen">高级查询</a-button>
+  </slot>
+
+  <j-modal
+    title="高级查询构造器"
+    :width="1000"
+    :visible="visible"
+    @cancel="handleCancel"
+    :mask="false"
+    :fullscreen="izMobile"
+    class="j-super-query-modal"
+    style="top:5%;max-height: 95%;"
+  >
+
+    <template slot="footer">
+      <div style="float: left">
+        <a-button :loading="loading" @click="handleReset">重置</a-button>
+        <a-button :loading="loading" @click="handleSave">保存查询条件</a-button>
+      </div>
+      <a-button :loading="loading" @click="handleCancel">关闭</a-button>
+      <a-button :loading="loading" type="primary" @click="handleOk">查询</a-button>
+    </template>
+
+    <a-spin :spinning="loading">
+      <a-row>
+        <a-col :sm="24" :md="24-5">
+
+          <a-empty v-if="queryParamsModel.length === 0" style="margin-bottom: 12px;">
+            <div slot="description">
+              <span>没有任何查询条件</span>
+              <a-divider type="vertical"/>
+              <a @click="handleAdd">点击新增</a>
+            </div>
+          </a-empty>
+
+          <a-form v-else layout="inline">
+
+            <a-row style="margin-bottom: 12px;">
+              <a-col :md="12" :xs="24">
+                <a-form-item label="过滤条件匹配" :labelCol="{md: 6,xs:24}" :wrapperCol="{md: 18,xs:24}" style="width: 100%;">
+                  <a-select v-model="matchType" :getPopupContainer="node=>node.parentNode" style="width: 100%;">
+                    <a-select-option value="and">AND(所有条件都要求匹配)</a-select-option>
+                    <a-select-option value="or">OR(条件中的任意一个匹配)</a-select-option>
+                  </a-select>
+                </a-form-item>
+              </a-col>
+            </a-row>
+
+            <a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in queryParamsModel" :key="index">
+
+              <a-col :md="8" :xs="24" style="margin-bottom: 12px;">
+                <a-tree-select
+                  showSearch
+                  v-model="item.field"
+                  :treeData="fieldTreeData"
+                  :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
+                  placeholder="选择查询字段"
+                  allowClear
+                  treeDefaultExpandAll
+                  :getPopupContainer="node=>node.parentNode"
+                  style="width: 100%"
+                  @select="(val,option)=>handleSelected(option,item)"
+                >
+                </a-tree-select>
+              </a-col>
+
+              <a-col :md="4" :xs="24" style="margin-bottom: 12px;">
+                <a-select placeholder="匹配规则" :value="item.rule" :getPopupContainer="node=>node.parentNode" @change="handleRuleChange(item,$event)">
+                  <a-select-option value="eq">等于</a-select-option>
+                  <a-select-option value="like">包含</a-select-option>
+                  <a-select-option value="right_like">以..开始</a-select-option>
+                  <a-select-option value="left_like">以..结尾</a-select-option>
+                  <a-select-option value="in">在...中</a-select-option>
+                  <a-select-option value="ne">不等于</a-select-option>
+                  <a-select-option value="gt">大于</a-select-option>
+                  <a-select-option value="ge">大于等于</a-select-option>
+                  <a-select-option value="lt">小于</a-select-option>
+                  <a-select-option value="le">小于等于</a-select-option>
+                </a-select>
+              </a-col>
+
+              <a-col :md="8" :xs="24" style="margin-bottom: 12px;">
+                <!-- 下拉搜索 -->
+                <j-search-select-tag v-if="item.type==='sel_search'" v-model="item.val" :dict="getDictInfo(item)" placeholder="请选择"/>
+                <!-- 下拉多选 -->
+                <template v-else-if="item.type==='list_multi'">
+                  <j-multi-select-tag v-if="item.options" v-model="item.val" :options="item.options" placeholder="请选择"/>
+                  <j-multi-select-tag v-else v-model="item.val" :dictCode="getDictInfo(item)" placeholder="请选择"/>
+                </template>
+
+                <template v-else-if="item.dictCode">
+                  <template v-if="item.type === 'table-dict'">
+                    <j-popup
+                      v-model="item.val"
+                      :code="item.dictTable"
+                      :field="item.dictCode"
+                      :orgFields="item.dictCode"
+                      :destFields="item.dictCode"
+                      :multi="true"
+                    ></j-popup>
+                  </template>
+                  <template v-else>
+                    <j-multi-select-tag v-show="allowMultiple(item)" v-model="item.val" :dictCode="item.dictCode" placeholder="请选择"/>
+                    <j-dict-select-tag v-show="!allowMultiple(item)" v-model="item.val" :dictCode="item.dictCode" placeholder="请选择"/>
+                  </template>
+                </template>
+                <j-popup
+                  v-else-if="item.type === 'popup'"
+                  :value="item.val"
+                  v-bind="item.popup"
+                  group-id="superQuery"
+                  @input="(e,v)=>handleChangeJPopup(item,e,v)"
+                  :multi="true"/>
+                <j-select-multi-user
+                  v-else-if="item.type === 'select-user' || item.type === 'sel_user'"
+                  v-model="item.val"
+                  :buttons="false"
+                  :multiple="false"
+                  placeholder="请选择用户"
+                  :returnKeys="['id', item.customReturnField || 'username']"
+                />
+                <j-select-depart
+                  v-else-if="item.type === 'select-depart' || item.type === 'sel_depart'"
+                  v-model="item.val"
+                  :multi="false"
+                  placeholder="请选择部门"
+                  :customReturnField="item.customReturnField || 'id'"
+                />
+                <a-select
+                  v-else-if="item.options instanceof Array"
+                  v-model="item.val"
+                  :options="item.options"
+                  allowClear
+                  placeholder="请选择"
+                  :mode="allowMultiple(item)?'multiple':''"
+                />
+                <j-area-linkage v-model="item.val" v-else-if="item.type==='area-linkage' || item.type==='pca'" style="width: 100%"/>
+                <j-date v-else-if=" item.type=='date' " v-model="item.val" placeholder="请选择日期" style="width: 100%"></j-date>
+                <j-date v-else-if=" item.type=='datetime' " v-model="item.val" placeholder="请选择时间" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%"></j-date>
+                <a-time-picker v-else-if="item.type==='time'" :value="item.val ? moment(item.val,'HH:mm:ss') : null" format="HH:mm:ss" style="width: 100%" @change="(time,value)=>item.val=value"/>
+                <a-input-number v-else-if=" item.type=='int'||item.type=='number' " style="width: 100%" placeholder="请输入数值" v-model="item.val"/>
+                <a-select v-else-if="item.type=='switch'" placeholder="请选择" v-model="item.val">
+                  <a-select-option value="Y">是</a-select-option>
+                  <a-select-option value="N">否</a-select-option>
+                </a-select>
+                <a-input v-else v-model="item.val" placeholder="请输入值"/>
+              </a-col>
+
+              <a-col :md="4" :xs="0" style="margin-bottom: 12px;">
+                <a-button @click="handleAdd" icon="plus"></a-button>&nbsp;
+                <a-button @click="handleDel( index )" icon="minus"></a-button>
+              </a-col>
+
+              <a-col :md="0" :xs="24" style="margin-bottom: 12px;text-align: right;">
+                <a-button @click="handleAdd" icon="plus"></a-button>&nbsp;
+                <a-button @click="handleDel( index )" icon="minus"></a-button>
+              </a-col>
+
+            </a-row>
+
+          </a-form>
+        </a-col>
+        <a-col :sm="24" :md="5">
+          <!-- 查询记录 -->
+
+          <a-card class="j-super-query-history-card" :bordered="true">
+            <div slot="title">
+              保存的查询
+            </div>
+
+            <a-empty v-if="saveTreeData.length === 0" class="j-super-query-history-empty" description="没有保存任何查询"/>
+            <a-tree
+              v-else
+              class="j-super-query-history-tree"
+              showIcon
+              :treeData="saveTreeData"
+              :selectedKeys="[]"
+              @select="handleTreeSelect"
+            >
+            </a-tree>
+          </a-card>
+
+
+        </a-col>
+      </a-row>
+
+
+    </a-spin>
+
+    <a-modal title="请输入保存的名称" :visible="prompt.visible" @cancel="prompt.visible=false" @ok="handlePromptOk">
+      <a-input v-model="prompt.value"></a-input>
+    </a-modal>
+
+  </j-modal>
+</div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import * as utils from '@/utils/util'
+  import { mixinDevice } from '@/utils/mixin'
+  import JDate from '@/components/jeecg/JDate.vue'
+  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+  import JSelectMultiUser from '@/components/jeecgbiz/JSelectMultiUser'
+  import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
+  import JAreaLinkage from '@comp/jeecg/JAreaLinkage'
+
+  export default {
+    name: 'JSuperQuery',
+    mixins: [mixinDevice],
+    components: { JAreaLinkage, JMultiSelectTag, JDate, JSelectDepart, JSelectMultiUser },
+    props: {
+      /*
+       fieldList: [{
+          value:'',
+          text:'',
+          type:'',
+          dictCode:'' // 只要 dictCode 有值,无论 type 是什么,都显示为字典下拉框
+       }]
+       type:date datetime int number string
+      * */
+      fieldList: {
+        type: Array,
+        required: true
+      },
+      /*
+      * 这个回调函数接收一个数组参数 即查询条件
+      * */
+      callback: {
+        type: String,
+        required: false,
+        default: 'handleSuperQuery'
+      },
+
+      // 当前是否在加载中
+      loading: {
+        type: Boolean,
+        default: false
+      },
+
+      // 保存查询条件的唯一 code,通过该 code 区分
+      // 默认为 null,代表以当前路由全路径为区分Code
+      saveCode: {
+        type: String,
+        default: null
+      }
+
+    },
+    data() {
+      return {
+        moment,
+        fieldTreeData: [],
+
+        prompt: {
+          visible: false,
+          value: ''
+        },
+
+        visible: false,
+        queryParamsModel: [],
+        treeIcon: <a-icon type="file-text"/>,
+        // 保存查询条件的treeData
+        saveTreeData: [],
+        // 保存查询条件的前缀名
+        saveCodeBefore: 'JSuperQuerySaved_',
+        // 查询类型,过滤条件匹配(and、or)
+        matchType: 'and',
+        superQueryFlag: false,
+      }
+    },
+    computed: {
+      izMobile() {
+        return this.device === 'mobile'
+      },
+      tooltipProps() {
+        return this.izMobile ? { visible: false } : {}
+      },
+      fullSaveCode() {
+        let saveCode = this.saveCode
+        if (saveCode == null || saveCode === '') {
+          saveCode = this.$route.fullPath
+        }
+        return this.saveCodeBefore + saveCode
+      },
+    },
+    watch: {
+      // 当 saveCode 变化时,重新查询已保存的条件
+      fullSaveCode: {
+        immediate: true,
+        handler() {
+          let list = this.$ls.get(this.fullSaveCode)
+          if (list instanceof Array) {
+            this.saveTreeData = list.map(i => this.renderSaveTreeData(i))
+          }
+        }
+      },
+      fieldList: {
+        deep: true,
+        immediate: true,
+        handler(val) {
+          let mainData = [], subData = []
+          val.forEach(item => {
+            let data = { ...item }
+            data.label = data.label || data.text
+            let hasChildren = (data.children instanceof Array)
+            data.disabled = hasChildren
+            data.selectable = !hasChildren
+            if (hasChildren) {
+              data.children = data.children.map(item2 => {
+                let child = { ...item2 }
+                child.label = child.label || child.text
+                child.label = data.label + '-' + child.label
+                child.value = data.value + ',' + child.value
+                child.val = ''
+                return child
+              })
+              data.val = ''
+              subData.push(data)
+            } else {
+              mainData.push(data)
+            }
+          })
+          this.fieldTreeData = mainData.concat(subData)
+        }
+      }
+    },
+
+    methods: {
+      show() {
+        if (!this.queryParamsModel || this.queryParamsModel.length === 0) {
+          this.resetLine()
+        }
+        this.visible = true
+      },
+
+      getDictInfo(item) {
+        let str = ''
+        if(!item.dictTable){
+          str = item.dictCode
+        }else{
+          str = item.dictTable+','+item.dictText+','+item.dictCode
+        }
+        console.log('高级查询字典信息',str)
+        return str
+      },
+      handleOk() {
+        if (!this.isNullArray(this.queryParamsModel)) {
+          let event = {
+            matchType: this.matchType,
+            params: this.removeEmptyObject(this.queryParamsModel)
+          }
+          // 移动端模式下关闭弹窗
+          if (this.izMobile) {
+            this.visible = false
+          }
+          this.emitCallback(event)
+        } else {
+          this.$message.warn("不能查询空条件")
+        }
+      },
+      emitCallback(event = {}) {
+        let { params = [], matchType = this.matchType } = event
+        this.superQueryFlag = (params && params.length > 0)
+        for (let param of params) {
+          if (Array.isArray(param.val)) {
+            param.val = param.val.join(',')
+          }
+        }
+        console.debug('---高级查询参数--->', { params, matchType })
+        this.$emit(this.callback, params, matchType)
+      },
+      handleCancel() {
+        this.close()
+      },
+      close() {
+        this.$emit('close')
+        this.visible = false
+      },
+      handleAdd() {
+        this.addNewLine()
+      },
+      addNewLine() {
+        this.queryParamsModel.push({ rule: 'eq' })
+      },
+      resetLine() {
+        this.superQueryFlag = false
+        this.queryParamsModel = []
+        this.addNewLine()
+      },
+      handleDel(index) {
+        this.queryParamsModel.splice(index, 1)
+      },
+      handleSelected(node, item) {
+        let { type, dbType, options, dictCode, dictTable, dictText, customReturnField, popup } = node.dataRef
+        item['type'] = type
+        item['dbType'] = dbType
+        item['options'] = options
+        item['dictCode'] = dictCode
+        item['dictTable'] = dictTable
+        item['dictText'] = dictText
+        item['customReturnField'] = customReturnField
+        if (popup) {
+          item['popup'] = popup
+        }
+        this.$set(item, 'val', undefined)
+      },
+      handleOpen() {
+        this.show()
+      },
+      handleReset() {
+        this.resetLine()
+        this.emitCallback()
+      },
+      handleSave() {
+        let queryParams = this.removeEmptyObject(this.queryParamsModel)
+        if (this.isNullArray(queryParams)) {
+          this.$message.warning('空条件不能保存')
+        } else {
+          this.prompt.value = ''
+          this.prompt.visible = true
+        }
+      },
+      handlePromptOk() {
+        let { value } = this.prompt
+        if(!value){
+          this.$message.warning('保存名称不能为空')
+          return
+        }
+        // 取出查询条件
+        let records = this.removeEmptyObject(this.queryParamsModel)
+        // 判断有没有重名的
+        let filterList = this.saveTreeData.filter(i => i.originTitle === value)
+        if (filterList.length > 0) {
+          this.$confirm({
+            content: `${value} 已存在,是否覆盖?`,
+            onOk: () => {
+              this.prompt.visible = false
+              filterList[0].records = records
+              this.saveToLocalStore()
+              this.$message.success('保存成功')
+            }
+          })
+        } else {
+          // 没有重名的,直接添加
+          this.prompt.visible = false
+          // 添加到树列表中
+          this.saveTreeData.push(this.renderSaveTreeData({
+            title: value,
+            matchType: this.matchType,
+            records: records
+          }))
+          // 保存到 LocalStore
+          this.saveToLocalStore()
+          this.$message.success('保存成功')
+        }
+      },
+      handleTreeSelect(idx, event) {
+        if (event.selectedNodes[0]) {
+          let { matchType, records } = event.selectedNodes[0].data.props
+          // 将保存的matchType取出,兼容旧数据,如果没有保存就还是使用原来的
+          this.matchType = matchType || this.matchType
+          this.queryParamsModel = utils.cloneObject(records)
+        }
+      },
+      handleRemoveSaveTreeItem(event, vNode) {
+        // 阻止事件冒泡
+        event.stopPropagation()
+
+        this.$confirm({
+          content: '是否删除当前查询?',
+          onOk: () => {
+            let { eventKey } = vNode
+            this.saveTreeData.splice(Number.parseInt(eventKey.substring(2)), 1)
+            this.saveToLocalStore()
+          },
+        })
+      },
+
+      // 将查询保存到 LocalStore 里
+      saveToLocalStore() {
+        let saveValue = this.saveTreeData.map(({ originTitle, matchType, records }) => ({ title: originTitle, matchType, records }))
+        this.$ls.set(this.fullSaveCode, saveValue)
+      },
+
+      isNullArray(array) {
+        //判断是不是空数组对象
+        if (!array || array.length === 0) {
+          return true
+        }
+        if (array.length === 1) {
+          let obj = array[0]
+          if (!obj.field || (obj.val == null || obj.val === '') || !obj.rule) {
+            return true
+          }
+        }
+        return false
+      },
+      // 去掉数组中的空对象
+      removeEmptyObject(arr) {
+        let array = utils.cloneObject(arr)
+        for (let i = 0; i < array.length; i++) {
+          let item = array[i]
+          if (item == null || Object.keys(item).length <= 0) {
+            array.splice(i--, 1)
+          } else {
+            if (Array.isArray(item.options)) {
+              // 如果有字典属性,就不需要保存 options 了
+              //update-begin-author:taoyan date:20200819 for:【开源问题】 高级查询 下拉框作为并且选项很多多多 LOWCOD-779
+              delete item.options
+              //update-end-author:taoyan date:20200819 for:【开源问题】 高级查询 下拉框作为并且选项很多多多 LOWCOD-779
+            }
+          }
+        }
+        return array
+      },
+
+      /** 渲染保存查询条件的 title(加个删除按钮) */
+      renderSaveTreeData(item) {
+        item.icon = this.treeIcon
+        item.originTitle = item['title']
+        item.title = (arg1, arg2) => {
+          let vNode
+          // 兼容旧版的Antdv
+          if (arg1.dataRef) {
+            vNode = arg1
+          } else if (arg2.dataRef) {
+            vNode = arg2
+          } else {
+            return <span style="color:red;">Antdv版本不支持</span>
+          }
+          let {originTitle} = vNode.dataRef
+          return (
+            <div class="j-history-tree-title">
+              <span>{originTitle}</span>
+
+              <div class="j-history-tree-title-closer" onClick={e => this.handleRemoveSaveTreeItem(e, vNode)}>
+                <a-icon type="close-circle"/>
+              </div>
+            </div>
+          )
+        }
+        return item
+      },
+
+      /** 判断是否允许多选 */
+      allowMultiple(item) {
+        return item.rule === 'in'
+      },
+
+      handleRuleChange(item, newValue) {
+        let oldValue = item.rule
+        this.$set(item, 'rule', newValue)
+        // 上一个规则是否是 in,且type是字典或下拉
+        if (oldValue === 'in') {
+          if (item.dictCode || item.options instanceof Array) {
+            let value = item.val
+            if (typeof item.val === 'string') {
+              value = item.val.split(',')[0]
+            } else if (Array.isArray(item.val)) {
+              value = item.val[0]
+            }
+            this.$set(item, 'val', value)
+          }
+        }
+      },
+
+      handleChangeJPopup(item, e, values) {
+        item.val = values[item.popup['destFields']]
+      },
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+
+  .j-super-query-box {
+    display: inline-block;
+  }
+
+  .j-super-query-modal {
+
+    .j-super-query-history-card {
+      /deep/ .ant-card-body,
+      /deep/ .ant-card-head-title {
+        padding: 0;
+      }
+
+      /deep/ .ant-card-head {
+        padding: 4px 8px;
+        min-height: initial;
+      }
+    }
+
+    .j-super-query-history-empty {
+      /deep/ .ant-empty-image {
+        height: 80px;
+        line-height: 80px;
+        margin-bottom: 0;
+      }
+
+      /deep/ img {
+        width: 80px;
+        height: 65px;
+      }
+
+      /deep/ .ant-empty-description {
+        color: #afafaf;
+        margin: 8px 0;
+      }
+    }
+
+    .j-super-query-history-tree {
+
+      .j-history-tree-title {
+        width: calc(100% - 24px);
+        position: relative;
+        display: inline-block;
+
+        &-closer {
+          color: #999999;
+          position: absolute;
+          top: 0;
+          right: 0;
+          width: 24px;
+          height: 24px;
+          text-align: center;
+          opacity: 0;
+          transition: opacity 0.3s, color 0.3s;
+
+          &:hover {
+            color: #666666;
+          }
+
+          &:active {
+            color: #333333;
+          }
+        }
+
+        &:hover {
+          .j-history-tree-title-closer {
+            opacity: 1;
+          }
+        }
+
+      }
+
+      /deep/ .ant-tree-switcher {
+        display: none;
+      }
+
+      /deep/ .ant-tree-node-content-wrapper {
+        width: 100%;
+      }
+    }
+
+  }
+
+</style>

+ 160 - 0
.svn/pristine/15/150a39e0719a03475d7512168ef8b89e2b3c1c91.svn-base

@@ -0,0 +1,160 @@
+<template>
+    <j-modal
+        :title="title"
+        :width="width"
+        :visible="visible"
+        switchFullscreen
+        @ok="handleOk"
+        :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+        @cancel="handleCancel"
+        cancelText="关闭">
+        <div class="attrPane">
+            <rm-bulletin-board-form ref="realForm" :lng="this.lng" :lat="this.lat" @ok="submitCallback"
+                                    :disabled="disableSubmit" @coordsChange="coordsChange"></rm-bulletin-board-form>
+        </div>
+        <div class="geomPane">
+            <basic-map ref="locMap" height='775px' layersUrl='/resManager.catalog/rescatalog/resList'
+                       :model="{...model,layerName:'公告牌'}"></basic-map>
+        </div>
+    </j-modal>
+</template>
+
+<script>
+
+import RmBulletinBoardForm from './RmBulletinBoardForm'
+import BasicMap from "../../../../../components/BasicMap/BasicMap";
+import {transform} from "ol/proj";
+import proj4 from "proj4";
+import {register} from "ol/proj/proj4";
+
+export default {
+    name: 'RmBulletinBoardModal',
+    components: {
+        BasicMap,
+        RmBulletinBoardForm
+    },
+    data() {
+        return {
+            lng: 0,
+            lat: 0,
+            title: '',
+            width: 1200,
+            visible: false,
+            disableSubmit: false,
+            mapHeight: "775px",
+            model: {}
+        }
+    },
+    beforeCreate() {
+        proj4.defs("EPSG:4548",
+            "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
+        proj4.defs("EPSG:4527",
+            "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
+        proj4.defs("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs");
+
+        register(proj4);
+    },
+    methods: {
+        add() {
+            this.visible = true
+            this.$nextTick(() => {
+                this.$refs.realForm.add();
+            })
+        },
+        edit(record) {
+            this.model = record;
+            let coord = [record.hzb, record.zzb];
+            //测绘系统的坐标系与正常坐标系XY轴是反的,横坐标对应纬度
+            if (record.hzb > 39000000 || record.zzb > 39000000) {        //情况1:4527坐标,带带号投影坐标,坐标位数应为前8后7
+                this.lng = record.hzb > record.zzb ? record.hzb : record.zzb;
+                this.lat = record.hzb > record.zzb ? record.zzb : record.hzb;
+                coord = transform([this.lng, this.lat], 'EPSG:4527', 'EPSG:4490');
+            } else if (record.hzb > 180 || record.zzb > 180) {           //情况2:4548坐标,无带号投影坐标,坐标位数应为前6后7
+                this.lng = record.hzb < record.zzb ? record.hzb : record.zzb
+                this.lat = record.hzb < record.zzb ? record.zzb : record.hzb
+                coord = transform([this.lng, this.lat], 'EPSG:4548', 'EPSG:4490');
+            } else {                                                     //情况3:4490坐标,经纬度坐标
+                this.lng = record.hzb > record.zzb ? record.hzb : record.zzb
+                this.lat = record.hzb > record.zzb ? record.zzb : record.hzb
+                coord = [this.lng, this.lat ];
+            }
+            this.lng = parseFloat(coord[0].toFixed(6));
+            this.lat = parseFloat(coord[1].toFixed(6));
+            this.visible = true;
+            this.$nextTick(() => {
+                this.$refs.realForm.edit(record);
+            })
+        },
+        close() {
+            this.$emit('close');
+            this.visible = false;
+        },
+        handleOk() {
+            this.$refs.realForm.submitForm();
+        },
+        submitCallback() {
+            this.$emit('ok');
+            this.visible = false;
+        },
+        handleCancel() {
+            this.close()
+        },
+        locateByCoords() {
+            let loc_x = this.hzb;
+            let loc_y = this.zzb;
+            this.$nextTick(() => {
+                this.$refs.locMap.locateByCoords(loc_x, loc_y);
+            })
+        },
+        locMapReady() {
+            this.locateByCoords();
+        },
+        coordsTranslated(coords) {
+            this.lng = coords[0].toFixed(6);
+            this.lat = coords[1].toFixed(6);
+        },
+        coordsChange(hzb, zzb) {
+            let coord = [hzb, zzb];
+            //测绘系统的坐标系与正常坐标系XY轴是反的,横坐标对应纬度
+            if (hzb > 39000000 || zzb > 39000000) {        //情况1:4527坐标,带带号投影坐标,坐标位数应为前8后7
+                this.lng = hzb > zzb ? hzb : zzb;
+                this.lat = hzb > zzb ? zzb : hzb;
+                coord = transform([this.lng, this.lat], 'EPSG:4527', 'EPSG:4490');
+            } else if (hzb > 180 || zzb > 180) {           //情况2:4548坐标,无带号投影坐标,坐标位数应为前6后7
+                this.lng = hzb < zzb ? hzb : zzb;
+                this.lat = hzb < zzb ? zzb : hzb;
+                coord = transform([this.lng, this.lat], 'EPSG:4548', 'EPSG:4490');
+            } else {                                                     //情况3:4490坐标,经纬度坐标
+                this.lng = hzb > zzb ? hzb : zzb;
+                this.lat = hzb > zzb ? zzb : hzb;
+                coord = [this.lng, this.lat ];u
+            }
+            this.lng = parseFloat(coord[0].toFixed(6));
+            this.lat = parseFloat(coord[1].toFixed(6));
+            this.$refs.locMap.locateByCoords({...this.model, lng: this.lng, lat: this.lat, geoinfo: ''});
+            this.edit({...this.model, hzb: hzb, zzb: zzb});
+        }
+    }
+    // beforeMount() {
+    //     if(!this.height){
+    //         let calcHeight = window.document.documentElement.clientHeight - 160;
+    //         let m_height = calcHeight.toString()+'px';
+    //         this.mapHeight = m_height;
+    //     }
+    // }
+}
+</script>
+
+<style scoped>
+.attrPane {
+    width: 33%;
+    display: inline-block;
+    overflow-y: auto;
+    height: 775px;
+}
+
+.geomPane {
+    width: 66%;
+    display: inline-block;
+}
+</style>

+ 262 - 0
.svn/pristine/15/15e89cb84138cde35593acabb3241eb6f3cf4399.svn-base

@@ -0,0 +1,262 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="建设项目名称">
+              <a-input placeholder="请输入建设项目名称" v-model="queryParam.jsxmmc"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" v-has="'wspxm:add'" type="primary" icon="plus">新增</a-button>
+      <a-button v-has="'wspxm:dc'" type="primary" icon="download" @click="handleExportXls('无审批项目')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button v-has="'wspxm:dr'" type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px" v-has="'wspxm:pldelete'"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+        <template slot="jsxmmc" slot-scope="text,record">
+          <a @click="handleDetail(record)">{{ text }}</a>
+        </template>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a-space>
+              <a-button @click='handleEdit(record)' v-has="'wspxm:bj'" size='small' type='primary'>编辑</a-button>
+              <a-popconfirm title='确定删除吗?' @confirm='() => handleDelete(record.id)'>
+                  <a-button size='small' v-has="'wspxm:delete'" type='danger'>删除</a-button>
+              </a-popconfirm>
+          </a-space>
+
+<!--          <a-divider type="vertical" />-->
+<!--          <a-dropdown>-->
+<!--            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>-->
+<!--            <a-menu slot="overlay">-->
+<!--              <a-menu-item>-->
+<!--                <a @click="handleDetail(record)">详情</a>-->
+<!--              </a-menu-item>-->
+<!--              <a-menu-item>-->
+<!--                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">-->
+<!--                  <a>删除</a>-->
+<!--                </a-popconfirm>-->
+<!--              </a-menu-item>-->
+<!--            </a-menu>-->
+<!--          </a-dropdown>-->
+        </span>
+
+      </a-table>
+    </div>
+
+    <rm-wspxm-modal ref="modalForm" @ok="modalFormOk"></rm-wspxm-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmWspxmModal from './modules/RmWspxmModal'
+  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
+
+  export default {
+    name: 'RmWspxmList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      RmWspxmModal
+    },
+    data () {
+      return {
+        description: '无审批项目管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'建设项目名称',
+            align:"center",
+            dataIndex: 'jsxmmc',
+              scopedSlots: { customRender: 'jsxmmc' }
+          },
+          {
+            title:'建设项目所在河道',
+            align:"center",
+            dataIndex: 'jsxmszhd'
+          },
+          {
+            title:'是否评审',
+            align:"center",
+            dataIndex: 'sfps'
+          },
+          {
+            title:'审批机关',
+            align:"center",
+            dataIndex: 'spjg'
+          },
+          {
+            title:'施工单位',
+            align:"center",
+            dataIndex: 'sgdw'
+          },
+          {
+            title:'监管单位',
+            align:"center",
+            dataIndex: 'jgdw'
+          },
+          {
+            title:'是否验收',
+            align:"center",
+            dataIndex: 'sfys'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/hzz.shjsgc.wspxm/rmWspxm/list",
+          delete: "/hzz.shjsgc.wspxm/rmWspxm/delete",
+          deleteBatch: "/hzz.shjsgc.wspxm/rmWspxm/deleteBatch",
+          exportXlsUrl: "/hzz.shjsgc.wspxm/rmWspxm/exportXls",
+          importExcelUrl: "hzz.shjsgc.wspxm/rmWspxm/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      // select(record, index){
+      //   if(record==0){
+      //     return
+      //   }else{
+      //
+      //   }
+      //
+      // },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'jsxmmc',text:'建设项目名称',dictCode:''})
+        fieldList.push({type:'string',value:'yzdwmc',text:'业主单位名称',dictCode:''})
+        fieldList.push({type:'string',value:'jsxmszd',text:'建设项目所在地',dictCode:''})
+        fieldList.push({type:'string',value:'jsxmszhd',text:'建设项目所在河道',dictCode:''})
+        fieldList.push({type:'date',value:'kgrq',text:'开工日期'})
+        fieldList.push({type:'date',value:'jgrq',text:'竣工日期'})
+        fieldList.push({type:'string',value:'jsqk',text:'建设情况',dictCode:'gcjsqk'})
+        fieldList.push({type:'string',value:'sfxybz',text:'是否需要编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfbz',text:'是否编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfps',text:'是否评审',dictCode:'yn'})
+        fieldList.push({type:'string',value:'spjg',text:'审批机关',dictCode:''})
+        fieldList.push({type:'string',value:'spwh',text:'审批文号',dictCode:''})
+        fieldList.push({type:'string',value:'sfsh',text:'是否审核',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sgshjgwjsj',text:'施工审核机关、文件、时间',dictCode:''})
+        fieldList.push({type:'string',value:'sgdw',text:'施工单位',dictCode:''})
+        fieldList.push({type:'string',value:'jgdw',text:'监管单位',dictCode:''})
+        fieldList.push({type:'string',value:'sgxcsffhyq',text:'施工现场是否符合要求',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sgjssfhfhdyz',text:'施工结束是否恢复河道原状',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfkxsg',text:'是否跨汛施工',dictCode:'yn'})
+        fieldList.push({type:'string',value:'dxfasfbz',text:'度汛方案是否编制',dictCode:'yn'})
+        fieldList.push({type:'string',value:'zrzsfls',text:'责任制是否落实',dictCode:'yn'})
+        fieldList.push({type:'string',value:'rywzsfls',text:'人员、物资是否落实',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfyq',text:'是否要求',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ayqwcqk',text:'按要求完成情况',dictCode:'ayqwcqk'})
+        fieldList.push({type:'string',value:'sfys',text:'是否验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'jsxmsfyjgys',text:'建设项目是否已竣工验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'spzt',text:'审批状态',dictCode:'spzt1'})
+        fieldList.push({type:'string',value:'sfcjjsxmys',text:'是否参加建设项目验收',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ygzysfbb',text:'有关资源是否报备',dictCode:'yn'})
+        fieldList.push({type:'string',value:'czwtjclqk',text:'存在问题及处理情况',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 84 - 0
.svn/pristine/16/163330ceb294af8c61d3f0e8b6fea7d68ec2fb0c.svn-base

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <rm-hhglfwx-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></rm-hhglfwx-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import RmHhglfwxForm from './RmHhglfwxForm'
+
+  export default {
+    name: 'RmHhglfwxModal',
+    components: {
+      RmHhglfwxForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 193 - 0
.svn/pristine/16/165275bc46d5a295ed73b2913fde567b22657fce.svn-base

@@ -0,0 +1,193 @@
+<template>
+  <a-card :bordered="false" class="card-area">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <!-- 搜索区域 -->
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="8">
+            <a-form-item label="名称" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
+              <a-input placeholder="请输入名称查询" v-model="queryParam.roleName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="10" :sm="12">
+            <a-form-item label="创建时间" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
+              <j-date v-model="queryParam.createTime_begin" :showTime="true" date-format="YYYY-MM-DD HH:mm:ss" style="width:45%" placeholder="请选择开始时间" ></j-date>
+              <span style="width: 10px;">~</span>
+              <j-date v-model="queryParam.createTime_end" :showTime="true" date-format="YYYY-MM-DD HH:mm:ss" style="width:45%" placeholder="请选择结束时间"></j-date>
+            </a-form-item>
+          </a-col>
+          <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+            <a-col :md="6" :sm="24">
+              <a-button type="primary" @click="searchQuery">查询</a-button>
+              <a-button style="margin-left: 8px" @click="searchReset">重置</a-button>
+            </a-col>
+          </span>
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator"  style="margin-top: 5px">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('角色信息')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px">
+          批量操作 <a-icon type="down" />
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+
+          <a-dropdown>
+            <a class="ant-dropdown-link">
+              更多 <a-icon type="down" />
+            </a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handlePerssion(record.id)">授权</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <role-modal ref="modalForm" @ok="modalFormOk"></role-modal>
+    <user-role-modal ref="modalUserRole"></user-role-modal>
+  </a-card>
+</template>
+
+<script>
+  import RoleModal from './modules/RoleModal'
+  import UserRoleModal from './modules/UserRoleModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import JDate from '@/components/jeecg/JDate'
+
+  export default {
+    name: "RoleList",
+    mixins:[JeecgListMixin],
+    components: {
+      RoleModal,
+      UserRoleModal,
+      JDate
+    },
+    data () {
+      return {
+
+        description: '角色管理页面',
+        // 查询条件
+        queryParam: {roleName:'',},
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title: '角色名称',
+            align:"center",
+            dataIndex: 'roleName'
+          },
+          {
+            title: '角色编码',
+            align:"center",
+            dataIndex: 'roleCode'
+          },
+          {
+            title: '备注',
+            align:"center",
+            dataIndex: 'description'
+          },
+          {
+            title: '创建时间',
+            dataIndex: 'createTime',
+            align:"center",
+            sorter: true
+          },
+          {
+            title: '更新时间',
+            dataIndex: 'updateTime',
+            align:"center",
+            sorter: true
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/sys/role/list",
+          delete: "/sys/role/delete",
+          deleteBatch: "/sys/role/deleteBatch",
+          exportXlsUrl: "/sys/role/exportXls",
+          importExcelUrl: "sys/role/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      handlePerssion: function(roleId){
+       // alert(roleId);
+        this.$refs.modalUserRole.show(roleId);
+      },
+      onChangeDate(date, dateString) {
+        console.log(date, dateString);
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 67 - 0
.svn/pristine/16/16aaa8b0cdd6ba08934afae6bc3d21d26c71ef0c.svn-base

@@ -0,0 +1,67 @@
+<template>
+  <div class="head-info" :class="center && 'center'">
+    <span>{{ title }}</span>
+    <p>{{ content }}</p>
+    <em v-if="bordered"/>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "HeadInfo",
+    props: {
+      title: {
+        type: String,
+        default: ''
+      },
+      content: {
+        type: String,
+        default: ''
+      },
+      bordered: {
+        type: Boolean,
+        default: false
+      },
+      center: {
+        type: Boolean,
+        default: true
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+  .head-info {
+    position: relative;
+    text-align: left;
+    padding: 0 32px 0 0;
+    min-width: 125px;
+
+    &.center {
+      text-align: center;
+      padding: 0 32px;
+    }
+
+    span {
+      color: rgba(0, 0, 0, .45);
+      display: inline-block;
+      font-size: 14px;
+      line-height: 22px;
+      margin-bottom: 4px;
+    }
+    p {
+      color: rgba(0, 0, 0, .85);
+      font-size: 24px;
+      line-height: 32px;
+      margin: 0;
+    }
+    em {
+      background-color: #e8e8e8;
+      position: absolute;
+      height: 56px;
+      width: 1px;
+      top: 0;
+      right: 0;
+    }
+  }
+</style>

+ 84 - 0
.svn/pristine/16/16b641301e3cdffc7ade2468ba8ce639a7c9149d.svn-base

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <rm-gxqktjb-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></rm-gxqktjb-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import RmGxqktjbForm from './RmGxqktjbForm'
+
+  export default {
+    name: 'RmGxqktjbModal',
+    components: {
+      RmGxqktjbForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:896,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 443 - 0
.svn/pristine/17/176c1ae86c1c96bcad0623774f09d780cba536fc.svn-base

@@ -0,0 +1,443 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="项目名称">
+              <a-input placeholder="请输入项目名称" v-model="queryParam.xmmc" ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="行政区划">
+              <j-area-linkage type="cascader" v-model="queryParam.xzqh" placeholder="请输入省市区"/>
+            </a-form-item>
+          </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+                <a-form-item label="审批级别">
+                    <j-dict-select-tag type="list" v-model="queryParam.spjb" dictCode="spjb" placeholder="请选择审批级别" />
+                </a-form-item>
+            </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="审批年度">
+                <j-year-picker placeholder="请选择审批年度" v-model="queryParam.spnd" style="width: 100%"></j-year-picker>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="审批情况">
+              <j-dict-select-tag type="list" v-model="queryParam.spzt" dictCode="spzt" placeholder="请选择审批情况" />
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="项目类型">
+              <j-dict-select-tag type="list" v-model="queryParam.xmlx" dictCode="xangmlx" placeholder="请选择项目类型" />
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="建设状态">
+              <j-dict-select-tag type="list" v-model="queryParam.jszt" dictCode="gcjsqk" placeholder="请选择建设状态" />
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <!--              <a @click="handleToggleSearch" style="margin-left: 8px">-->
+              <!--                {{ toggleSearchStatus ? '收起' : '展开' }}-->
+              <!--                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>-->
+              <!--              </a>-->
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+    
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd"  v-has="'xmrk:add'" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" v-has="'xmrk:dc'" icon="download" @click="handleExportXls('项目信息')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary"   v-has="'xmrk:dr'" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        class="j-table-force-nowrap"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}"
+        :customRow="clickThenSelect"
+        @change="handleTableChange">
+        <template slot="xmlx_dictText" slot-scope="text,record">
+          <span v-if="record.xmlx=='2'" style="font-size: 12px; font-style: italic;  "><a-button type="danger"  shape="circle">重点项目</a-button></span>
+          <span v-else-if="record.xmlx=='1'" style="font-size: 12px;font-style: italic;"><a-button shape="circle" type="primary">一般项目</a-button></span>
+
+        </template>
+        <template slot="xmmc" slot-scope="text,record">
+          <a @click="handleDetail(record)">{{ text }}</a>
+        </template>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+<!--        <template slot="fileSlot" slot-scope="text">-->
+<!--          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>-->
+<!--          <a-space v-else>-->
+<!--            <a-button-->
+<!--              v-if="text.endsWith('.pdf')"-->
+<!--              :ghost="true"-->
+<!--              type="primary"-->
+<!--              icon="eye"-->
+<!--              size="small"-->
+<!--              @click="previewPdfFile(text)">-->
+<!--              预览-->
+<!--            </a-button>-->
+<!--            <a-button-->
+<!--              v-else-if="text.endsWith('.png')||text.endsWith('.jpg')||text.endsWith('.bmp')"-->
+<!--              :ghost="true"-->
+<!--              type="primary"-->
+<!--              icon="eye"-->
+<!--              size="small"-->
+<!--              @click="previewImgFile(text)">-->
+<!--              预览-->
+<!--            </a-button>-->
+<!--          <a-button-->
+<!--            :ghost="true"-->
+<!--            type="primary"-->
+<!--            icon="download"-->
+<!--            size="small"-->
+<!--            @click="downloadFile(text)">-->
+<!--            下载-->
+<!--          </a-button>-->
+<!--            <a-modal width="1200px" :visible="previewVisible" :footer="null" @cancel="handleCancel()">-->
+<!--              <img alt="example" style="width: 100%" :src="previewImage"/>-->
+<!--            </a-modal>-->
+<!--          </a-space>-->
+<!--        </template>-->
+        <span slot="action" slot-scope="text, record">
+           <a-space>
+              <a-button @click='handleEdit(record)' v-has="'xmrk:bj'" size='small' type='primary'>编辑</a-button>
+              <a-popconfirm title='确定删除吗?' @confirm='() => handleDelete(record.id)'>
+                  <a-button size='small' v-has="'xmrk:delete'" type='danger'>删除</a-button>
+              </a-popconfirm>
+          </a-space>
+
+<!--        <span slot="action" slot-scope="text, record">-->
+<!--          <a @click="handleEdit(record)">编辑</a>-->
+
+<!--          <a-divider type="vertical" />-->
+<!--          <a-dropdown>-->
+<!--            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>-->
+<!--            <a-menu slot="overlay">-->
+<!--              <a-menu-item>-->
+<!--                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">-->
+<!--                  <a>删除</a>-->
+<!--                </a-popconfirm>-->
+<!--              </a-menu-item>-->
+<!--            </a-menu>-->
+<!--          </a-dropdown>-->
+        </span>
+
+      </a-table>
+      <a-modal width="1200px" :visible="previewVisible" :footer="null" @cancel="handleCancel()">
+        <img alt="example" style="width: 100%" :src="previewImage"/>
+      </a-modal>
+    </div>
+
+    <a-tabs defaultActiveKey="1">
+      <a-tab-pane tab="单位信息" key="1" >
+        <RmAxzyxmbList :mainId="selectedMainId" />
+      </a-tab-pane>
+      <a-tab-pane tab="河段主要指标" key="2" forceRender>
+        <RmAxhdzyzbList :mainId="selectedMainId" />
+      </a-tab-pane>
+      <a-tab-pane tab="涉河部分工程信息" key="3" forceRender>
+        <RmAxshbfgcxxbList :mainId="selectedMainId" />
+      </a-tab-pane>
+      <a-tab-pane tab="涉河工程主要指标表" key="4" forceRender>
+        <RmAxshgczyzbbList :mainId="selectedMainId" />
+      </a-tab-pane>
+      <a-tab-pane tab="分析计算主要成果" key="5" forceRender>
+        <RmAxfxjszycgbList :mainId="selectedMainId" />
+      </a-tab-pane>
+      <a-tab-pane tab="影响情况及消除或减轻影响措施" key="6" forceRender>
+        <RmYxqkList :mainId="selectedMainId" :xmmc="selectedXmmc" />
+      </a-tab-pane>
+    </a-tabs>
+
+    <rmAxxmxx-modal ref="modalForm" @ok="modalFormOk"></rmAxxmxx-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmAxxmxxModal from './modules/RmAxxmxxModal'
+  import { getAction } from '@/api/manage'
+  import RmAxzyxmbList from './RmAxzyxmbList'
+  import RmAxhdzyzbList from './RmAxhdzyzbList'
+  import RmAxshbfgcxxbList from './RmAxshbfgcxxbList'
+  import RmAxshgczyzbbList from './RmAxshgczyzbbList'
+  import RmAxfxjszycgbList from './RmAxfxjszycgbList'
+  import RmYxqkList from './RmYxqkList'
+  import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil'
+  import '@/assets/less/TableExpand.less'
+  import JYearPicker from "@comp/jeecg/JYearPicker";
+
+  export default {
+    name: "RmAxxmxxList",
+    mixins:[JeecgListMixin],
+    components: {
+        JYearPicker,
+      RmAxzyxmbList,
+      RmAxhdzyzbList,
+      RmAxshbfgcxxbList,
+      RmAxshgczyzbbList,
+      RmAxfxjszycgbList,
+      RmYxqkList,
+      RmAxxmxxModal
+    },
+    data () {
+      return {
+        description: '项目信息管理页面',
+        // 表头
+        columns: [
+          {
+            title:'项目类型',
+            align:"center",
+            dataIndex: 'xmlx_dictText',
+            scopedSlots: { customRender: 'xmlx_dictText' }
+          },
+          {
+            title:'项目名称',
+            align:"center",
+            dataIndex: 'xmmc',
+            scopedSlots: { customRender: 'xmmc'}
+          },
+          {
+            title:'所在水系',
+            align:"center",
+            dataIndex: 'szsx_dictText',
+          },
+          // {
+          //   title:'横坐标',
+          //   align:"center",
+          //   dataIndex: 'hzb'
+          // },
+          // {
+          //   title:'纵坐标',
+          //   align:"center",
+          //   dataIndex: 'zzb'
+          // },
+
+          {
+            title:'防洪标准',
+            align:"center",
+            dataIndex: 'fhbz'
+          },
+
+          {
+            title:'审批情况',
+            align:"center",
+            dataIndex: 'spzt_dictText',
+          },
+          {
+            title:'建设状态',
+            align:"center",
+            dataIndex: 'jszt_dictText',
+          },
+          {
+            title: '审批文号',
+            align: "center",
+            dataIndex: 'spwh',
+            // scopedSlots: {customRender: 'fileSlot'}
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/hzz.shjsgc.xmrk/rmAxxmxx/list",
+          delete: "/hzz.shjsgc.xmrk/rmAxxmxx/delete",
+          deleteBatch: "/hzz.shjsgc.xmrk/rmAxxmxx/deleteBatch",
+          exportXlsUrl: "/hzz.shjsgc.xmrk/rmAxxmxx/exportXls",
+          importExcelUrl: "hzz.shjsgc.xmrk/rmAxxmxx/importExcel",
+        },
+        dictOptions:{
+         szsx:[],
+         sfpjbf:[],
+         sfbbsp:[],
+         jszt:[],
+        },
+        previewVisible: false,
+        previewImage: '',
+        /* 分页参数 */
+        ipagination:{
+          current: 1,
+          pageSize: 5,
+          pageSizeOptions: ['5', '10', '50'],
+          showTotal: (total, range) => {
+            return range[0] + "-" + range[1] + " 共" + total + "条"
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        },
+        selectedMainId:'',
+        selectedXmmc:'',
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+        initDictOptions('szsx').then((res) => {
+          if (res.success) {
+            this.$set(this.dictOptions, 'szsx', res.result)
+          }
+        })
+        initDictOptions('yn').then((res) => {
+          if (res.success) {
+            this.$set(this.dictOptions, 'sfpjbf', res.result)
+          }
+        })
+        initDictOptions('yn').then((res) => {
+          if (res.success) {
+            this.$set(this.dictOptions, 'sfbbsp', res.result)
+          }
+        })
+        initDictOptions('gcjsqk').then((res) => {
+          if (res.success) {
+            this.$set(this.dictOptions, 'jszt', res.result)
+          }
+        })
+      },
+      clickThenSelect(record) {
+        return {
+          on: {
+            click: () => {
+              this.onSelectChange(record.id.split(","), [record]);
+            }
+          }
+        }
+      },
+      onClearSelected() {
+        this.selectedRowKeys = [];
+        this.selectionRows = [];
+        this.selectedMainId='';
+        this.selectedXmmc='';
+      },
+      onSelectChange(selectedRowKeys, selectionRows) {
+        this.selectedMainId=selectedRowKeys[0]
+        this.selectedXmmc = selectionRows[0].xmmc;
+        this.selectedRowKeys = selectedRowKeys;
+        this.selectionRows = selectionRows;
+      },
+      loadData(arg) {
+        if(!this.url.list){
+          this.$message.error("请设置url.list属性!")
+          return
+        }
+        //加载数据 若传入参数1则加载第一页的内容
+        if (arg === 1) {
+          this.ipagination.current = 1;
+        }
+        this.onClearSelected()
+        var params = this.getQueryParams();//查询条件
+        this.loading = true;
+        getAction(this.url.list, params).then((res) => {
+          if (res.success) {
+            this.dataSource = res.result.records;
+            this.ipagination.total = parseInt(res.result.total);
+          }
+          if(res.code===510){
+            this.$message.warning(res.message)
+          }
+          this.loading = false;
+        })
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'xmmc',text:'项目名称',dictCode:''})
+        fieldList.push({type:'string',value:'szsx',text:'所在水系',dictCode:'szsx'})
+        fieldList.push({type:'string',value:'xzqh',text:'行政区划',dictCode:''})
+        fieldList.push({type:'string',value:'xjqhdm',text:'县级区划代码',dictCode:''})
+        fieldList.push({type:'double',value:'hzb',text:'横坐标',dictCode:''})
+        fieldList.push({type:'double',value:'zzb',text:'纵坐标',dictCode:''})
+        fieldList.push({type:'string',value:'xmfzr',text:'项目负责人',dictCode:''})
+        fieldList.push({type:'string',value:'dh',text:'电话',dictCode:''})
+        fieldList.push({type:'string',value:'lxqk',text:'立项情况',dictCode:''})
+        fieldList.push({type:'string',value:'spnd',text:'审批年度',dictCode:''})
+        fieldList.push({type:'string',value:'fhbz',text:'防洪标准',dictCode:''})
+        fieldList.push({type:'string',value:'spdw',text:'审批单位',dictCode:''})
+        fieldList.push({type:'string',value:'spjb',text:'审批级别',dictCode:''})
+        fieldList.push({type:'string',value:'sfpjbf',text:'是否批建不符',dictCode:'yn'})
+        fieldList.push({type:'string',value:'sfbbsp',text:'是否补办审批',dictCode:'yn'})
+        fieldList.push({type:'string',value:'ztbzjs',text:'总体布置简述',dictCode:''})
+        fieldList.push({type:'string',value:'wjsc',text:'审批文件',dictCode:''})
+        fieldList.push({type:'string',value:'jszt',text:'建设状态',dictCode:'gcjsqk'})
+        fieldList.push({type:'string',value:'qt',text:'其他',dictCode:''})
+        this.superFieldList = fieldList
+      },
+      previewImgFile(text){
+        if (!text) {
+          this.$message.warning("未知的文件")
+          return;
+        }
+        this.previewImage = this.getImgView(text);
+        this.previewVisible = true;
+      },
+      handleCancel() {
+        this.previewVisible = false;
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 45 - 0
.svn/pristine/17/17a352473ee6dcdb14f101531a3166125a058479.svn-base

@@ -0,0 +1,45 @@
+<template>
+  <a-card :bordered="false">
+    <result :is-success="false" :title="title" :description="description">
+      <template slot="action">
+        <a-button type="primary" >返回修改</a-button>
+      </template>
+      <div>
+        <div style="font-size: 16px; color: rgba(0, 0, 0, 0.85); font-weight: 500; margin-bottom: 16px">
+          您提交的内容有如下错误:
+        </div>
+        <div style="margin-bottom: 16px">
+          <a-icon type="close-circle-o" style="color: #f5222d; margin-right: 8px"/>
+          您的账户已被冻结
+          <a style="margin-left: 16px">立即解冻 <a-icon type="right" /></a>
+        </div>
+        <div>
+          <a-icon type="close-circle-o" style="color: #f5222d; margin-right: 8px"/>
+          您的账户还不具备申请资格
+          <a style="margin-left: 16px">立即升级 <a-icon type="right" /></a>
+        </div>
+      </div>
+    </result>
+  </a-card>
+</template>
+
+<script>
+  import Result from './Result'
+
+  export default {
+    name: "Error",
+    components: {
+      Result
+    },
+    data () {
+      return {
+        title: '提交失败',
+        description: '请核对并修改以下信息后,再重新提交。'
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 345 - 0
.svn/pristine/17/17b2d27f3ad97cb10330f0105fb34847795dfdd3.svn-base

@@ -0,0 +1,345 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="水库名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="skmc">
+              <a-input v-model="model.skmc" placeholder="请输入水库名称"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="所在河流" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="szhl">
+              <j-popup
+                v-model="model.szhl"
+                field="szhl"
+                org-fields="hlmc"
+                dest-fields="szhl"
+                code="hllist"
+                :multi="false"
+                @input="popupCallback"
+              />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="河长市级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hzsj">
+              <a-input v-model="model.hzsj" placeholder="请输入河长市级"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="河长县级" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hzxj">
+              <a-input v-model="model.hzxj" placeholder="请输入河长县级"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="行政位置(县、乡、村)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xzwz">
+              <a-input v-model="model.xzwz" placeholder="请输入行政位置(县、乡、村)"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="经度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jd">
+              <a-input v-model="model.jd" placeholder="请输入经度"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="纬度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="wd">
+              <a-input v-model="model.wd" placeholder="请输入纬度"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="工程位置是否在边界河流上设区的市边界(5公里内" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gcwzsfzbjhls">
+              <j-dict-select-tag type="list" v-model="model.gcwzsfzbjhls" dictCode="yn" placeholder="请选择工程位置是否在边界河流上设区的市边界(5公里内" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="工程位置是否在边界河流上县(市、区)边界(3公里内	" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gcwzsfzbjhlxbj">
+              <j-dict-select-tag type="list" v-model="model.gcwzsfzbjhlxbj" dictCode="yn" placeholder="请选择工程位置是否在边界河流上县(市、区)边界(3公里内	" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="工程位置是否在跨行政区河流上跨设区的市" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gcwzsfzkxzqhlsk">
+              <j-dict-select-tag type="list" v-model="model.gcwzsfzkxzqhlsk" dictCode="yn" placeholder="请选择工程位置是否在跨行政区河流上跨设区的市" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="工程位置是否在跨行政区河流上跨县(市、区" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gcwzsfzkxzqhlsksqds">
+              <j-dict-select-tag type="list" v-model="model.gcwzsfzkxzqhlsksqds" dictCode="yn" placeholder="请选择工程位置是否在跨行政区河流上跨县(市、区" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="始建时间" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjsj">
+              <a-input v-model="model.sjsj" placeholder="请输入始建时间"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="工程规模" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gcgm">
+              <a-input v-model="model.gcgm" placeholder="请输入工程规模"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="死水位(m)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ssw">
+              <a-input v-model="model.ssw" placeholder="请输入死水位(m)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="兴利水位(m)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xlsw">
+              <a-input v-model="model.xlsw" placeholder="请输入兴利水位(m)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="设计洪水重现期(年)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjhsczq">
+              <a-input v-model="model.sjhsczq" placeholder="请输入设计洪水重现期(年)"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="设计洪水泄量(m3/s)	" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjhsxl">
+              <a-input v-model="model.sjhsxl" placeholder="请输入设计洪水泄量(m3/s)	" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="设计洪水水位(m)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjhssw">
+              <a-input v-model="model.sjhssw" placeholder="请输入设计洪水水位(m)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="设计洪水库容(万m3)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sjhskr">
+              <a-input v-model="model.sjhskr" placeholder="请输入设计洪水库容(万m3)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="校核洪水重现期(年)	" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jhhscxq">
+              <a-input v-model="model.jhhscxq" placeholder="请输入校核洪水重现期(年)	"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="校核洪水泄量(m3/s)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jhhsxl">
+              <a-input v-model="model.jhhsxl" placeholder="请输入校核洪水泄量(m3/s)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="校核洪水水位(m)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jhhssw">
+              <a-input v-model="model.jhhssw" placeholder="请输入校核洪水水位(m)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="校核洪水总库容(万m3)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jhhszkr">
+              <a-input v-model="model.jhhszkr" placeholder="请输入校核洪水总库容(万m3)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="流域面积(km2)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lymj">
+              <a-input v-model="model.lymj" placeholder="请输入流域面积(km2)" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="主要功能" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zygn">
+              <a-input v-model="model.zygn" placeholder="请输入主要功能"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="水工程建设规划同意书是否取得" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sgcjsghtyssfqd">
+              <j-dict-select-tag type="list" v-model="model.sgcjsghtyssfqd" dictCode="yn" placeholder="请选择水工程建设规划同意书是否取得" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="水工程建设规划同意书审批部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sgcjsghtysspbm">
+              <a-input v-model="model.sgcjsghtysspbm" placeholder="请输入水工程建设规划同意书审批部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="水工程建设规划同意书审批文号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sgcjsghtysspwh">
+              <a-input v-model="model.sgcjsghtysspwh" placeholder="请输入水工程建设规划同意书审批文号"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="涉河建设项目审批是否取得" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="shjsxmspsfty">
+              <j-dict-select-tag type="list" v-model="model.shjsxmspsfty" dictCode="yn" placeholder="请选择涉河建设项目审批是否取得" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="涉河建设项目审批部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="shjsxmspbm">
+              <a-input v-model="model.shjsxmspbm" placeholder="请输入涉河建设项目审批部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="涉河建设项目审批部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="shjsxmspwh">
+              <a-input v-model="model.shjsxmspwh" placeholder="请输入涉河建设项目审批部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="不同行政区域边界修建排水、阻水、引水、蓄水工程审批是否取得" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="btxzqbjsfqd">
+              <j-dict-select-tag type="list" v-model="model.btxzqbjsfqd" dictCode="yn" placeholder="请选择不同行政区域边界修建排水、阻水、引水、蓄水工程审批是否取得" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="不同行政区域边界修建排水、阻水、引水、蓄水工程审批部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="btxzqbjspbm">
+              <a-input v-model="model.btxzqbjspbm" placeholder="请输入不同行政区域边界修建排水、阻水、引水、蓄水工程审批部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="不同行政区域边界修建排水、阻水、引水、蓄水工程审批文号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="btxzqbjspwh">
+              <a-input v-model="model.btxzqbjspwh" placeholder="请输入不同行政区域边界修建排水、阻水、引水、蓄水工程审批文号"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="各方是否达成协议" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gfsfdcxy">
+              <j-dict-select-tag type="list" v-model="model.gfsfdcxy" dictCode="yn" placeholder="请选择各方是否达成协议" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="协议编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xybh">
+              <a-input v-model="model.xybh" placeholder="请输入协议编号"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="是否进行水资源论证" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sfjxszylz">
+              <j-dict-select-tag type="list" v-model="model.sfjxszylz" dictCode="yn" placeholder="请选择是否进行水资源论证" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="是否分配拦蓄水量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sffplxsl">
+              <j-dict-select-tag type="list" v-model="model.sffplxsl" dictCode="yn" placeholder="请选择是否分配拦蓄水量" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="管理单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gldw">
+              <a-input v-model="model.gldw" placeholder="请输入管理单位"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="主管部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zgbm">
+              <a-input v-model="model.zgbm" placeholder="请输入主管部门"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="安全鉴定日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="aqjdrq">
+              <a-input v-model="model.aqjdrq" placeholder="请输入安全鉴定日期"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="安全鉴定结果" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="aqjdjg">
+              <a-input v-model="model.aqjdjg" placeholder="请输入安全鉴定结果"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="除险加固日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="pxjgrq">
+              <a-input v-model="model.pxjgrq" placeholder="请输入除险加固日期"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="是否为评估保留项目" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sfwpgblxm">
+              <j-dict-select-tag type="list" v-model="model.sfwpgblxm" dictCode="yn" placeholder="是否为评估保留项目" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="评估意见" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="pgyj">
+              <a-textarea v-model="model.pgyj" rows="4" placeholder="请输入评估意见" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="bz">
+              <a-textarea v-model="model.bz" rows="4" placeholder="请输入备注" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="上传审批文件" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="scwj">
+              <j-upload v-model="model.scwj"  ></j-upload>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'RmSkqktjbForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+           skmc: [
+              { required: true, message: '请输入水库名称!'},
+           ],
+        },
+        url: {
+          add: "/hzz.shjsgc.lhgc.sk/rmSkqktjb/add",
+          edit: "/hzz.shjsgc.lhgc.sk/rmSkqktjb/edit",
+          queryById: "/hzz.shjsgc.lhgc.sk/rmSkqktjb/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+              method = 'post';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 109 - 0
.svn/pristine/17/17ca04fc799195fe73b1a7444fd0f1d1c5d29dd0.svn-base

@@ -0,0 +1,109 @@
+<template>
+  <div class="card-list" ref="content">
+    <a-list
+      :grid="{gutter: 24, lg: 3, md: 2, sm: 1, xs: 1}"
+      :dataSource="dataSource"
+    >
+      <a-list-item slot="renderItem" slot-scope="item, index">
+        <template v-if="index === 0">
+          <a-button class="new-btn" type="dashed">
+            <a-icon type="plus"/>
+            新增产品
+          </a-button>
+        </template>
+        <template v-else>
+          <a-card :hoverable="true">
+            <a-card-meta>
+              <div style="margin-bottom: 3px" slot="title">{{ item.title }}</div>
+              <a-avatar class="card-avatar" slot="avatar" :src="item.avatar" size="large"/>
+              <div class="meta-content" slot="description">{{ item.content }}</div>
+            </a-card-meta>
+            <template class="ant-card-actions" slot="actions">
+              <a>操作一</a>
+              <a>操作二</a>
+            </template>
+          </a-card>
+        </template>
+      </a-list-item>
+    </a-list>
+  </div>
+</template>
+
+<script>
+
+  const dataSource = []
+  for (let i = 0; i < 12; i++) {
+    dataSource.push({
+      title: 'Alipay',
+      avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png',
+      content: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+    })
+  }
+
+
+  export default {
+    name: "CardList",
+    data () {
+      return {
+        description: '段落示意:蚂蚁金服务设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态, 提供跨越设计与开发的体验解决方案。',
+        linkList: [
+          { icon: 'rocket', href: '#', title: '快速开始' },
+          { icon: 'info-circle-o', href: '#', title: '产品简介' },
+          { icon: 'file-text', href: '#', title: '产品文档' }
+        ],
+        extraImage: 'https://gw.alipayobjects.com/zos/rmsportal/RzwpdLnhmvDJToTdfDPe.png',
+        dataSource
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+  .card-avatar {
+    width: 48px;
+    height: 48px;
+    border-radius: 48px;
+  }
+
+  .ant-card-actions {
+    background: #f7f9fa;
+    li {
+      float: left;
+      text-align: center;
+      margin: 12px 0;
+      color: rgba(0, 0, 0, 0.45);
+      width: 50%;
+
+      &:not(:last-child) {
+        border-right: 1px solid #e8e8e8;
+      }
+
+      a {
+        color: rgba(0, 0, 0, .45);
+        line-height: 22px;
+        display: inline-block;
+        width: 100%;
+        &:hover {
+          color: #1890ff;
+        }
+      }
+    }
+  }
+
+  .new-btn {
+    background-color: #fff;
+    border-radius: 2px;
+    width: 100%;
+    height: 186px;
+  }
+
+  .meta-content {
+    position: relative;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    height: 64px;
+    -webkit-line-clamp: 3;
+    -webkit-box-orient: vertical;
+  }
+</style>

+ 6003 - 0
.svn/pristine/18/18035d2319d076299959b31ece20c3f1eb7c73d7.svn-base

@@ -0,0 +1,6003 @@
+import { getAction } from '@/api/manage'
+import { ENCRYPTED_STRING } from "@/store/mutation-types"
+import Vue from 'vue'
+
+/**
+ * 获取加密字符串,并对结果进行缓存
+ */
+export function getEncryptedString() {
+  return getAction("/sys/getEncryptedString",{}).then((res)=>{
+    let encryptedString = {};
+    encryptedString.key = res.result.key;
+    encryptedString.iv = res.result.iv;
+    Vue.ls.set(ENCRYPTED_STRING, encryptedString, 7 * 24 * 60 * 60 * 1000);
+    return encryptedString;
+  });
+}
+
+/**
+ * AES加密 :字符串 key iv  返回base64
+ */
+export function encryption(word, keyStr, ivStr) {
+
+  let key = CryptoJS.enc.Utf8.parse(keyStr)
+  let iv = CryptoJS.enc.Utf8.parse(ivStr)
+
+  let srcs = CryptoJS.enc.Utf8.parse(word);
+  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
+    iv: iv,
+    mode: CryptoJS.mode.CBC,
+    padding: CryptoJS.pad.ZeroPadding
+  });
+  // console.log("-=-=-=-", encrypted.ciphertext)
+  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
+
+}
+
+
+var CryptoJS = CryptoJS || (function (Math, undefined) {
+  /*
+	     * Local polyfil of Object.create
+	     */
+  var create = Object.create || (function () {
+    function F() {};
+
+    return function (obj) {
+      var subtype;
+
+      F.prototype = obj;
+
+      subtype = new F();
+
+      F.prototype = null;
+
+      return subtype;
+    };
+  }())
+
+  /**
+   * CryptoJS namespace.
+   */
+  var C = {};
+
+  /**
+   * Library namespace.
+   */
+  var C_lib = C.lib = {};
+
+  /**
+   * Base object for prototypal inheritance.
+   */
+  var Base = C_lib.Base = (function () {
+
+
+    return {
+      /**
+       * Creates a new object that inherits from this object.
+       *
+       * @param {Object} overrides Properties to copy into the new object.
+       *
+       * @return {Object} The new object.
+       *
+       * @static
+       *
+       * @example
+       *
+       *     var MyType = CryptoJS.lib.Base.extend({
+	             *         field: 'value',
+	             *
+	             *         method: function () {
+	             *         }
+	             *     });
+       */
+      extend: function (overrides) {
+        // Spawn
+        var subtype = create(this);
+
+        // Augment
+        if (overrides) {
+          subtype.mixIn(overrides);
+        }
+
+        // Create default initializer
+        if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
+          subtype.init = function () {
+            subtype.$super.init.apply(this, arguments);
+          };
+        }
+
+        // Initializer's prototype is the subtype object
+        subtype.init.prototype = subtype;
+
+        // Reference supertype
+        subtype.$super = this;
+
+        return subtype;
+      },
+
+      /**
+       * Extends this object and runs the init method.
+       * Arguments to create() will be passed to init().
+       *
+       * @return {Object} The new object.
+       *
+       * @static
+       *
+       * @example
+       *
+       *     var instance = MyType.create();
+       */
+      create: function () {
+        var instance = this.extend();
+        instance.init.apply(instance, arguments);
+
+        return instance;
+      },
+
+      /**
+       * Initializes a newly created object.
+       * Override this method to add some logic when your objects are created.
+       *
+       * @example
+       *
+       *     var MyType = CryptoJS.lib.Base.extend({
+	             *         init: function () {
+	             *             // ...
+	             *         }
+	             *     });
+       */
+      init: function () {
+      },
+
+      /**
+       * Copies properties into this object.
+       *
+       * @param {Object} properties The properties to mix in.
+       *
+       * @example
+       *
+       *     MyType.mixIn({
+	             *         field: 'value'
+	             *     });
+       */
+      mixIn: function (properties) {
+        for (var propertyName in properties) {
+          if (properties.hasOwnProperty(propertyName)) {
+            this[propertyName] = properties[propertyName];
+          }
+        }
+
+        // IE won't copy toString using the loop above
+        if (properties.hasOwnProperty('toString')) {
+          this.toString = properties.toString;
+        }
+      },
+
+      /**
+       * Creates a copy of this object.
+       *
+       * @return {Object} The clone.
+       *
+       * @example
+       *
+       *     var clone = instance.clone();
+       */
+      clone: function () {
+        return this.init.prototype.extend(this);
+      }
+    };
+  }());
+
+  /**
+   * An array of 32-bit words.
+   *
+   * @property {Array} words The array of 32-bit words.
+   * @property {number} sigBytes The number of significant bytes in this word array.
+   */
+  var WordArray = C_lib.WordArray = Base.extend({
+    /**
+     * Initializes a newly created word array.
+     *
+     * @param {Array} words (Optional) An array of 32-bit words.
+     * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.lib.WordArray.create();
+     *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+     *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+     */
+    init: function (words, sigBytes) {
+      words = this.words = words || [];
+
+      if (sigBytes != undefined) {
+        this.sigBytes = sigBytes;
+      } else {
+        this.sigBytes = words.length * 4;
+      }
+    },
+
+    /**
+     * Converts this word array to a string.
+     *
+     * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+     *
+     * @return {string} The stringified word array.
+     *
+     * @example
+     *
+     *     var string = wordArray + '';
+     *     var string = wordArray.toString();
+     *     var string = wordArray.toString(CryptoJS.enc.Utf8);
+     */
+    toString: function (encoder) {
+      return (encoder || Hex).stringify(this);
+    },
+
+    /**
+     * Concatenates a word array to this word array.
+     *
+     * @param {WordArray} wordArray The word array to append.
+     *
+     * @return {WordArray} This word array.
+     *
+     * @example
+     *
+     *     wordArray1.concat(wordArray2);
+     */
+    concat: function (wordArray) {
+      // Shortcuts
+      var thisWords = this.words;
+      var thatWords = wordArray.words;
+      var thisSigBytes = this.sigBytes;
+      var thatSigBytes = wordArray.sigBytes;
+
+      // Clamp excess bits
+      this.clamp();
+
+      // Concat
+      if (thisSigBytes % 4) {
+        // Copy one byte at a time
+        for (var i = 0; i < thatSigBytes; i++) {
+          var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+          thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+        }
+      } else {
+        // Copy one word at a time
+        for (var i = 0; i < thatSigBytes; i += 4) {
+          thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
+        }
+      }
+      this.sigBytes += thatSigBytes;
+
+      // Chainable
+      return this;
+    },
+
+    /**
+     * Removes insignificant bits.
+     *
+     * @example
+     *
+     *     wordArray.clamp();
+     */
+    clamp: function () {
+      // Shortcuts
+      var words = this.words;
+      var sigBytes = this.sigBytes;
+
+      // Clamp
+      words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+      words.length = Math.ceil(sigBytes / 4);
+    },
+
+    /**
+     * Creates a copy of this word array.
+     *
+     * @return {WordArray} The clone.
+     *
+     * @example
+     *
+     *     var clone = wordArray.clone();
+     */
+    clone: function () {
+      var clone = Base.clone.call(this);
+      clone.words = this.words.slice(0);
+
+      return clone;
+    },
+
+    /**
+     * Creates a word array filled with random bytes.
+     *
+     * @param {number} nBytes The number of random bytes to generate.
+     *
+     * @return {WordArray} The random word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.lib.WordArray.random(16);
+     */
+    random: function (nBytes) {
+      var words = [];
+
+      var r = (function (m_w) {
+        var m_w = m_w;
+        var m_z = 0x3ade68b1;
+        var mask = 0xffffffff;
+
+        return function () {
+          m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
+          m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
+          var result = ((m_z << 0x10) + m_w) & mask;
+          result /= 0x100000000;
+          result += 0.5;
+          return result * (Math.random() > .5 ? 1 : -1);
+        }
+      });
+
+      for (var i = 0, rcache; i < nBytes; i += 4) {
+        var _r = r((rcache || Math.random()) * 0x100000000);
+
+        rcache = _r() * 0x3ade67b7;
+        words.push((_r() * 0x100000000) | 0);
+      }
+
+      return new WordArray.init(words, nBytes);
+    }
+  });
+
+  /**
+   * Encoder namespace.
+   */
+  var C_enc = C.enc = {};
+
+  /**
+   * Hex encoding strategy.
+   */
+  var Hex = C_enc.Hex = {
+    /**
+     * Converts a word array to a hex string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The hex string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+
+      // Convert
+      var hexChars = [];
+      for (var i = 0; i < sigBytes; i++) {
+        var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+        hexChars.push((bite >>> 4).toString(16));
+        hexChars.push((bite & 0x0f).toString(16));
+      }
+
+      return hexChars.join('');
+    },
+
+    /**
+     * Converts a hex string to a word array.
+     *
+     * @param {string} hexStr The hex string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
+     */
+    parse: function (hexStr) {
+      // Shortcut
+      var hexStrLength = hexStr.length;
+
+      // Convert
+      var words = [];
+      for (var i = 0; i < hexStrLength; i += 2) {
+        words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+      }
+
+      return new WordArray.init(words, hexStrLength / 2);
+    }
+  };
+
+  /**
+   * Latin1 encoding strategy.
+   */
+  var Latin1 = C_enc.Latin1 = {
+    /**
+     * Converts a word array to a Latin1 string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The Latin1 string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+
+      // Convert
+      var latin1Chars = [];
+      for (var i = 0; i < sigBytes; i++) {
+        var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+        latin1Chars.push(String.fromCharCode(bite));
+      }
+
+      return latin1Chars.join('');
+    },
+
+    /**
+     * Converts a Latin1 string to a word array.
+     *
+     * @param {string} latin1Str The Latin1 string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+     */
+    parse: function (latin1Str) {
+      // Shortcut
+      var latin1StrLength = latin1Str.length;
+
+      // Convert
+      var words = [];
+      for (var i = 0; i < latin1StrLength; i++) {
+        words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+      }
+
+      return new WordArray.init(words, latin1StrLength);
+    }
+  };
+
+  /**
+   * UTF-8 encoding strategy.
+   */
+  var Utf8 = C_enc.Utf8 = {
+    /**
+     * Converts a word array to a UTF-8 string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The UTF-8 string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      try {
+        return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+      } catch (e) {
+        throw new Error('Malformed UTF-8 data');
+      }
+    },
+
+    /**
+     * Converts a UTF-8 string to a word array.
+     *
+     * @param {string} utf8Str The UTF-8 string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+     */
+    parse: function (utf8Str) {
+      return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+    }
+  };
+
+  /**
+   * Abstract buffered block algorithm template.
+   *
+   * The property blockSize must be implemented in a concrete subtype.
+   *
+   * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+   */
+  var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+    /**
+     * Resets this block algorithm's data buffer to its initial state.
+     *
+     * @example
+     *
+     *     bufferedBlockAlgorithm.reset();
+     */
+    reset: function () {
+      // Initial values
+      this._data = new WordArray.init();
+      this._nDataBytes = 0;
+    },
+
+    /**
+     * Adds new data to this block algorithm's buffer.
+     *
+     * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+     *
+     * @example
+     *
+     *     bufferedBlockAlgorithm._append('data');
+     *     bufferedBlockAlgorithm._append(wordArray);
+     */
+    _append: function (data) {
+      // Convert string to WordArray, else assume WordArray already
+      if (typeof data == 'string') {
+        data = Utf8.parse(data);
+      }
+
+      // Append
+      this._data.concat(data);
+      this._nDataBytes += data.sigBytes;
+    },
+
+    /**
+     * Processes available data blocks.
+     *
+     * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+     *
+     * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+     *
+     * @return {WordArray} The processed data.
+     *
+     * @example
+     *
+     *     var processedData = bufferedBlockAlgorithm._process();
+     *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
+     */
+    _process: function (doFlush) {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+      var dataSigBytes = data.sigBytes;
+      var blockSize = this.blockSize;
+      var blockSizeBytes = blockSize * 4;
+
+      // Count blocks ready
+      var nBlocksReady = dataSigBytes / blockSizeBytes;
+      if (doFlush) {
+        // Round up to include partial blocks
+        nBlocksReady = Math.ceil(nBlocksReady);
+      } else {
+        // Round down to include only full blocks,
+        // less the number of blocks that must remain in the buffer
+        nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+      }
+
+      // Count words ready
+      var nWordsReady = nBlocksReady * blockSize;
+
+      // Count bytes ready
+      var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+      // Process blocks
+      if (nWordsReady) {
+        for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+          // Perform concrete-algorithm logic
+          this._doProcessBlock(dataWords, offset);
+        }
+
+        // Remove processed words
+        var processedWords = dataWords.splice(0, nWordsReady);
+        data.sigBytes -= nBytesReady;
+      }
+
+      // Return processed words
+      return new WordArray.init(processedWords, nBytesReady);
+    },
+
+    /**
+     * Creates a copy of this object.
+     *
+     * @return {Object} The clone.
+     *
+     * @example
+     *
+     *     var clone = bufferedBlockAlgorithm.clone();
+     */
+    clone: function () {
+      var clone = Base.clone.call(this);
+      clone._data = this._data.clone();
+
+      return clone;
+    },
+
+    _minBufferSize: 0
+  });
+
+  /**
+   * Abstract hasher template.
+   *
+   * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+   */
+  var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+    /**
+     * Configuration options.
+     */
+    cfg: Base.extend(),
+
+    /**
+     * Initializes a newly created hasher.
+     *
+     * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+     *
+     * @example
+     *
+     *     var hasher = CryptoJS.algo.SHA256.create();
+     */
+    init: function (cfg) {
+      // Apply config defaults
+      this.cfg = this.cfg.extend(cfg);
+
+      // Set initial values
+      this.reset();
+    },
+
+    /**
+     * Resets this hasher to its initial state.
+     *
+     * @example
+     *
+     *     hasher.reset();
+     */
+    reset: function () {
+      // Reset data buffer
+      BufferedBlockAlgorithm.reset.call(this);
+
+      // Perform concrete-hasher logic
+      this._doReset();
+    },
+
+    /**
+     * Updates this hasher with a message.
+     *
+     * @param {WordArray|string} messageUpdate The message to append.
+     *
+     * @return {Hasher} This hasher.
+     *
+     * @example
+     *
+     *     hasher.update('message');
+     *     hasher.update(wordArray);
+     */
+    update: function (messageUpdate) {
+      // Append
+      this._append(messageUpdate);
+
+      // Update the hash
+      this._process();
+
+      // Chainable
+      return this;
+    },
+
+    /**
+     * Finalizes the hash computation.
+     * Note that the finalize operation is effectively a destructive, read-once operation.
+     *
+     * @param {WordArray|string} messageUpdate (Optional) A final message update.
+     *
+     * @return {WordArray} The hash.
+     *
+     * @example
+     *
+     *     var hash = hasher.finalize();
+     *     var hash = hasher.finalize('message');
+     *     var hash = hasher.finalize(wordArray);
+     */
+    finalize: function (messageUpdate) {
+      // Final message update
+      if (messageUpdate) {
+        this._append(messageUpdate);
+      }
+
+      // Perform concrete-hasher logic
+      var hash = this._doFinalize();
+
+      return hash;
+    },
+
+    blockSize: 512/32,
+
+    /**
+     * Creates a shortcut function to a hasher's object interface.
+     *
+     * @param {Hasher} hasher The hasher to create a helper for.
+     *
+     * @return {Function} The shortcut function.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+     */
+    _createHelper: function (hasher) {
+      return function (message, cfg) {
+        return new hasher.init(cfg).finalize(message);
+      };
+    },
+
+    /**
+     * Creates a shortcut function to the HMAC's object interface.
+     *
+     * @param {Hasher} hasher The hasher to use in this HMAC helper.
+     *
+     * @return {Function} The shortcut function.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+     */
+    _createHmacHelper: function (hasher) {
+      return function (message, key) {
+        return new C_algo.HMAC.init(hasher, key).finalize(message);
+      };
+    }
+  });
+
+  /**
+   * Algorithm namespace.
+   */
+  var C_algo = C.algo = {};
+
+  return C;
+}(Math));
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var C_enc = C.enc;
+
+  /**
+   * Base64 encoding strategy.
+   */
+  var Base64 = C_enc.Base64 = {
+    /**
+     * Converts a word array to a Base64 string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The Base64 string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+      var map = this._map;
+
+      // Clamp excess bits
+      wordArray.clamp();
+
+      // Convert
+      var base64Chars = [];
+      for (var i = 0; i < sigBytes; i += 3) {
+        var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
+        var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+        var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+        var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+        for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+          base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+        }
+      }
+
+      // Add padding
+      var paddingChar = map.charAt(64);
+      if (paddingChar) {
+        while (base64Chars.length % 4) {
+          base64Chars.push(paddingChar);
+        }
+      }
+
+      return base64Chars.join('');
+    },
+
+    /**
+     * Converts a Base64 string to a word array.
+     *
+     * @param {string} base64Str The Base64 string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
+     */
+    parse: function (base64Str) {
+      // Shortcuts
+      var base64StrLength = base64Str.length;
+      var map = this._map;
+      var reverseMap = this._reverseMap;
+
+      if (!reverseMap) {
+        reverseMap = this._reverseMap = [];
+        for (var j = 0; j < map.length; j++) {
+          reverseMap[map.charCodeAt(j)] = j;
+        }
+      }
+
+      // Ignore padding
+      var paddingChar = map.charAt(64);
+      if (paddingChar) {
+        var paddingIndex = base64Str.indexOf(paddingChar);
+        if (paddingIndex !== -1) {
+          base64StrLength = paddingIndex;
+        }
+      }
+
+      // Convert
+      return parseLoop(base64Str, base64StrLength, reverseMap);
+
+    },
+
+    _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+  };
+
+  function parseLoop(base64Str, base64StrLength, reverseMap) {
+    var words = [];
+    var nBytes = 0;
+    for (var i = 0; i < base64StrLength; i++) {
+      if (i % 4) {
+        var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+        var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+        words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
+        nBytes++;
+      }
+    }
+    return WordArray.create(words, nBytes);
+  }
+}());
+
+
+(function (Math) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var Hasher = C_lib.Hasher;
+  var C_algo = C.algo;
+
+  // Constants table
+  var T = [];
+
+  // Compute constants
+  (function () {
+    for (var i = 0; i < 64; i++) {
+      T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+    }
+  }());
+
+  /**
+   * MD5 hash algorithm.
+   */
+  var MD5 = C_algo.MD5 = Hasher.extend({
+    _doReset: function () {
+      this._hash = new WordArray.init([
+        0x67452301, 0xefcdab89,
+        0x98badcfe, 0x10325476
+      ]);
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Swap endian
+      for (var i = 0; i < 16; i++) {
+        // Shortcuts
+        var offset_i = offset + i;
+        var M_offset_i = M[offset_i];
+
+        M[offset_i] = (
+          (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
+          (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
+        );
+      }
+
+      // Shortcuts
+      var H = this._hash.words;
+
+      var M_offset_0  = M[offset + 0];
+      var M_offset_1  = M[offset + 1];
+      var M_offset_2  = M[offset + 2];
+      var M_offset_3  = M[offset + 3];
+      var M_offset_4  = M[offset + 4];
+      var M_offset_5  = M[offset + 5];
+      var M_offset_6  = M[offset + 6];
+      var M_offset_7  = M[offset + 7];
+      var M_offset_8  = M[offset + 8];
+      var M_offset_9  = M[offset + 9];
+      var M_offset_10 = M[offset + 10];
+      var M_offset_11 = M[offset + 11];
+      var M_offset_12 = M[offset + 12];
+      var M_offset_13 = M[offset + 13];
+      var M_offset_14 = M[offset + 14];
+      var M_offset_15 = M[offset + 15];
+
+      // Working varialbes
+      var a = H[0];
+      var b = H[1];
+      var c = H[2];
+      var d = H[3];
+
+      // Computation
+      a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
+      d = FF(d, a, b, c, M_offset_1,  12, T[1]);
+      c = FF(c, d, a, b, M_offset_2,  17, T[2]);
+      b = FF(b, c, d, a, M_offset_3,  22, T[3]);
+      a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
+      d = FF(d, a, b, c, M_offset_5,  12, T[5]);
+      c = FF(c, d, a, b, M_offset_6,  17, T[6]);
+      b = FF(b, c, d, a, M_offset_7,  22, T[7]);
+      a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
+      d = FF(d, a, b, c, M_offset_9,  12, T[9]);
+      c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+      b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+      a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
+      d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+      c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+      b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+      a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
+      d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
+      c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+      b = GG(b, c, d, a, M_offset_0,  20, T[19]);
+      a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
+      d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
+      c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+      b = GG(b, c, d, a, M_offset_4,  20, T[23]);
+      a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
+      d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
+      c = GG(c, d, a, b, M_offset_3,  14, T[26]);
+      b = GG(b, c, d, a, M_offset_8,  20, T[27]);
+      a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
+      d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
+      c = GG(c, d, a, b, M_offset_7,  14, T[30]);
+      b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+      a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
+      d = HH(d, a, b, c, M_offset_8,  11, T[33]);
+      c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+      b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+      a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
+      d = HH(d, a, b, c, M_offset_4,  11, T[37]);
+      c = HH(c, d, a, b, M_offset_7,  16, T[38]);
+      b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+      a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
+      d = HH(d, a, b, c, M_offset_0,  11, T[41]);
+      c = HH(c, d, a, b, M_offset_3,  16, T[42]);
+      b = HH(b, c, d, a, M_offset_6,  23, T[43]);
+      a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
+      d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+      c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+      b = HH(b, c, d, a, M_offset_2,  23, T[47]);
+
+      a = II(a, b, c, d, M_offset_0,  6,  T[48]);
+      d = II(d, a, b, c, M_offset_7,  10, T[49]);
+      c = II(c, d, a, b, M_offset_14, 15, T[50]);
+      b = II(b, c, d, a, M_offset_5,  21, T[51]);
+      a = II(a, b, c, d, M_offset_12, 6,  T[52]);
+      d = II(d, a, b, c, M_offset_3,  10, T[53]);
+      c = II(c, d, a, b, M_offset_10, 15, T[54]);
+      b = II(b, c, d, a, M_offset_1,  21, T[55]);
+      a = II(a, b, c, d, M_offset_8,  6,  T[56]);
+      d = II(d, a, b, c, M_offset_15, 10, T[57]);
+      c = II(c, d, a, b, M_offset_6,  15, T[58]);
+      b = II(b, c, d, a, M_offset_13, 21, T[59]);
+      a = II(a, b, c, d, M_offset_4,  6,  T[60]);
+      d = II(d, a, b, c, M_offset_11, 10, T[61]);
+      c = II(c, d, a, b, M_offset_2,  15, T[62]);
+      b = II(b, c, d, a, M_offset_9,  21, T[63]);
+
+      // Intermediate hash value
+      H[0] = (H[0] + a) | 0;
+      H[1] = (H[1] + b) | 0;
+      H[2] = (H[2] + c) | 0;
+      H[3] = (H[3] + d) | 0;
+    },
+
+    _doFinalize: function () {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+
+      var nBitsTotal = this._nDataBytes * 8;
+      var nBitsLeft = data.sigBytes * 8;
+
+      // Add padding
+      dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+      var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+      var nBitsTotalL = nBitsTotal;
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+        (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+        (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
+      );
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+        (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+        (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
+      );
+
+      data.sigBytes = (dataWords.length + 1) * 4;
+
+      // Hash final blocks
+      this._process();
+
+      // Shortcuts
+      var hash = this._hash;
+      var H = hash.words;
+
+      // Swap endian
+      for (var i = 0; i < 4; i++) {
+        // Shortcut
+        var H_i = H[i];
+
+        H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
+          (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
+      }
+
+      // Return final computed hash
+      return hash;
+    },
+
+    clone: function () {
+      var clone = Hasher.clone.call(this);
+      clone._hash = this._hash.clone();
+
+      return clone;
+    }
+  });
+
+  function FF(a, b, c, d, x, s, t) {
+    var n = a + ((b & c) | (~b & d)) + x + t;
+    return ((n << s) | (n >>> (32 - s))) + b;
+  }
+
+  function GG(a, b, c, d, x, s, t) {
+    var n = a + ((b & d) | (c & ~d)) + x + t;
+    return ((n << s) | (n >>> (32 - s))) + b;
+  }
+
+  function HH(a, b, c, d, x, s, t) {
+    var n = a + (b ^ c ^ d) + x + t;
+    return ((n << s) | (n >>> (32 - s))) + b;
+  }
+
+  function II(a, b, c, d, x, s, t) {
+    var n = a + (c ^ (b | ~d)) + x + t;
+    return ((n << s) | (n >>> (32 - s))) + b;
+  }
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.MD5('message');
+   *     var hash = CryptoJS.MD5(wordArray);
+   */
+  C.MD5 = Hasher._createHelper(MD5);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacMD5(message, key);
+   */
+  C.HmacMD5 = Hasher._createHmacHelper(MD5);
+}(Math));
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var Hasher = C_lib.Hasher;
+  var C_algo = C.algo;
+
+  // Reusable object
+  var W = [];
+
+  /**
+   * SHA-1 hash algorithm.
+   */
+  var SHA1 = C_algo.SHA1 = Hasher.extend({
+    _doReset: function () {
+      this._hash = new WordArray.init([
+        0x67452301, 0xefcdab89,
+        0x98badcfe, 0x10325476,
+        0xc3d2e1f0
+      ]);
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Shortcut
+      var H = this._hash.words;
+
+      // Working variables
+      var a = H[0];
+      var b = H[1];
+      var c = H[2];
+      var d = H[3];
+      var e = H[4];
+
+      // Computation
+      for (var i = 0; i < 80; i++) {
+        if (i < 16) {
+          W[i] = M[offset + i] | 0;
+        } else {
+          var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+          W[i] = (n << 1) | (n >>> 31);
+        }
+
+        var t = ((a << 5) | (a >>> 27)) + e + W[i];
+        if (i < 20) {
+          t += ((b & c) | (~b & d)) + 0x5a827999;
+        } else if (i < 40) {
+          t += (b ^ c ^ d) + 0x6ed9eba1;
+        } else if (i < 60) {
+          t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+        } else /* if (i < 80) */ {
+          t += (b ^ c ^ d) - 0x359d3e2a;
+        }
+
+        e = d;
+        d = c;
+        c = (b << 30) | (b >>> 2);
+        b = a;
+        a = t;
+      }
+
+      // Intermediate hash value
+      H[0] = (H[0] + a) | 0;
+      H[1] = (H[1] + b) | 0;
+      H[2] = (H[2] + c) | 0;
+      H[3] = (H[3] + d) | 0;
+      H[4] = (H[4] + e) | 0;
+    },
+
+    _doFinalize: function () {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+
+      var nBitsTotal = this._nDataBytes * 8;
+      var nBitsLeft = data.sigBytes * 8;
+
+      // Add padding
+      dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+      data.sigBytes = dataWords.length * 4;
+
+      // Hash final blocks
+      this._process();
+
+      // Return final computed hash
+      return this._hash;
+    },
+
+    clone: function () {
+      var clone = Hasher.clone.call(this);
+      clone._hash = this._hash.clone();
+
+      return clone;
+    }
+  });
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.SHA1('message');
+   *     var hash = CryptoJS.SHA1(wordArray);
+   */
+  C.SHA1 = Hasher._createHelper(SHA1);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacSHA1(message, key);
+   */
+  C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+}());
+
+
+(function (Math) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var Hasher = C_lib.Hasher;
+  var C_algo = C.algo;
+
+  // Initialization and round constants tables
+  var H = [];
+  var K = [];
+
+  // Compute constants
+  (function () {
+    function isPrime(n) {
+      var sqrtN = Math.sqrt(n);
+      for (var factor = 2; factor <= sqrtN; factor++) {
+        if (!(n % factor)) {
+          return false;
+        }
+      }
+
+      return true;
+    }
+
+    function getFractionalBits(n) {
+      return ((n - (n | 0)) * 0x100000000) | 0;
+    }
+
+    var n = 2;
+    var nPrime = 0;
+    while (nPrime < 64) {
+      if (isPrime(n)) {
+        if (nPrime < 8) {
+          H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+        }
+        K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+        nPrime++;
+      }
+
+      n++;
+    }
+  }());
+
+  // Reusable object
+  var W = [];
+
+  /**
+   * SHA-256 hash algorithm.
+   */
+  var SHA256 = C_algo.SHA256 = Hasher.extend({
+    _doReset: function () {
+      this._hash = new WordArray.init(H.slice(0));
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Shortcut
+      var H = this._hash.words;
+
+      // Working variables
+      var a = H[0];
+      var b = H[1];
+      var c = H[2];
+      var d = H[3];
+      var e = H[4];
+      var f = H[5];
+      var g = H[6];
+      var h = H[7];
+
+      // Computation
+      for (var i = 0; i < 64; i++) {
+        if (i < 16) {
+          W[i] = M[offset + i] | 0;
+        } else {
+          var gamma0x = W[i - 15];
+          var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
+            ((gamma0x << 14) | (gamma0x >>> 18)) ^
+            (gamma0x >>> 3);
+
+          var gamma1x = W[i - 2];
+          var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+            ((gamma1x << 13) | (gamma1x >>> 19)) ^
+            (gamma1x >>> 10);
+
+          W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+        }
+
+        var ch  = (e & f) ^ (~e & g);
+        var maj = (a & b) ^ (a & c) ^ (b & c);
+
+        var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+        var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
+
+        var t1 = h + sigma1 + ch + K[i] + W[i];
+        var t2 = sigma0 + maj;
+
+        h = g;
+        g = f;
+        f = e;
+        e = (d + t1) | 0;
+        d = c;
+        c = b;
+        b = a;
+        a = (t1 + t2) | 0;
+      }
+
+      // Intermediate hash value
+      H[0] = (H[0] + a) | 0;
+      H[1] = (H[1] + b) | 0;
+      H[2] = (H[2] + c) | 0;
+      H[3] = (H[3] + d) | 0;
+      H[4] = (H[4] + e) | 0;
+      H[5] = (H[5] + f) | 0;
+      H[6] = (H[6] + g) | 0;
+      H[7] = (H[7] + h) | 0;
+    },
+
+    _doFinalize: function () {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+
+      var nBitsTotal = this._nDataBytes * 8;
+      var nBitsLeft = data.sigBytes * 8;
+
+      // Add padding
+      dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+      data.sigBytes = dataWords.length * 4;
+
+      // Hash final blocks
+      this._process();
+
+      // Return final computed hash
+      return this._hash;
+    },
+
+    clone: function () {
+      var clone = Hasher.clone.call(this);
+      clone._hash = this._hash.clone();
+
+      return clone;
+    }
+  });
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.SHA256('message');
+   *     var hash = CryptoJS.SHA256(wordArray);
+   */
+  C.SHA256 = Hasher._createHelper(SHA256);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacSHA256(message, key);
+   */
+  C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+}(Math));
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var C_enc = C.enc;
+
+  /**
+   * UTF-16 BE encoding strategy.
+   */
+  var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+    /**
+     * Converts a word array to a UTF-16 BE string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The UTF-16 BE string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+
+      // Convert
+      var utf16Chars = [];
+      for (var i = 0; i < sigBytes; i += 2) {
+        var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+        utf16Chars.push(String.fromCharCode(codePoint));
+      }
+
+      return utf16Chars.join('');
+    },
+
+    /**
+     * Converts a UTF-16 BE string to a word array.
+     *
+     * @param {string} utf16Str The UTF-16 BE string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+     */
+    parse: function (utf16Str) {
+      // Shortcut
+      var utf16StrLength = utf16Str.length;
+
+      // Convert
+      var words = [];
+      for (var i = 0; i < utf16StrLength; i++) {
+        words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+      }
+
+      return WordArray.create(words, utf16StrLength * 2);
+    }
+  };
+
+  /**
+   * UTF-16 LE encoding strategy.
+   */
+  C_enc.Utf16LE = {
+    /**
+     * Converts a word array to a UTF-16 LE string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The UTF-16 LE string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+
+      // Convert
+      var utf16Chars = [];
+      for (var i = 0; i < sigBytes; i += 2) {
+        var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+        utf16Chars.push(String.fromCharCode(codePoint));
+      }
+
+      return utf16Chars.join('');
+    },
+
+    /**
+     * Converts a UTF-16 LE string to a word array.
+     *
+     * @param {string} utf16Str The UTF-16 LE string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+     */
+    parse: function (utf16Str) {
+      // Shortcut
+      var utf16StrLength = utf16Str.length;
+
+      // Convert
+      var words = [];
+      for (var i = 0; i < utf16StrLength; i++) {
+        words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+      }
+
+      return WordArray.create(words, utf16StrLength * 2);
+    }
+  };
+
+  function swapEndian(word) {
+    return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+  }
+}());
+
+
+(function () {
+  // Check if typed arrays are supported
+  if (typeof ArrayBuffer != 'function') {
+    return;
+  }
+
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+
+  // Reference original init
+  var superInit = WordArray.init;
+
+  // Augment WordArray.init to handle typed arrays
+  var subInit = WordArray.init = function (typedArray) {
+    // Convert buffers to uint8
+    if (typedArray instanceof ArrayBuffer) {
+      typedArray = new Uint8Array(typedArray);
+    }
+
+    // Convert other array views to uint8
+    if (
+      typedArray instanceof Int8Array ||
+      (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
+      typedArray instanceof Int16Array ||
+      typedArray instanceof Uint16Array ||
+      typedArray instanceof Int32Array ||
+      typedArray instanceof Uint32Array ||
+      typedArray instanceof Float32Array ||
+      typedArray instanceof Float64Array
+    ) {
+      typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+    }
+
+    // Handle Uint8Array
+    if (typedArray instanceof Uint8Array) {
+      // Shortcut
+      var typedArrayByteLength = typedArray.byteLength;
+
+      // Extract bytes
+      var words = [];
+      for (var i = 0; i < typedArrayByteLength; i++) {
+        words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+      }
+
+      // Initialize this word array
+      superInit.call(this, words, typedArrayByteLength);
+    } else {
+      // Else call normal init
+      superInit.apply(this, arguments);
+    }
+  };
+
+  subInit.prototype = WordArray;
+}());
+
+
+/** @preserve
+ (c) 2012 by Cédric Mesnil. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+(function (Math) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var Hasher = C_lib.Hasher;
+  var C_algo = C.algo;
+
+  // Constants table
+  var _zl = WordArray.create([
+    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+    7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
+    3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
+    1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
+    4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
+  var _zr = WordArray.create([
+    5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
+    6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
+    15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
+    8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
+    12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
+  var _sl = WordArray.create([
+    11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
+    7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
+    11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
+    11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
+    9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
+  var _sr = WordArray.create([
+    8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
+    9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
+    9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
+    15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
+    8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
+
+  var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+  var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+  /**
+   * RIPEMD160 hash algorithm.
+   */
+  var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+    _doReset: function () {
+      this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+    },
+
+    _doProcessBlock: function (M, offset) {
+
+      // Swap endian
+      for (var i = 0; i < 16; i++) {
+        // Shortcuts
+        var offset_i = offset + i;
+        var M_offset_i = M[offset_i];
+
+        // Swap
+        M[offset_i] = (
+          (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
+          (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
+        );
+      }
+      // Shortcut
+      var H  = this._hash.words;
+      var hl = _hl.words;
+      var hr = _hr.words;
+      var zl = _zl.words;
+      var zr = _zr.words;
+      var sl = _sl.words;
+      var sr = _sr.words;
+
+      // Working variables
+      var al, bl, cl, dl, el;
+      var ar, br, cr, dr, er;
+
+      ar = al = H[0];
+      br = bl = H[1];
+      cr = cl = H[2];
+      dr = dl = H[3];
+      er = el = H[4];
+      // Computation
+      var t;
+      for (var i = 0; i < 80; i += 1) {
+        t = (al +  M[offset+zl[i]])|0;
+        if (i<16){
+          t +=  f1(bl,cl,dl) + hl[0];
+        } else if (i<32) {
+          t +=  f2(bl,cl,dl) + hl[1];
+        } else if (i<48) {
+          t +=  f3(bl,cl,dl) + hl[2];
+        } else if (i<64) {
+          t +=  f4(bl,cl,dl) + hl[3];
+        } else {// if (i<80) {
+          t +=  f5(bl,cl,dl) + hl[4];
+        }
+        t = t|0;
+        t =  rotl(t,sl[i]);
+        t = (t+el)|0;
+        al = el;
+        el = dl;
+        dl = rotl(cl, 10);
+        cl = bl;
+        bl = t;
+
+        t = (ar + M[offset+zr[i]])|0;
+        if (i<16){
+          t +=  f5(br,cr,dr) + hr[0];
+        } else if (i<32) {
+          t +=  f4(br,cr,dr) + hr[1];
+        } else if (i<48) {
+          t +=  f3(br,cr,dr) + hr[2];
+        } else if (i<64) {
+          t +=  f2(br,cr,dr) + hr[3];
+        } else {// if (i<80) {
+          t +=  f1(br,cr,dr) + hr[4];
+        }
+        t = t|0;
+        t =  rotl(t,sr[i]) ;
+        t = (t+er)|0;
+        ar = er;
+        er = dr;
+        dr = rotl(cr, 10);
+        cr = br;
+        br = t;
+      }
+      // Intermediate hash value
+      t    = (H[1] + cl + dr)|0;
+      H[1] = (H[2] + dl + er)|0;
+      H[2] = (H[3] + el + ar)|0;
+      H[3] = (H[4] + al + br)|0;
+      H[4] = (H[0] + bl + cr)|0;
+      H[0] =  t;
+    },
+
+    _doFinalize: function () {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+
+      var nBitsTotal = this._nDataBytes * 8;
+      var nBitsLeft = data.sigBytes * 8;
+
+      // Add padding
+      dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+      dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+        (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+        (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
+      );
+      data.sigBytes = (dataWords.length + 1) * 4;
+
+      // Hash final blocks
+      this._process();
+
+      // Shortcuts
+      var hash = this._hash;
+      var H = hash.words;
+
+      // Swap endian
+      for (var i = 0; i < 5; i++) {
+        // Shortcut
+        var H_i = H[i];
+
+        // Swap
+        H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
+          (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
+      }
+
+      // Return final computed hash
+      return hash;
+    },
+
+    clone: function () {
+      var clone = Hasher.clone.call(this);
+      clone._hash = this._hash.clone();
+
+      return clone;
+    }
+  });
+
+
+  function f1(x, y, z) {
+    return ((x) ^ (y) ^ (z));
+
+  }
+
+  function f2(x, y, z) {
+    return (((x)&(y)) | ((~x)&(z)));
+  }
+
+  function f3(x, y, z) {
+    return (((x) | (~(y))) ^ (z));
+  }
+
+  function f4(x, y, z) {
+    return (((x) & (z)) | ((y)&(~(z))));
+  }
+
+  function f5(x, y, z) {
+    return ((x) ^ ((y) |(~(z))));
+
+  }
+
+  function rotl(x,n) {
+    return (x<<n) | (x>>>(32-n));
+  }
+
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.RIPEMD160('message');
+   *     var hash = CryptoJS.RIPEMD160(wordArray);
+   */
+  C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
+   */
+  C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+}(Math));
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var Base = C_lib.Base;
+  var C_enc = C.enc;
+  var Utf8 = C_enc.Utf8;
+  var C_algo = C.algo;
+
+  /**
+   * HMAC algorithm.
+   */
+  var HMAC = C_algo.HMAC = Base.extend({
+    /**
+     * Initializes a newly created HMAC.
+     *
+     * @param {Hasher} hasher The hash algorithm to use.
+     * @param {WordArray|string} key The secret key.
+     *
+     * @example
+     *
+     *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+     */
+    init: function (hasher, key) {
+      // Init hasher
+      hasher = this._hasher = new hasher.init();
+
+      // Convert string to WordArray, else assume WordArray already
+      if (typeof key == 'string') {
+        key = Utf8.parse(key);
+      }
+
+      // Shortcuts
+      var hasherBlockSize = hasher.blockSize;
+      var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+      // Allow arbitrary length keys
+      if (key.sigBytes > hasherBlockSizeBytes) {
+        key = hasher.finalize(key);
+      }
+
+      // Clamp excess bits
+      key.clamp();
+
+      // Clone key for inner and outer pads
+      var oKey = this._oKey = key.clone();
+      var iKey = this._iKey = key.clone();
+
+      // Shortcuts
+      var oKeyWords = oKey.words;
+      var iKeyWords = iKey.words;
+
+      // XOR keys with pad constants
+      for (var i = 0; i < hasherBlockSize; i++) {
+        oKeyWords[i] ^= 0x5c5c5c5c;
+        iKeyWords[i] ^= 0x36363636;
+      }
+      oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+      // Set initial values
+      this.reset();
+    },
+
+    /**
+     * Resets this HMAC to its initial state.
+     *
+     * @example
+     *
+     *     hmacHasher.reset();
+     */
+    reset: function () {
+      // Shortcut
+      var hasher = this._hasher;
+
+      // Reset
+      hasher.reset();
+      hasher.update(this._iKey);
+    },
+
+    /**
+     * Updates this HMAC with a message.
+     *
+     * @param {WordArray|string} messageUpdate The message to append.
+     *
+     * @return {HMAC} This HMAC instance.
+     *
+     * @example
+     *
+     *     hmacHasher.update('message');
+     *     hmacHasher.update(wordArray);
+     */
+    update: function (messageUpdate) {
+      this._hasher.update(messageUpdate);
+
+      // Chainable
+      return this;
+    },
+
+    /**
+     * Finalizes the HMAC computation.
+     * Note that the finalize operation is effectively a destructive, read-once operation.
+     *
+     * @param {WordArray|string} messageUpdate (Optional) A final message update.
+     *
+     * @return {WordArray} The HMAC.
+     *
+     * @example
+     *
+     *     var hmac = hmacHasher.finalize();
+     *     var hmac = hmacHasher.finalize('message');
+     *     var hmac = hmacHasher.finalize(wordArray);
+     */
+    finalize: function (messageUpdate) {
+      // Shortcut
+      var hasher = this._hasher;
+
+      // Compute HMAC
+      var innerHash = hasher.finalize(messageUpdate);
+      hasher.reset();
+      var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+      return hmac;
+    }
+  });
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var Base = C_lib.Base;
+  var WordArray = C_lib.WordArray;
+  var C_algo = C.algo;
+  var SHA1 = C_algo.SHA1;
+  var HMAC = C_algo.HMAC;
+
+  /**
+   * Password-Based Key Derivation Function 2 algorithm.
+   */
+  var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+     * @property {Hasher} hasher The hasher to use. Default: SHA1
+     * @property {number} iterations The number of iterations to perform. Default: 1
+     */
+    cfg: Base.extend({
+      keySize: 128/32,
+      hasher: SHA1,
+      iterations: 1
+    }),
+
+    /**
+     * Initializes a newly created key derivation function.
+     *
+     * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+     *
+     * @example
+     *
+     *     var kdf = CryptoJS.algo.PBKDF2.create();
+     *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+     *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+     */
+    init: function (cfg) {
+      this.cfg = this.cfg.extend(cfg);
+    },
+
+    /**
+     * Computes the Password-Based Key Derivation Function 2.
+     *
+     * @param {WordArray|string} password The password.
+     * @param {WordArray|string} salt A salt.
+     *
+     * @return {WordArray} The derived key.
+     *
+     * @example
+     *
+     *     var key = kdf.compute(password, salt);
+     */
+    compute: function (password, salt) {
+      // Shortcut
+      var cfg = this.cfg;
+
+      // Init HMAC
+      var hmac = HMAC.create(cfg.hasher, password);
+
+      // Initial values
+      var derivedKey = WordArray.create();
+      var blockIndex = WordArray.create([0x00000001]);
+
+      // Shortcuts
+      var derivedKeyWords = derivedKey.words;
+      var blockIndexWords = blockIndex.words;
+      var keySize = cfg.keySize;
+      var iterations = cfg.iterations;
+
+      // Generate key
+      while (derivedKeyWords.length < keySize) {
+        var block = hmac.update(salt).finalize(blockIndex);
+        hmac.reset();
+
+        // Shortcuts
+        var blockWords = block.words;
+        var blockWordsLength = blockWords.length;
+
+        // Iterations
+        var intermediate = block;
+        for (var i = 1; i < iterations; i++) {
+          intermediate = hmac.finalize(intermediate);
+          hmac.reset();
+
+          // Shortcut
+          var intermediateWords = intermediate.words;
+
+          // XOR intermediate with block
+          for (var j = 0; j < blockWordsLength; j++) {
+            blockWords[j] ^= intermediateWords[j];
+          }
+        }
+
+        derivedKey.concat(block);
+        blockIndexWords[0]++;
+      }
+      derivedKey.sigBytes = keySize * 4;
+
+      return derivedKey;
+    }
+  });
+
+  /**
+   * Computes the Password-Based Key Derivation Function 2.
+   *
+   * @param {WordArray|string} password The password.
+   * @param {WordArray|string} salt A salt.
+   * @param {Object} cfg (Optional) The configuration options to use for this computation.
+   *
+   * @return {WordArray} The derived key.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var key = CryptoJS.PBKDF2(password, salt);
+   *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+   *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+   */
+  C.PBKDF2 = function (password, salt, cfg) {
+    return PBKDF2.create(cfg).compute(password, salt);
+  };
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var Base = C_lib.Base;
+  var WordArray = C_lib.WordArray;
+  var C_algo = C.algo;
+  var MD5 = C_algo.MD5;
+
+  /**
+   * This key derivation function is meant to conform with EVP_BytesToKey.
+   * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+   */
+  var EvpKDF = C_algo.EvpKDF = Base.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+     * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+     * @property {number} iterations The number of iterations to perform. Default: 1
+     */
+    cfg: Base.extend({
+      keySize: 128/32,
+      hasher: MD5,
+      iterations: 1
+    }),
+
+    /**
+     * Initializes a newly created key derivation function.
+     *
+     * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+     *
+     * @example
+     *
+     *     var kdf = CryptoJS.algo.EvpKDF.create();
+     *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+     *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+     */
+    init: function (cfg) {
+      this.cfg = this.cfg.extend(cfg);
+    },
+
+    /**
+     * Derives a key from a password.
+     *
+     * @param {WordArray|string} password The password.
+     * @param {WordArray|string} salt A salt.
+     *
+     * @return {WordArray} The derived key.
+     *
+     * @example
+     *
+     *     var key = kdf.compute(password, salt);
+     */
+    compute: function (password, salt) {
+      // Shortcut
+      var cfg = this.cfg;
+
+      // Init hasher
+      var hasher = cfg.hasher.create();
+
+      // Initial values
+      var derivedKey = WordArray.create();
+
+      // Shortcuts
+      var derivedKeyWords = derivedKey.words;
+      var keySize = cfg.keySize;
+      var iterations = cfg.iterations;
+
+      // Generate key
+      while (derivedKeyWords.length < keySize) {
+        if (block) {
+          hasher.update(block);
+        }
+        var block = hasher.update(password).finalize(salt);
+        hasher.reset();
+
+        // Iterations
+        for (var i = 1; i < iterations; i++) {
+          block = hasher.finalize(block);
+          hasher.reset();
+        }
+
+        derivedKey.concat(block);
+      }
+      derivedKey.sigBytes = keySize * 4;
+
+      return derivedKey;
+    }
+  });
+
+  /**
+   * Derives a key from a password.
+   *
+   * @param {WordArray|string} password The password.
+   * @param {WordArray|string} salt A salt.
+   * @param {Object} cfg (Optional) The configuration options to use for this computation.
+   *
+   * @return {WordArray} The derived key.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var key = CryptoJS.EvpKDF(password, salt);
+   *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+   *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+   */
+  C.EvpKDF = function (password, salt, cfg) {
+    return EvpKDF.create(cfg).compute(password, salt);
+  };
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var C_algo = C.algo;
+  var SHA256 = C_algo.SHA256;
+
+  /**
+   * SHA-224 hash algorithm.
+   */
+  var SHA224 = C_algo.SHA224 = SHA256.extend({
+    _doReset: function () {
+      this._hash = new WordArray.init([
+        0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+        0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+      ]);
+    },
+
+    _doFinalize: function () {
+      var hash = SHA256._doFinalize.call(this);
+
+      hash.sigBytes -= 4;
+
+      return hash;
+    }
+  });
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.SHA224('message');
+   *     var hash = CryptoJS.SHA224(wordArray);
+   */
+  C.SHA224 = SHA256._createHelper(SHA224);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacSHA224(message, key);
+   */
+  C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+}());
+
+
+(function (undefined) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var Base = C_lib.Base;
+  var X32WordArray = C_lib.WordArray;
+
+  /**
+   * x64 namespace.
+   */
+  var C_x64 = C.x64 = {};
+
+  /**
+   * A 64-bit word.
+   */
+  var X64Word = C_x64.Word = Base.extend({
+    /**
+     * Initializes a newly created 64-bit word.
+     *
+     * @param {number} high The high 32 bits.
+     * @param {number} low The low 32 bits.
+     *
+     * @example
+     *
+     *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+     */
+    init: function (high, low) {
+      this.high = high;
+      this.low = low;
+    }
+
+    /**
+     * Bitwise NOTs this word.
+     *
+     * @return {X64Word} A new x64-Word object after negating.
+     *
+     * @example
+     *
+     *     var negated = x64Word.not();
+     */
+    // not: function () {
+    // var high = ~this.high;
+    // var low = ~this.low;
+
+    // return X64Word.create(high, low);
+    // },
+
+    /**
+     * Bitwise ANDs this word with the passed word.
+     *
+     * @param {X64Word} word The x64-Word to AND with this word.
+     *
+     * @return {X64Word} A new x64-Word object after ANDing.
+     *
+     * @example
+     *
+     *     var anded = x64Word.and(anotherX64Word);
+     */
+    // and: function (word) {
+    // var high = this.high & word.high;
+    // var low = this.low & word.low;
+
+    // return X64Word.create(high, low);
+    // },
+
+    /**
+     * Bitwise ORs this word with the passed word.
+     *
+     * @param {X64Word} word The x64-Word to OR with this word.
+     *
+     * @return {X64Word} A new x64-Word object after ORing.
+     *
+     * @example
+     *
+     *     var ored = x64Word.or(anotherX64Word);
+     */
+    // or: function (word) {
+    // var high = this.high | word.high;
+    // var low = this.low | word.low;
+
+    // return X64Word.create(high, low);
+    // },
+
+    /**
+     * Bitwise XORs this word with the passed word.
+     *
+     * @param {X64Word} word The x64-Word to XOR with this word.
+     *
+     * @return {X64Word} A new x64-Word object after XORing.
+     *
+     * @example
+     *
+     *     var xored = x64Word.xor(anotherX64Word);
+     */
+    // xor: function (word) {
+    // var high = this.high ^ word.high;
+    // var low = this.low ^ word.low;
+
+    // return X64Word.create(high, low);
+    // },
+
+    /**
+     * Shifts this word n bits to the left.
+     *
+     * @param {number} n The number of bits to shift.
+     *
+     * @return {X64Word} A new x64-Word object after shifting.
+     *
+     * @example
+     *
+     *     var shifted = x64Word.shiftL(25);
+     */
+    // shiftL: function (n) {
+    // if (n < 32) {
+    // var high = (this.high << n) | (this.low >>> (32 - n));
+    // var low = this.low << n;
+    // } else {
+    // var high = this.low << (n - 32);
+    // var low = 0;
+    // }
+
+    // return X64Word.create(high, low);
+    // },
+
+    /**
+     * Shifts this word n bits to the right.
+     *
+     * @param {number} n The number of bits to shift.
+     *
+     * @return {X64Word} A new x64-Word object after shifting.
+     *
+     * @example
+     *
+     *     var shifted = x64Word.shiftR(7);
+     */
+    // shiftR: function (n) {
+    // if (n < 32) {
+    // var low = (this.low >>> n) | (this.high << (32 - n));
+    // var high = this.high >>> n;
+    // } else {
+    // var low = this.high >>> (n - 32);
+    // var high = 0;
+    // }
+
+    // return X64Word.create(high, low);
+    // },
+
+    /**
+     * Rotates this word n bits to the left.
+     *
+     * @param {number} n The number of bits to rotate.
+     *
+     * @return {X64Word} A new x64-Word object after rotating.
+     *
+     * @example
+     *
+     *     var rotated = x64Word.rotL(25);
+     */
+    // rotL: function (n) {
+    // return this.shiftL(n).or(this.shiftR(64 - n));
+    // },
+
+    /**
+     * Rotates this word n bits to the right.
+     *
+     * @param {number} n The number of bits to rotate.
+     *
+     * @return {X64Word} A new x64-Word object after rotating.
+     *
+     * @example
+     *
+     *     var rotated = x64Word.rotR(7);
+     */
+    // rotR: function (n) {
+    // return this.shiftR(n).or(this.shiftL(64 - n));
+    // },
+
+    /**
+     * Adds this word with the passed word.
+     *
+     * @param {X64Word} word The x64-Word to add with this word.
+     *
+     * @return {X64Word} A new x64-Word object after adding.
+     *
+     * @example
+     *
+     *     var added = x64Word.add(anotherX64Word);
+     */
+    // add: function (word) {
+    // var low = (this.low + word.low) | 0;
+    // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+    // var high = (this.high + word.high + carry) | 0;
+
+    // return X64Word.create(high, low);
+    // }
+  });
+
+  /**
+   * An array of 64-bit words.
+   *
+   * @property {Array} words The array of CryptoJS.x64.Word objects.
+   * @property {number} sigBytes The number of significant bytes in this word array.
+   */
+  var X64WordArray = C_x64.WordArray = Base.extend({
+    /**
+     * Initializes a newly created word array.
+     *
+     * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+     * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.x64.WordArray.create();
+     *
+     *     var wordArray = CryptoJS.x64.WordArray.create([
+     *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+     *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+     *     ]);
+     *
+     *     var wordArray = CryptoJS.x64.WordArray.create([
+     *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+     *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+     *     ], 10);
+     */
+    init: function (words, sigBytes) {
+      words = this.words = words || [];
+
+      if (sigBytes != undefined) {
+        this.sigBytes = sigBytes;
+      } else {
+        this.sigBytes = words.length * 8;
+      }
+    },
+
+    /**
+     * Converts this 64-bit word array to a 32-bit word array.
+     *
+     * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+     *
+     * @example
+     *
+     *     var x32WordArray = x64WordArray.toX32();
+     */
+    toX32: function () {
+      // Shortcuts
+      var x64Words = this.words;
+      var x64WordsLength = x64Words.length;
+
+      // Convert
+      var x32Words = [];
+      for (var i = 0; i < x64WordsLength; i++) {
+        var x64Word = x64Words[i];
+        x32Words.push(x64Word.high);
+        x32Words.push(x64Word.low);
+      }
+
+      return X32WordArray.create(x32Words, this.sigBytes);
+    },
+
+    /**
+     * Creates a copy of this word array.
+     *
+     * @return {X64WordArray} The clone.
+     *
+     * @example
+     *
+     *     var clone = x64WordArray.clone();
+     */
+    clone: function () {
+      var clone = Base.clone.call(this);
+
+      // Clone "words" array
+      var words = clone.words = this.words.slice(0);
+
+      // Clone each X64Word object
+      var wordsLength = words.length;
+      for (var i = 0; i < wordsLength; i++) {
+        words[i] = words[i].clone();
+      }
+
+      return clone;
+    }
+  });
+}());
+
+
+(function (Math) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var Hasher = C_lib.Hasher;
+  var C_x64 = C.x64;
+  var X64Word = C_x64.Word;
+  var C_algo = C.algo;
+
+  // Constants tables
+  var RHO_OFFSETS = [];
+  var PI_INDEXES  = [];
+  var ROUND_CONSTANTS = [];
+
+  // Compute Constants
+  (function () {
+    // Compute rho offset constants
+    var x = 1, y = 0;
+    for (var t = 0; t < 24; t++) {
+      RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+      var newX = y % 5;
+      var newY = (2 * x + 3 * y) % 5;
+      x = newX;
+      y = newY;
+    }
+
+    // Compute pi index constants
+    for (var x = 0; x < 5; x++) {
+      for (var y = 0; y < 5; y++) {
+        PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+      }
+    }
+
+    // Compute round constants
+    var LFSR = 0x01;
+    for (var i = 0; i < 24; i++) {
+      var roundConstantMsw = 0;
+      var roundConstantLsw = 0;
+
+      for (var j = 0; j < 7; j++) {
+        if (LFSR & 0x01) {
+          var bitPosition = (1 << j) - 1;
+          if (bitPosition < 32) {
+            roundConstantLsw ^= 1 << bitPosition;
+          } else /* if (bitPosition >= 32) */ {
+            roundConstantMsw ^= 1 << (bitPosition - 32);
+          }
+        }
+
+        // Compute next LFSR
+        if (LFSR & 0x80) {
+          // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+          LFSR = (LFSR << 1) ^ 0x71;
+        } else {
+          LFSR <<= 1;
+        }
+      }
+
+      ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+    }
+  }());
+
+  // Reusable objects for temporary values
+  var T = [];
+  (function () {
+    for (var i = 0; i < 25; i++) {
+      T[i] = X64Word.create();
+    }
+  }());
+
+  /**
+   * SHA-3 hash algorithm.
+   */
+  var SHA3 = C_algo.SHA3 = Hasher.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {number} outputLength
+     *   The desired number of bits in the output hash.
+     *   Only values permitted are: 224, 256, 384, 512.
+     *   Default: 512
+     */
+    cfg: Hasher.cfg.extend({
+      outputLength: 512
+    }),
+
+    _doReset: function () {
+      var state = this._state = []
+      for (var i = 0; i < 25; i++) {
+        state[i] = new X64Word.init();
+      }
+
+      this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Shortcuts
+      var state = this._state;
+      var nBlockSizeLanes = this.blockSize / 2;
+
+      // Absorb
+      for (var i = 0; i < nBlockSizeLanes; i++) {
+        // Shortcuts
+        var M2i  = M[offset + 2 * i];
+        var M2i1 = M[offset + 2 * i + 1];
+
+        // Swap endian
+        M2i = (
+          (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
+          (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
+        );
+        M2i1 = (
+          (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
+          (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
+        );
+
+        // Absorb message into state
+        var lane = state[i];
+        lane.high ^= M2i1;
+        lane.low  ^= M2i;
+      }
+
+      // Rounds
+      for (var round = 0; round < 24; round++) {
+        // Theta
+        for (var x = 0; x < 5; x++) {
+          // Mix column lanes
+          var tMsw = 0, tLsw = 0;
+          for (var y = 0; y < 5; y++) {
+            var lane = state[x + 5 * y];
+            tMsw ^= lane.high;
+            tLsw ^= lane.low;
+          }
+
+          // Temporary values
+          var Tx = T[x];
+          Tx.high = tMsw;
+          Tx.low  = tLsw;
+        }
+        for (var x = 0; x < 5; x++) {
+          // Shortcuts
+          var Tx4 = T[(x + 4) % 5];
+          var Tx1 = T[(x + 1) % 5];
+          var Tx1Msw = Tx1.high;
+          var Tx1Lsw = Tx1.low;
+
+          // Mix surrounding columns
+          var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+          var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+          for (var y = 0; y < 5; y++) {
+            var lane = state[x + 5 * y];
+            lane.high ^= tMsw;
+            lane.low  ^= tLsw;
+          }
+        }
+
+        // Rho Pi
+        for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+          // Shortcuts
+          var lane = state[laneIndex];
+          var laneMsw = lane.high;
+          var laneLsw = lane.low;
+          var rhoOffset = RHO_OFFSETS[laneIndex];
+
+          // Rotate lanes
+          if (rhoOffset < 32) {
+            var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+            var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+          } else /* if (rhoOffset >= 32) */ {
+            var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+            var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+          }
+
+          // Transpose lanes
+          var TPiLane = T[PI_INDEXES[laneIndex]];
+          TPiLane.high = tMsw;
+          TPiLane.low  = tLsw;
+        }
+
+        // Rho pi at x = y = 0
+        var T0 = T[0];
+        var state0 = state[0];
+        T0.high = state0.high;
+        T0.low  = state0.low;
+
+        // Chi
+        for (var x = 0; x < 5; x++) {
+          for (var y = 0; y < 5; y++) {
+            // Shortcuts
+            var laneIndex = x + 5 * y;
+            var lane = state[laneIndex];
+            var TLane = T[laneIndex];
+            var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+            var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+            // Mix rows
+            lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+            lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
+          }
+        }
+
+        // Iota
+        var lane = state[0];
+        var roundConstant = ROUND_CONSTANTS[round];
+        lane.high ^= roundConstant.high;
+        lane.low  ^= roundConstant.low;;
+      }
+    },
+
+    _doFinalize: function () {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+      var nBitsTotal = this._nDataBytes * 8;
+      var nBitsLeft = data.sigBytes * 8;
+      var blockSizeBits = this.blockSize * 32;
+
+      // Add padding
+      dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+      dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+      data.sigBytes = dataWords.length * 4;
+
+      // Hash final blocks
+      this._process();
+
+      // Shortcuts
+      var state = this._state;
+      var outputLengthBytes = this.cfg.outputLength / 8;
+      var outputLengthLanes = outputLengthBytes / 8;
+
+      // Squeeze
+      var hashWords = [];
+      for (var i = 0; i < outputLengthLanes; i++) {
+        // Shortcuts
+        var lane = state[i];
+        var laneMsw = lane.high;
+        var laneLsw = lane.low;
+
+        // Swap endian
+        laneMsw = (
+          (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
+          (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
+        );
+        laneLsw = (
+          (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
+          (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
+        );
+
+        // Squeeze state to retrieve hash
+        hashWords.push(laneLsw);
+        hashWords.push(laneMsw);
+      }
+
+      // Return final computed hash
+      return new WordArray.init(hashWords, outputLengthBytes);
+    },
+
+    clone: function () {
+      var clone = Hasher.clone.call(this);
+
+      var state = clone._state = this._state.slice(0);
+      for (var i = 0; i < 25; i++) {
+        state[i] = state[i].clone();
+      }
+
+      return clone;
+    }
+  });
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.SHA3('message');
+   *     var hash = CryptoJS.SHA3(wordArray);
+   */
+  C.SHA3 = Hasher._createHelper(SHA3);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacSHA3(message, key);
+   */
+  C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+}(Math));
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var Hasher = C_lib.Hasher;
+  var C_x64 = C.x64;
+  var X64Word = C_x64.Word;
+  var X64WordArray = C_x64.WordArray;
+  var C_algo = C.algo;
+
+  function X64Word_create() {
+    return X64Word.create.apply(X64Word, arguments);
+  }
+
+  // Constants
+  var K = [
+    X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+    X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+    X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+    X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+    X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+    X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+    X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+    X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+    X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+    X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+    X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+    X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+    X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+    X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+    X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+    X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+    X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+    X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+    X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+    X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+    X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+    X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+    X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+    X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+    X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+    X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+    X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+    X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+    X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+    X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+    X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+    X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+    X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+    X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+    X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+    X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+    X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+    X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+    X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+    X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+  ];
+
+  // Reusable objects
+  var W = [];
+  (function () {
+    for (var i = 0; i < 80; i++) {
+      W[i] = X64Word_create();
+    }
+  }());
+
+  /**
+   * SHA-512 hash algorithm.
+   */
+  var SHA512 = C_algo.SHA512 = Hasher.extend({
+    _doReset: function () {
+      this._hash = new X64WordArray.init([
+        new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+        new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+        new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+        new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+      ]);
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Shortcuts
+      var H = this._hash.words;
+
+      var H0 = H[0];
+      var H1 = H[1];
+      var H2 = H[2];
+      var H3 = H[3];
+      var H4 = H[4];
+      var H5 = H[5];
+      var H6 = H[6];
+      var H7 = H[7];
+
+      var H0h = H0.high;
+      var H0l = H0.low;
+      var H1h = H1.high;
+      var H1l = H1.low;
+      var H2h = H2.high;
+      var H2l = H2.low;
+      var H3h = H3.high;
+      var H3l = H3.low;
+      var H4h = H4.high;
+      var H4l = H4.low;
+      var H5h = H5.high;
+      var H5l = H5.low;
+      var H6h = H6.high;
+      var H6l = H6.low;
+      var H7h = H7.high;
+      var H7l = H7.low;
+
+      // Working variables
+      var ah = H0h;
+      var al = H0l;
+      var bh = H1h;
+      var bl = H1l;
+      var ch = H2h;
+      var cl = H2l;
+      var dh = H3h;
+      var dl = H3l;
+      var eh = H4h;
+      var el = H4l;
+      var fh = H5h;
+      var fl = H5l;
+      var gh = H6h;
+      var gl = H6l;
+      var hh = H7h;
+      var hl = H7l;
+
+      // Rounds
+      for (var i = 0; i < 80; i++) {
+        // Shortcut
+        var Wi = W[i];
+
+        // Extend message
+        if (i < 16) {
+          var Wih = Wi.high = M[offset + i * 2]     | 0;
+          var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
+        } else {
+          // Gamma0
+          var gamma0x  = W[i - 15];
+          var gamma0xh = gamma0x.high;
+          var gamma0xl = gamma0x.low;
+          var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+          var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+          // Gamma1
+          var gamma1x  = W[i - 2];
+          var gamma1xh = gamma1x.high;
+          var gamma1xl = gamma1x.low;
+          var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+          var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+          // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+          var Wi7  = W[i - 7];
+          var Wi7h = Wi7.high;
+          var Wi7l = Wi7.low;
+
+          var Wi16  = W[i - 16];
+          var Wi16h = Wi16.high;
+          var Wi16l = Wi16.low;
+
+          var Wil = gamma0l + Wi7l;
+          var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+          var Wil = Wil + gamma1l;
+          var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+          var Wil = Wil + Wi16l;
+          var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+          Wi.high = Wih;
+          Wi.low  = Wil;
+        }
+
+        var chh  = (eh & fh) ^ (~eh & gh);
+        var chl  = (el & fl) ^ (~el & gl);
+        var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+        var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+        var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+        var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+        var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+        var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+        // t1 = h + sigma1 + ch + K[i] + W[i]
+        var Ki  = K[i];
+        var Kih = Ki.high;
+        var Kil = Ki.low;
+
+        var t1l = hl + sigma1l;
+        var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+        var t1l = t1l + chl;
+        var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+        var t1l = t1l + Kil;
+        var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+        var t1l = t1l + Wil;
+        var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+        // t2 = sigma0 + maj
+        var t2l = sigma0l + majl;
+        var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+        // Update working variables
+        hh = gh;
+        hl = gl;
+        gh = fh;
+        gl = fl;
+        fh = eh;
+        fl = el;
+        el = (dl + t1l) | 0;
+        eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+        dh = ch;
+        dl = cl;
+        ch = bh;
+        cl = bl;
+        bh = ah;
+        bl = al;
+        al = (t1l + t2l) | 0;
+        ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+      }
+
+      // Intermediate hash value
+      H0l = H0.low  = (H0l + al);
+      H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+      H1l = H1.low  = (H1l + bl);
+      H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+      H2l = H2.low  = (H2l + cl);
+      H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+      H3l = H3.low  = (H3l + dl);
+      H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+      H4l = H4.low  = (H4l + el);
+      H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+      H5l = H5.low  = (H5l + fl);
+      H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+      H6l = H6.low  = (H6l + gl);
+      H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+      H7l = H7.low  = (H7l + hl);
+      H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+    },
+
+    _doFinalize: function () {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+
+      var nBitsTotal = this._nDataBytes * 8;
+      var nBitsLeft = data.sigBytes * 8;
+
+      // Add padding
+      dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+      dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+      dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+      data.sigBytes = dataWords.length * 4;
+
+      // Hash final blocks
+      this._process();
+
+      // Convert hash to 32-bit word array before returning
+      var hash = this._hash.toX32();
+
+      // Return final computed hash
+      return hash;
+    },
+
+    clone: function () {
+      var clone = Hasher.clone.call(this);
+      clone._hash = this._hash.clone();
+
+      return clone;
+    },
+
+    blockSize: 1024/32
+  });
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.SHA512('message');
+   *     var hash = CryptoJS.SHA512(wordArray);
+   */
+  C.SHA512 = Hasher._createHelper(SHA512);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacSHA512(message, key);
+   */
+  C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_x64 = C.x64;
+  var X64Word = C_x64.Word;
+  var X64WordArray = C_x64.WordArray;
+  var C_algo = C.algo;
+  var SHA512 = C_algo.SHA512;
+
+  /**
+   * SHA-384 hash algorithm.
+   */
+  var SHA384 = C_algo.SHA384 = SHA512.extend({
+    _doReset: function () {
+      this._hash = new X64WordArray.init([
+        new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+        new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+        new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+        new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+      ]);
+    },
+
+    _doFinalize: function () {
+      var hash = SHA512._doFinalize.call(this);
+
+      hash.sigBytes -= 16;
+
+      return hash;
+    }
+  });
+
+  /**
+   * Shortcut function to the hasher's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   *
+   * @return {WordArray} The hash.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hash = CryptoJS.SHA384('message');
+   *     var hash = CryptoJS.SHA384(wordArray);
+   */
+  C.SHA384 = SHA512._createHelper(SHA384);
+
+  /**
+   * Shortcut function to the HMAC's object interface.
+   *
+   * @param {WordArray|string} message The message to hash.
+   * @param {WordArray|string} key The secret key.
+   *
+   * @return {WordArray} The HMAC.
+   *
+   * @static
+   *
+   * @example
+   *
+   *     var hmac = CryptoJS.HmacSHA384(message, key);
+   */
+  C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+}());
+
+
+/**
+ * Cipher core components.
+ */
+CryptoJS.lib.Cipher || (function (undefined) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var Base = C_lib.Base;
+  var WordArray = C_lib.WordArray;
+  var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+  var C_enc = C.enc;
+  var Utf8 = C_enc.Utf8;
+  var Base64 = C_enc.Base64;
+  var C_algo = C.algo;
+  var EvpKDF = C_algo.EvpKDF;
+
+  /**
+   * Abstract base cipher template.
+   *
+   * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+   * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+   * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+   * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+   */
+  var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {WordArray} iv The IV to use for this operation.
+     */
+    cfg: Base.extend(),
+
+    /**
+     * Creates this cipher in encryption mode.
+     *
+     * @param {WordArray} key The key.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @return {Cipher} A cipher instance.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+     */
+    createEncryptor: function (key, cfg) {
+      return this.create(this._ENC_XFORM_MODE, key, cfg);
+    },
+
+    /**
+     * Creates this cipher in decryption mode.
+     *
+     * @param {WordArray} key The key.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @return {Cipher} A cipher instance.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+     */
+    createDecryptor: function (key, cfg) {
+      return this.create(this._DEC_XFORM_MODE, key, cfg);
+    },
+
+    /**
+     * Initializes a newly created cipher.
+     *
+     * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+     * @param {WordArray} key The key.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @example
+     *
+     *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+     */
+    init: function (xformMode, key, cfg) {
+      // Apply config defaults
+      this.cfg = this.cfg.extend(cfg);
+
+      // Store transform mode and key
+      this._xformMode = xformMode;
+      this._key = key;
+
+      // Set initial values
+      this.reset();
+    },
+
+    /**
+     * Resets this cipher to its initial state.
+     *
+     * @example
+     *
+     *     cipher.reset();
+     */
+    reset: function () {
+      // Reset data buffer
+      BufferedBlockAlgorithm.reset.call(this);
+
+      // Perform concrete-cipher logic
+      this._doReset();
+    },
+
+    /**
+     * Adds data to be encrypted or decrypted.
+     *
+     * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+     *
+     * @return {WordArray} The data after processing.
+     *
+     * @example
+     *
+     *     var encrypted = cipher.process('data');
+     *     var encrypted = cipher.process(wordArray);
+     */
+    process: function (dataUpdate) {
+      // Append
+      this._append(dataUpdate);
+
+      // Process available blocks
+      return this._process();
+    },
+
+    /**
+     * Finalizes the encryption or decryption process.
+     * Note that the finalize operation is effectively a destructive, read-once operation.
+     *
+     * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+     *
+     * @return {WordArray} The data after final processing.
+     *
+     * @example
+     *
+     *     var encrypted = cipher.finalize();
+     *     var encrypted = cipher.finalize('data');
+     *     var encrypted = cipher.finalize(wordArray);
+     */
+    finalize: function (dataUpdate) {
+      // Final data update
+      if (dataUpdate) {
+        this._append(dataUpdate);
+      }
+
+      // Perform concrete-cipher logic
+      var finalProcessedData = this._doFinalize();
+
+      return finalProcessedData;
+    },
+
+    keySize: 128/32,
+
+    ivSize: 128/32,
+
+    _ENC_XFORM_MODE: 1,
+
+    _DEC_XFORM_MODE: 2,
+
+    /**
+     * Creates shortcut functions to a cipher's object interface.
+     *
+     * @param {Cipher} cipher The cipher to create a helper for.
+     *
+     * @return {Object} An object with encrypt and decrypt shortcut functions.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+     */
+    _createHelper: (function () {
+      function selectCipherStrategy(key) {
+        if (typeof key == 'string') {
+          return PasswordBasedCipher;
+        } else {
+          return SerializableCipher;
+        }
+      }
+
+      return function (cipher) {
+        return {
+          encrypt: function (message, key, cfg) {
+            return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+          },
+
+          decrypt: function (ciphertext, key, cfg) {
+            return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+          }
+        };
+      };
+    }())
+  });
+
+  /**
+   * Abstract base stream cipher template.
+   *
+   * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+   */
+  var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+    _doFinalize: function () {
+      // Process partial blocks
+      var finalProcessedBlocks = this._process(!!'flush');
+
+      return finalProcessedBlocks;
+    },
+
+    blockSize: 1
+  });
+
+  /**
+   * Mode namespace.
+   */
+  var C_mode = C.mode = {};
+
+  /**
+   * Abstract base block cipher mode template.
+   */
+  var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+    /**
+     * Creates this mode for encryption.
+     *
+     * @param {Cipher} cipher A block cipher instance.
+     * @param {Array} iv The IV words.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+     */
+    createEncryptor: function (cipher, iv) {
+      return this.Encryptor.create(cipher, iv);
+    },
+
+    /**
+     * Creates this mode for decryption.
+     *
+     * @param {Cipher} cipher A block cipher instance.
+     * @param {Array} iv The IV words.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+     */
+    createDecryptor: function (cipher, iv) {
+      return this.Decryptor.create(cipher, iv);
+    },
+
+    /**
+     * Initializes a newly created mode.
+     *
+     * @param {Cipher} cipher A block cipher instance.
+     * @param {Array} iv The IV words.
+     *
+     * @example
+     *
+     *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+     */
+    init: function (cipher, iv) {
+      this._cipher = cipher;
+      this._iv = iv;
+    }
+  });
+
+  /**
+   * Cipher Block Chaining mode.
+   */
+  var CBC = C_mode.CBC = (function () {
+    /**
+     * Abstract base CBC mode.
+     */
+    var CBC = BlockCipherMode.extend();
+
+    /**
+     * CBC encryptor.
+     */
+    CBC.Encryptor = CBC.extend({
+      /**
+       * Processes the data block at offset.
+       *
+       * @param {Array} words The data words to operate on.
+       * @param {number} offset The offset where the block starts.
+       *
+       * @example
+       *
+       *     mode.processBlock(data.words, offset);
+       */
+      processBlock: function (words, offset) {
+        // Shortcuts
+        var cipher = this._cipher;
+        var blockSize = cipher.blockSize;
+
+        // XOR and encrypt
+        xorBlock.call(this, words, offset, blockSize);
+        cipher.encryptBlock(words, offset);
+
+        // Remember this block to use with next block
+        this._prevBlock = words.slice(offset, offset + blockSize);
+      }
+    });
+
+    /**
+     * CBC decryptor.
+     */
+    CBC.Decryptor = CBC.extend({
+      /**
+       * Processes the data block at offset.
+       *
+       * @param {Array} words The data words to operate on.
+       * @param {number} offset The offset where the block starts.
+       *
+       * @example
+       *
+       *     mode.processBlock(data.words, offset);
+       */
+      processBlock: function (words, offset) {
+        // Shortcuts
+        var cipher = this._cipher;
+        var blockSize = cipher.blockSize;
+
+        // Remember this block to use with next block
+        var thisBlock = words.slice(offset, offset + blockSize);
+
+        // Decrypt and XOR
+        cipher.decryptBlock(words, offset);
+        xorBlock.call(this, words, offset, blockSize);
+
+        // This block becomes the previous block
+        this._prevBlock = thisBlock;
+      }
+    });
+
+    function xorBlock(words, offset, blockSize) {
+      // Shortcut
+      var iv = this._iv;
+
+      // Choose mixing block
+      if (iv) {
+        var block = iv;
+
+        // Remove IV for subsequent blocks
+        this._iv = undefined;
+      } else {
+        var block = this._prevBlock;
+      }
+
+      // XOR blocks
+      for (var i = 0; i < blockSize; i++) {
+        words[offset + i] ^= block[i];
+      }
+    }
+
+    return CBC;
+  }());
+
+  /**
+   * Padding namespace.
+   */
+  var C_pad = C.pad = {};
+
+  /**
+   * PKCS #5/7 padding strategy.
+   */
+  var Pkcs7 = C_pad.Pkcs7 = {
+    /**
+     * Pads data using the algorithm defined in PKCS #5/7.
+     *
+     * @param {WordArray} data The data to pad.
+     * @param {number} blockSize The multiple that the data should be padded to.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+     */
+    pad: function (data, blockSize) {
+      // Shortcut
+      var blockSizeBytes = blockSize * 4;
+
+      // Count padding bytes
+      var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+      // Create padding word
+      var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+      // Create padding
+      var paddingWords = [];
+      for (var i = 0; i < nPaddingBytes; i += 4) {
+        paddingWords.push(paddingWord);
+      }
+      var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+      // Add padding
+      data.concat(padding);
+    },
+
+    /**
+     * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+     *
+     * @param {WordArray} data The data to unpad.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     CryptoJS.pad.Pkcs7.unpad(wordArray);
+     */
+    unpad: function (data) {
+      // Get number of padding bytes from last byte
+      var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+      // Remove padding
+      data.sigBytes -= nPaddingBytes;
+    }
+  };
+
+  /**
+   * Abstract base block cipher template.
+   *
+   * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+   */
+  var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {Mode} mode The block mode to use. Default: CBC
+     * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+     */
+    cfg: Cipher.cfg.extend({
+      mode: CBC,
+      padding: Pkcs7
+    }),
+
+    reset: function () {
+      // Reset cipher
+      Cipher.reset.call(this);
+
+      // Shortcuts
+      var cfg = this.cfg;
+      var iv = cfg.iv;
+      var mode = cfg.mode;
+
+      // Reset block mode
+      if (this._xformMode == this._ENC_XFORM_MODE) {
+        var modeCreator = mode.createEncryptor;
+      } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+        var modeCreator = mode.createDecryptor;
+        // Keep at least one block in the buffer for unpadding
+        this._minBufferSize = 1;
+      }
+
+      if (this._mode && this._mode.__creator == modeCreator) {
+        this._mode.init(this, iv && iv.words);
+      } else {
+        this._mode = modeCreator.call(mode, this, iv && iv.words);
+        this._mode.__creator = modeCreator;
+      }
+    },
+
+    _doProcessBlock: function (words, offset) {
+      this._mode.processBlock(words, offset);
+    },
+
+    _doFinalize: function () {
+      // Shortcut
+      var padding = this.cfg.padding;
+
+      // Finalize
+      if (this._xformMode == this._ENC_XFORM_MODE) {
+        // Pad data
+        padding.pad(this._data, this.blockSize);
+
+        // Process final blocks
+        var finalProcessedBlocks = this._process(!!'flush');
+      } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+        // Process final blocks
+        var finalProcessedBlocks = this._process(!!'flush');
+
+        // Unpad data
+        padding.unpad(finalProcessedBlocks);
+      }
+
+      return finalProcessedBlocks;
+    },
+
+    blockSize: 128/32
+  });
+
+  /**
+   * A collection of cipher parameters.
+   *
+   * @property {WordArray} ciphertext The raw ciphertext.
+   * @property {WordArray} key The key to this ciphertext.
+   * @property {WordArray} iv The IV used in the ciphering operation.
+   * @property {WordArray} salt The salt used with a key derivation function.
+   * @property {Cipher} algorithm The cipher algorithm.
+   * @property {Mode} mode The block mode used in the ciphering operation.
+   * @property {Padding} padding The padding scheme used in the ciphering operation.
+   * @property {number} blockSize The block size of the cipher.
+   * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+   */
+  var CipherParams = C_lib.CipherParams = Base.extend({
+    /**
+     * Initializes a newly created cipher params object.
+     *
+     * @param {Object} cipherParams An object with any of the possible cipher parameters.
+     *
+     * @example
+     *
+     *     var cipherParams = CryptoJS.lib.CipherParams.create({
+	         *         ciphertext: ciphertextWordArray,
+	         *         key: keyWordArray,
+	         *         iv: ivWordArray,
+	         *         salt: saltWordArray,
+	         *         algorithm: CryptoJS.algo.AES,
+	         *         mode: CryptoJS.mode.CBC,
+	         *         padding: CryptoJS.pad.PKCS7,
+	         *         blockSize: 4,
+	         *         formatter: CryptoJS.format.OpenSSL
+	         *     });
+     */
+    init: function (cipherParams) {
+      this.mixIn(cipherParams);
+    },
+
+    /**
+     * Converts this cipher params object to a string.
+     *
+     * @param {Format} formatter (Optional) The formatting strategy to use.
+     *
+     * @return {string} The stringified cipher params.
+     *
+     * @throws Error If neither the formatter nor the default formatter is set.
+     *
+     * @example
+     *
+     *     var string = cipherParams + '';
+     *     var string = cipherParams.toString();
+     *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+     */
+    toString: function (formatter) {
+      return (formatter || this.formatter).stringify(this);
+    }
+  });
+
+  /**
+   * Format namespace.
+   */
+  var C_format = C.format = {};
+
+  /**
+   * OpenSSL formatting strategy.
+   */
+  var OpenSSLFormatter = C_format.OpenSSL = {
+    /**
+     * Converts a cipher params object to an OpenSSL-compatible string.
+     *
+     * @param {CipherParams} cipherParams The cipher params object.
+     *
+     * @return {string} The OpenSSL-compatible string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+     */
+    stringify: function (cipherParams) {
+      // Shortcuts
+      var ciphertext = cipherParams.ciphertext;
+      var salt = cipherParams.salt;
+
+      // Format
+      if (salt) {
+        var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+      } else {
+        var wordArray = ciphertext;
+      }
+
+      return wordArray.toString(Base64);
+    },
+
+    /**
+     * Converts an OpenSSL-compatible string to a cipher params object.
+     *
+     * @param {string} openSSLStr The OpenSSL-compatible string.
+     *
+     * @return {CipherParams} The cipher params object.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+     */
+    parse: function (openSSLStr) {
+      // Parse base64
+      var ciphertext = Base64.parse(openSSLStr);
+
+      // Shortcut
+      var ciphertextWords = ciphertext.words;
+
+      // Test for salt
+      if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+        // Extract salt
+        var salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+        // Remove salt from ciphertext
+        ciphertextWords.splice(0, 4);
+        ciphertext.sigBytes -= 16;
+      }
+
+      return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+    }
+  };
+
+  /**
+   * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+   */
+  var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+     */
+    cfg: Base.extend({
+      format: OpenSSLFormatter
+    }),
+
+    /**
+     * Encrypts a message.
+     *
+     * @param {Cipher} cipher The cipher algorithm to use.
+     * @param {WordArray|string} message The message to encrypt.
+     * @param {WordArray} key The key.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @return {CipherParams} A cipher params object.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+     *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+     *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+     */
+    encrypt: function (cipher, message, key, cfg) {
+      // Apply config defaults
+      cfg = this.cfg.extend(cfg);
+
+      // Encrypt
+      var encryptor = cipher.createEncryptor(key, cfg);
+      var ciphertext = encryptor.finalize(message);
+
+      // Shortcut
+      var cipherCfg = encryptor.cfg;
+
+      // Create and return serializable cipher params
+      return CipherParams.create({
+        ciphertext: ciphertext,
+        key: key,
+        iv: cipherCfg.iv,
+        algorithm: cipher,
+        mode: cipherCfg.mode,
+        padding: cipherCfg.padding,
+        blockSize: cipher.blockSize,
+        formatter: cfg.format
+      });
+    },
+
+    /**
+     * Decrypts serialized ciphertext.
+     *
+     * @param {Cipher} cipher The cipher algorithm to use.
+     * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+     * @param {WordArray} key The key.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @return {WordArray} The plaintext.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+     *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+     */
+    decrypt: function (cipher, ciphertext, key, cfg) {
+      // Apply config defaults
+      cfg = this.cfg.extend(cfg);
+
+      // Convert string to CipherParams
+      ciphertext = this._parse(ciphertext, cfg.format);
+
+      // Decrypt
+      var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+      return plaintext;
+    },
+
+    /**
+     * Converts serialized ciphertext to CipherParams,
+     * else assumed CipherParams already and returns ciphertext unchanged.
+     *
+     * @param {CipherParams|string} ciphertext The ciphertext.
+     * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+     *
+     * @return {CipherParams} The unserialized ciphertext.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+     */
+    _parse: function (ciphertext, format) {
+      if (typeof ciphertext == 'string') {
+        return format.parse(ciphertext, this);
+      } else {
+        return ciphertext;
+      }
+    }
+  });
+
+  /**
+   * Key derivation function namespace.
+   */
+  var C_kdf = C.kdf = {};
+
+  /**
+   * OpenSSL key derivation function.
+   */
+  var OpenSSLKdf = C_kdf.OpenSSL = {
+    /**
+     * Derives a key and IV from a password.
+     *
+     * @param {string} password The password to derive from.
+     * @param {number} keySize The size in words of the key to generate.
+     * @param {number} ivSize The size in words of the IV to generate.
+     * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+     *
+     * @return {CipherParams} A cipher params object with the key, IV, and salt.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+     *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+     */
+    execute: function (password, keySize, ivSize, salt) {
+      // Generate random salt
+      if (!salt) {
+        salt = WordArray.random(64/8);
+      }
+
+      // Derive key and IV
+      var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+
+      // Separate key and IV
+      var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+      key.sigBytes = keySize * 4;
+
+      // Return params
+      return CipherParams.create({ key: key, iv: iv, salt: salt });
+    }
+  };
+
+  /**
+   * A serializable cipher wrapper that derives the key from a password,
+   * and returns ciphertext as a serializable cipher params object.
+   */
+  var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+     */
+    cfg: SerializableCipher.cfg.extend({
+      kdf: OpenSSLKdf
+    }),
+
+    /**
+     * Encrypts a message using a password.
+     *
+     * @param {Cipher} cipher The cipher algorithm to use.
+     * @param {WordArray|string} message The message to encrypt.
+     * @param {string} password The password.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @return {CipherParams} A cipher params object.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+     *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+     */
+    encrypt: function (cipher, message, password, cfg) {
+      // Apply config defaults
+      cfg = this.cfg.extend(cfg);
+
+      // Derive key and other params
+      var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
+
+      // Add IV to config
+      cfg.iv = derivedParams.iv;
+
+      // Encrypt
+      var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+      // Mix in derived params
+      ciphertext.mixIn(derivedParams);
+
+      return ciphertext;
+    },
+
+    /**
+     * Decrypts serialized ciphertext using a password.
+     *
+     * @param {Cipher} cipher The cipher algorithm to use.
+     * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+     * @param {string} password The password.
+     * @param {Object} cfg (Optional) The configuration options to use for this operation.
+     *
+     * @return {WordArray} The plaintext.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+     *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+     */
+    decrypt: function (cipher, ciphertext, password, cfg) {
+      // Apply config defaults
+      cfg = this.cfg.extend(cfg);
+
+      // Convert string to CipherParams
+      ciphertext = this._parse(ciphertext, cfg.format);
+
+      // Derive key and other params
+      var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
+
+      // Add IV to config
+      cfg.iv = derivedParams.iv;
+
+      // Decrypt
+      var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+      return plaintext;
+    }
+  });
+}());
+
+
+/**
+ * Cipher Feedback block mode.
+ */
+CryptoJS.mode.CFB = (function () {
+  var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+  CFB.Encryptor = CFB.extend({
+    processBlock: function (words, offset) {
+      // Shortcuts
+      var cipher = this._cipher;
+      var blockSize = cipher.blockSize;
+
+      generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+      // Remember this block to use with next block
+      this._prevBlock = words.slice(offset, offset + blockSize);
+    }
+  });
+
+  CFB.Decryptor = CFB.extend({
+    processBlock: function (words, offset) {
+      // Shortcuts
+      var cipher = this._cipher;
+      var blockSize = cipher.blockSize;
+
+      // Remember this block to use with next block
+      var thisBlock = words.slice(offset, offset + blockSize);
+
+      generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+      // This block becomes the previous block
+      this._prevBlock = thisBlock;
+    }
+  });
+
+  function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+    // Shortcut
+    var iv = this._iv;
+
+    // Generate keystream
+    if (iv) {
+      var keystream = iv.slice(0);
+
+      // Remove IV for subsequent blocks
+      this._iv = undefined;
+    } else {
+      var keystream = this._prevBlock;
+    }
+    cipher.encryptBlock(keystream, 0);
+
+    // Encrypt
+    for (var i = 0; i < blockSize; i++) {
+      words[offset + i] ^= keystream[i];
+    }
+  }
+
+  return CFB;
+}());
+
+
+/**
+ * Electronic Codebook block mode.
+ */
+CryptoJS.mode.ECB = (function () {
+  var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+  ECB.Encryptor = ECB.extend({
+    processBlock: function (words, offset) {
+      this._cipher.encryptBlock(words, offset);
+    }
+  });
+
+  ECB.Decryptor = ECB.extend({
+    processBlock: function (words, offset) {
+      this._cipher.decryptBlock(words, offset);
+    }
+  });
+
+  return ECB;
+}());
+
+
+/**
+ * ANSI X.923 padding strategy.
+ */
+CryptoJS.pad.AnsiX923 = {
+  pad: function (data, blockSize) {
+    // Shortcuts
+    var dataSigBytes = data.sigBytes;
+    var blockSizeBytes = blockSize * 4;
+
+    // Count padding bytes
+    var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+    // Compute last byte position
+    var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+    // Pad
+    data.clamp();
+    data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+    data.sigBytes += nPaddingBytes;
+  },
+
+  unpad: function (data) {
+    // Get number of padding bytes from last byte
+    var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+    // Remove padding
+    data.sigBytes -= nPaddingBytes;
+  }
+};
+
+
+/**
+ * ISO 10126 padding strategy.
+ */
+CryptoJS.pad.Iso10126 = {
+  pad: function (data, blockSize) {
+    // Shortcut
+    var blockSizeBytes = blockSize * 4;
+
+    // Count padding bytes
+    var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+    // Pad
+    data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+    concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+  },
+
+  unpad: function (data) {
+    // Get number of padding bytes from last byte
+    var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+    // Remove padding
+    data.sigBytes -= nPaddingBytes;
+  }
+};
+
+
+/**
+ * ISO/IEC 9797-1 Padding Method 2.
+ */
+CryptoJS.pad.Iso97971 = {
+  pad: function (data, blockSize) {
+    // Add 0x80 byte
+    data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+    // Zero pad the rest
+    CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+  },
+
+  unpad: function (data) {
+    // Remove zero padding
+    CryptoJS.pad.ZeroPadding.unpad(data);
+
+    // Remove one more byte -- the 0x80 byte
+    data.sigBytes--;
+  }
+};
+
+
+/**
+ * Output Feedback block mode.
+ */
+CryptoJS.mode.OFB = (function () {
+  var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+  var Encryptor = OFB.Encryptor = OFB.extend({
+    processBlock: function (words, offset) {
+      // Shortcuts
+      var cipher = this._cipher
+      var blockSize = cipher.blockSize;
+      var iv = this._iv;
+      var keystream = this._keystream;
+
+      // Generate keystream
+      if (iv) {
+        keystream = this._keystream = iv.slice(0);
+
+        // Remove IV for subsequent blocks
+        this._iv = undefined;
+      }
+      cipher.encryptBlock(keystream, 0);
+
+      // Encrypt
+      for (var i = 0; i < blockSize; i++) {
+        words[offset + i] ^= keystream[i];
+      }
+    }
+  });
+
+  OFB.Decryptor = Encryptor;
+
+  return OFB;
+}());
+
+
+/**
+ * A noop padding strategy.
+ */
+CryptoJS.pad.NoPadding = {
+  pad: function () {
+  },
+
+  unpad: function () {
+  }
+};
+
+
+(function (undefined) {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var CipherParams = C_lib.CipherParams;
+  var C_enc = C.enc;
+  var Hex = C_enc.Hex;
+  var C_format = C.format;
+
+  var HexFormatter = C_format.Hex = {
+    /**
+     * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+     *
+     * @param {CipherParams} cipherParams The cipher params object.
+     *
+     * @return {string} The hexadecimally encoded string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+     */
+    stringify: function (cipherParams) {
+      return cipherParams.ciphertext.toString(Hex);
+    },
+
+    /**
+     * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+     *
+     * @param {string} input The hexadecimally encoded string.
+     *
+     * @return {CipherParams} The cipher params object.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
+     */
+    parse: function (input) {
+      var ciphertext = Hex.parse(input);
+      return CipherParams.create({ ciphertext: ciphertext });
+    }
+  };
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var BlockCipher = C_lib.BlockCipher;
+  var C_algo = C.algo;
+
+  // Lookup tables
+  var SBOX = [];
+  var INV_SBOX = [];
+  var SUB_MIX_0 = [];
+  var SUB_MIX_1 = [];
+  var SUB_MIX_2 = [];
+  var SUB_MIX_3 = [];
+  var INV_SUB_MIX_0 = [];
+  var INV_SUB_MIX_1 = [];
+  var INV_SUB_MIX_2 = [];
+  var INV_SUB_MIX_3 = [];
+
+  // Compute lookup tables
+  (function () {
+    // Compute double table
+    var d = [];
+    for (var i = 0; i < 256; i++) {
+      if (i < 128) {
+        d[i] = i << 1;
+      } else {
+        d[i] = (i << 1) ^ 0x11b;
+      }
+    }
+
+    // Walk GF(2^8)
+    var x = 0;
+    var xi = 0;
+    for (var i = 0; i < 256; i++) {
+      // Compute sbox
+      var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+      sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+      SBOX[x] = sx;
+      INV_SBOX[sx] = x;
+
+      // Compute multiplication
+      var x2 = d[x];
+      var x4 = d[x2];
+      var x8 = d[x4];
+
+      // Compute sub bytes, mix columns tables
+      var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+      SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+      SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+      SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
+      SUB_MIX_3[x] = t;
+
+      // Compute inv sub bytes, inv mix columns tables
+      var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+      INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+      INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+      INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
+      INV_SUB_MIX_3[sx] = t;
+
+      // Compute next counter
+      if (!x) {
+        x = xi = 1;
+      } else {
+        x = x2 ^ d[d[d[x8 ^ x2]]];
+        xi ^= d[d[xi]];
+      }
+    }
+  }());
+
+  // Precomputed Rcon lookup
+  var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+  /**
+   * AES block cipher algorithm.
+   */
+  var AES = C_algo.AES = BlockCipher.extend({
+    _doReset: function () {
+      // Skip reset of nRounds has been set before and key did not change
+      if (this._nRounds && this._keyPriorReset === this._key) {
+        return;
+      }
+
+      // Shortcuts
+      var key = this._keyPriorReset = this._key;
+      var keyWords = key.words;
+      var keySize = key.sigBytes / 4;
+
+      // Compute number of rounds
+      var nRounds = this._nRounds = keySize + 6;
+
+      // Compute number of key schedule rows
+      var ksRows = (nRounds + 1) * 4;
+
+      // Compute key schedule
+      var keySchedule = this._keySchedule = [];
+      for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+        if (ksRow < keySize) {
+          keySchedule[ksRow] = keyWords[ksRow];
+        } else {
+          var t = keySchedule[ksRow - 1];
+
+          if (!(ksRow % keySize)) {
+            // Rot word
+            t = (t << 8) | (t >>> 24);
+
+            // Sub word
+            t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+            // Mix Rcon
+            t ^= RCON[(ksRow / keySize) | 0] << 24;
+          } else if (keySize > 6 && ksRow % keySize == 4) {
+            // Sub word
+            t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+          }
+
+          keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+        }
+      }
+
+      // Compute inv key schedule
+      var invKeySchedule = this._invKeySchedule = [];
+      for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+        var ksRow = ksRows - invKsRow;
+
+        if (invKsRow % 4) {
+          var t = keySchedule[ksRow];
+        } else {
+          var t = keySchedule[ksRow - 4];
+        }
+
+        if (invKsRow < 4 || ksRow <= 4) {
+          invKeySchedule[invKsRow] = t;
+        } else {
+          invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+            INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+        }
+      }
+    },
+
+    encryptBlock: function (M, offset) {
+      this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+    },
+
+    decryptBlock: function (M, offset) {
+      // Swap 2nd and 4th rows
+      var t = M[offset + 1];
+      M[offset + 1] = M[offset + 3];
+      M[offset + 3] = t;
+
+      this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+      // Inv swap 2nd and 4th rows
+      var t = M[offset + 1];
+      M[offset + 1] = M[offset + 3];
+      M[offset + 3] = t;
+    },
+
+    _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+      // Shortcut
+      var nRounds = this._nRounds;
+
+      // Get input, add round key
+      var s0 = M[offset]     ^ keySchedule[0];
+      var s1 = M[offset + 1] ^ keySchedule[1];
+      var s2 = M[offset + 2] ^ keySchedule[2];
+      var s3 = M[offset + 3] ^ keySchedule[3];
+
+      // Key schedule row counter
+      var ksRow = 4;
+
+      // Rounds
+      for (var round = 1; round < nRounds; round++) {
+        // Shift rows, sub bytes, mix columns, add round key
+        var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+        var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+        var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+        var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+        // Update state
+        s0 = t0;
+        s1 = t1;
+        s2 = t2;
+        s3 = t3;
+      }
+
+      // Shift rows, sub bytes, add round key
+      var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+      var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+      var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+      var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+      // Set output
+      M[offset]     = t0;
+      M[offset + 1] = t1;
+      M[offset + 2] = t2;
+      M[offset + 3] = t3;
+    },
+
+    keySize: 256/32
+  });
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+   */
+  C.AES = BlockCipher._createHelper(AES);
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var WordArray = C_lib.WordArray;
+  var BlockCipher = C_lib.BlockCipher;
+  var C_algo = C.algo;
+
+  // Permuted Choice 1 constants
+  var PC1 = [
+    57, 49, 41, 33, 25, 17, 9,  1,
+    58, 50, 42, 34, 26, 18, 10, 2,
+    59, 51, 43, 35, 27, 19, 11, 3,
+    60, 52, 44, 36, 63, 55, 47, 39,
+    31, 23, 15, 7,  62, 54, 46, 38,
+    30, 22, 14, 6,  61, 53, 45, 37,
+    29, 21, 13, 5,  28, 20, 12, 4
+  ];
+
+  // Permuted Choice 2 constants
+  var PC2 = [
+    14, 17, 11, 24, 1,  5,
+    3,  28, 15, 6,  21, 10,
+    23, 19, 12, 4,  26, 8,
+    16, 7,  27, 20, 13, 2,
+    41, 52, 31, 37, 47, 55,
+    30, 40, 51, 45, 33, 48,
+    44, 49, 39, 56, 34, 53,
+    46, 42, 50, 36, 29, 32
+  ];
+
+  // Cumulative bit shift constants
+  var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+  // SBOXes and round permutation constants
+  var SBOX_P = [
+    {
+      0x0: 0x808200,
+      0x10000000: 0x8000,
+      0x20000000: 0x808002,
+      0x30000000: 0x2,
+      0x40000000: 0x200,
+      0x50000000: 0x808202,
+      0x60000000: 0x800202,
+      0x70000000: 0x800000,
+      0x80000000: 0x202,
+      0x90000000: 0x800200,
+      0xa0000000: 0x8200,
+      0xb0000000: 0x808000,
+      0xc0000000: 0x8002,
+      0xd0000000: 0x800002,
+      0xe0000000: 0x0,
+      0xf0000000: 0x8202,
+      0x8000000: 0x0,
+      0x18000000: 0x808202,
+      0x28000000: 0x8202,
+      0x38000000: 0x8000,
+      0x48000000: 0x808200,
+      0x58000000: 0x200,
+      0x68000000: 0x808002,
+      0x78000000: 0x2,
+      0x88000000: 0x800200,
+      0x98000000: 0x8200,
+      0xa8000000: 0x808000,
+      0xb8000000: 0x800202,
+      0xc8000000: 0x800002,
+      0xd8000000: 0x8002,
+      0xe8000000: 0x202,
+      0xf8000000: 0x800000,
+      0x1: 0x8000,
+      0x10000001: 0x2,
+      0x20000001: 0x808200,
+      0x30000001: 0x800000,
+      0x40000001: 0x808002,
+      0x50000001: 0x8200,
+      0x60000001: 0x200,
+      0x70000001: 0x800202,
+      0x80000001: 0x808202,
+      0x90000001: 0x808000,
+      0xa0000001: 0x800002,
+      0xb0000001: 0x8202,
+      0xc0000001: 0x202,
+      0xd0000001: 0x800200,
+      0xe0000001: 0x8002,
+      0xf0000001: 0x0,
+      0x8000001: 0x808202,
+      0x18000001: 0x808000,
+      0x28000001: 0x800000,
+      0x38000001: 0x200,
+      0x48000001: 0x8000,
+      0x58000001: 0x800002,
+      0x68000001: 0x2,
+      0x78000001: 0x8202,
+      0x88000001: 0x8002,
+      0x98000001: 0x800202,
+      0xa8000001: 0x202,
+      0xb8000001: 0x808200,
+      0xc8000001: 0x800200,
+      0xd8000001: 0x0,
+      0xe8000001: 0x8200,
+      0xf8000001: 0x808002
+    },
+    {
+      0x0: 0x40084010,
+      0x1000000: 0x4000,
+      0x2000000: 0x80000,
+      0x3000000: 0x40080010,
+      0x4000000: 0x40000010,
+      0x5000000: 0x40084000,
+      0x6000000: 0x40004000,
+      0x7000000: 0x10,
+      0x8000000: 0x84000,
+      0x9000000: 0x40004010,
+      0xa000000: 0x40000000,
+      0xb000000: 0x84010,
+      0xc000000: 0x80010,
+      0xd000000: 0x0,
+      0xe000000: 0x4010,
+      0xf000000: 0x40080000,
+      0x800000: 0x40004000,
+      0x1800000: 0x84010,
+      0x2800000: 0x10,
+      0x3800000: 0x40004010,
+      0x4800000: 0x40084010,
+      0x5800000: 0x40000000,
+      0x6800000: 0x80000,
+      0x7800000: 0x40080010,
+      0x8800000: 0x80010,
+      0x9800000: 0x0,
+      0xa800000: 0x4000,
+      0xb800000: 0x40080000,
+      0xc800000: 0x40000010,
+      0xd800000: 0x84000,
+      0xe800000: 0x40084000,
+      0xf800000: 0x4010,
+      0x10000000: 0x0,
+      0x11000000: 0x40080010,
+      0x12000000: 0x40004010,
+      0x13000000: 0x40084000,
+      0x14000000: 0x40080000,
+      0x15000000: 0x10,
+      0x16000000: 0x84010,
+      0x17000000: 0x4000,
+      0x18000000: 0x4010,
+      0x19000000: 0x80000,
+      0x1a000000: 0x80010,
+      0x1b000000: 0x40000010,
+      0x1c000000: 0x84000,
+      0x1d000000: 0x40004000,
+      0x1e000000: 0x40000000,
+      0x1f000000: 0x40084010,
+      0x10800000: 0x84010,
+      0x11800000: 0x80000,
+      0x12800000: 0x40080000,
+      0x13800000: 0x4000,
+      0x14800000: 0x40004000,
+      0x15800000: 0x40084010,
+      0x16800000: 0x10,
+      0x17800000: 0x40000000,
+      0x18800000: 0x40084000,
+      0x19800000: 0x40000010,
+      0x1a800000: 0x40004010,
+      0x1b800000: 0x80010,
+      0x1c800000: 0x0,
+      0x1d800000: 0x4010,
+      0x1e800000: 0x40080010,
+      0x1f800000: 0x84000
+    },
+    {
+      0x0: 0x104,
+      0x100000: 0x0,
+      0x200000: 0x4000100,
+      0x300000: 0x10104,
+      0x400000: 0x10004,
+      0x500000: 0x4000004,
+      0x600000: 0x4010104,
+      0x700000: 0x4010000,
+      0x800000: 0x4000000,
+      0x900000: 0x4010100,
+      0xa00000: 0x10100,
+      0xb00000: 0x4010004,
+      0xc00000: 0x4000104,
+      0xd00000: 0x10000,
+      0xe00000: 0x4,
+      0xf00000: 0x100,
+      0x80000: 0x4010100,
+      0x180000: 0x4010004,
+      0x280000: 0x0,
+      0x380000: 0x4000100,
+      0x480000: 0x4000004,
+      0x580000: 0x10000,
+      0x680000: 0x10004,
+      0x780000: 0x104,
+      0x880000: 0x4,
+      0x980000: 0x100,
+      0xa80000: 0x4010000,
+      0xb80000: 0x10104,
+      0xc80000: 0x10100,
+      0xd80000: 0x4000104,
+      0xe80000: 0x4010104,
+      0xf80000: 0x4000000,
+      0x1000000: 0x4010100,
+      0x1100000: 0x10004,
+      0x1200000: 0x10000,
+      0x1300000: 0x4000100,
+      0x1400000: 0x100,
+      0x1500000: 0x4010104,
+      0x1600000: 0x4000004,
+      0x1700000: 0x0,
+      0x1800000: 0x4000104,
+      0x1900000: 0x4000000,
+      0x1a00000: 0x4,
+      0x1b00000: 0x10100,
+      0x1c00000: 0x4010000,
+      0x1d00000: 0x104,
+      0x1e00000: 0x10104,
+      0x1f00000: 0x4010004,
+      0x1080000: 0x4000000,
+      0x1180000: 0x104,
+      0x1280000: 0x4010100,
+      0x1380000: 0x0,
+      0x1480000: 0x10004,
+      0x1580000: 0x4000100,
+      0x1680000: 0x100,
+      0x1780000: 0x4010004,
+      0x1880000: 0x10000,
+      0x1980000: 0x4010104,
+      0x1a80000: 0x10104,
+      0x1b80000: 0x4000004,
+      0x1c80000: 0x4000104,
+      0x1d80000: 0x4010000,
+      0x1e80000: 0x4,
+      0x1f80000: 0x10100
+    },
+    {
+      0x0: 0x80401000,
+      0x10000: 0x80001040,
+      0x20000: 0x401040,
+      0x30000: 0x80400000,
+      0x40000: 0x0,
+      0x50000: 0x401000,
+      0x60000: 0x80000040,
+      0x70000: 0x400040,
+      0x80000: 0x80000000,
+      0x90000: 0x400000,
+      0xa0000: 0x40,
+      0xb0000: 0x80001000,
+      0xc0000: 0x80400040,
+      0xd0000: 0x1040,
+      0xe0000: 0x1000,
+      0xf0000: 0x80401040,
+      0x8000: 0x80001040,
+      0x18000: 0x40,
+      0x28000: 0x80400040,
+      0x38000: 0x80001000,
+      0x48000: 0x401000,
+      0x58000: 0x80401040,
+      0x68000: 0x0,
+      0x78000: 0x80400000,
+      0x88000: 0x1000,
+      0x98000: 0x80401000,
+      0xa8000: 0x400000,
+      0xb8000: 0x1040,
+      0xc8000: 0x80000000,
+      0xd8000: 0x400040,
+      0xe8000: 0x401040,
+      0xf8000: 0x80000040,
+      0x100000: 0x400040,
+      0x110000: 0x401000,
+      0x120000: 0x80000040,
+      0x130000: 0x0,
+      0x140000: 0x1040,
+      0x150000: 0x80400040,
+      0x160000: 0x80401000,
+      0x170000: 0x80001040,
+      0x180000: 0x80401040,
+      0x190000: 0x80000000,
+      0x1a0000: 0x80400000,
+      0x1b0000: 0x401040,
+      0x1c0000: 0x80001000,
+      0x1d0000: 0x400000,
+      0x1e0000: 0x40,
+      0x1f0000: 0x1000,
+      0x108000: 0x80400000,
+      0x118000: 0x80401040,
+      0x128000: 0x0,
+      0x138000: 0x401000,
+      0x148000: 0x400040,
+      0x158000: 0x80000000,
+      0x168000: 0x80001040,
+      0x178000: 0x40,
+      0x188000: 0x80000040,
+      0x198000: 0x1000,
+      0x1a8000: 0x80001000,
+      0x1b8000: 0x80400040,
+      0x1c8000: 0x1040,
+      0x1d8000: 0x80401000,
+      0x1e8000: 0x400000,
+      0x1f8000: 0x401040
+    },
+    {
+      0x0: 0x80,
+      0x1000: 0x1040000,
+      0x2000: 0x40000,
+      0x3000: 0x20000000,
+      0x4000: 0x20040080,
+      0x5000: 0x1000080,
+      0x6000: 0x21000080,
+      0x7000: 0x40080,
+      0x8000: 0x1000000,
+      0x9000: 0x20040000,
+      0xa000: 0x20000080,
+      0xb000: 0x21040080,
+      0xc000: 0x21040000,
+      0xd000: 0x0,
+      0xe000: 0x1040080,
+      0xf000: 0x21000000,
+      0x800: 0x1040080,
+      0x1800: 0x21000080,
+      0x2800: 0x80,
+      0x3800: 0x1040000,
+      0x4800: 0x40000,
+      0x5800: 0x20040080,
+      0x6800: 0x21040000,
+      0x7800: 0x20000000,
+      0x8800: 0x20040000,
+      0x9800: 0x0,
+      0xa800: 0x21040080,
+      0xb800: 0x1000080,
+      0xc800: 0x20000080,
+      0xd800: 0x21000000,
+      0xe800: 0x1000000,
+      0xf800: 0x40080,
+      0x10000: 0x40000,
+      0x11000: 0x80,
+      0x12000: 0x20000000,
+      0x13000: 0x21000080,
+      0x14000: 0x1000080,
+      0x15000: 0x21040000,
+      0x16000: 0x20040080,
+      0x17000: 0x1000000,
+      0x18000: 0x21040080,
+      0x19000: 0x21000000,
+      0x1a000: 0x1040000,
+      0x1b000: 0x20040000,
+      0x1c000: 0x40080,
+      0x1d000: 0x20000080,
+      0x1e000: 0x0,
+      0x1f000: 0x1040080,
+      0x10800: 0x21000080,
+      0x11800: 0x1000000,
+      0x12800: 0x1040000,
+      0x13800: 0x20040080,
+      0x14800: 0x20000000,
+      0x15800: 0x1040080,
+      0x16800: 0x80,
+      0x17800: 0x21040000,
+      0x18800: 0x40080,
+      0x19800: 0x21040080,
+      0x1a800: 0x0,
+      0x1b800: 0x21000000,
+      0x1c800: 0x1000080,
+      0x1d800: 0x40000,
+      0x1e800: 0x20040000,
+      0x1f800: 0x20000080
+    },
+    {
+      0x0: 0x10000008,
+      0x100: 0x2000,
+      0x200: 0x10200000,
+      0x300: 0x10202008,
+      0x400: 0x10002000,
+      0x500: 0x200000,
+      0x600: 0x200008,
+      0x700: 0x10000000,
+      0x800: 0x0,
+      0x900: 0x10002008,
+      0xa00: 0x202000,
+      0xb00: 0x8,
+      0xc00: 0x10200008,
+      0xd00: 0x202008,
+      0xe00: 0x2008,
+      0xf00: 0x10202000,
+      0x80: 0x10200000,
+      0x180: 0x10202008,
+      0x280: 0x8,
+      0x380: 0x200000,
+      0x480: 0x202008,
+      0x580: 0x10000008,
+      0x680: 0x10002000,
+      0x780: 0x2008,
+      0x880: 0x200008,
+      0x980: 0x2000,
+      0xa80: 0x10002008,
+      0xb80: 0x10200008,
+      0xc80: 0x0,
+      0xd80: 0x10202000,
+      0xe80: 0x202000,
+      0xf80: 0x10000000,
+      0x1000: 0x10002000,
+      0x1100: 0x10200008,
+      0x1200: 0x10202008,
+      0x1300: 0x2008,
+      0x1400: 0x200000,
+      0x1500: 0x10000000,
+      0x1600: 0x10000008,
+      0x1700: 0x202000,
+      0x1800: 0x202008,
+      0x1900: 0x0,
+      0x1a00: 0x8,
+      0x1b00: 0x10200000,
+      0x1c00: 0x2000,
+      0x1d00: 0x10002008,
+      0x1e00: 0x10202000,
+      0x1f00: 0x200008,
+      0x1080: 0x8,
+      0x1180: 0x202000,
+      0x1280: 0x200000,
+      0x1380: 0x10000008,
+      0x1480: 0x10002000,
+      0x1580: 0x2008,
+      0x1680: 0x10202008,
+      0x1780: 0x10200000,
+      0x1880: 0x10202000,
+      0x1980: 0x10200008,
+      0x1a80: 0x2000,
+      0x1b80: 0x202008,
+      0x1c80: 0x200008,
+      0x1d80: 0x0,
+      0x1e80: 0x10000000,
+      0x1f80: 0x10002008
+    },
+    {
+      0x0: 0x100000,
+      0x10: 0x2000401,
+      0x20: 0x400,
+      0x30: 0x100401,
+      0x40: 0x2100401,
+      0x50: 0x0,
+      0x60: 0x1,
+      0x70: 0x2100001,
+      0x80: 0x2000400,
+      0x90: 0x100001,
+      0xa0: 0x2000001,
+      0xb0: 0x2100400,
+      0xc0: 0x2100000,
+      0xd0: 0x401,
+      0xe0: 0x100400,
+      0xf0: 0x2000000,
+      0x8: 0x2100001,
+      0x18: 0x0,
+      0x28: 0x2000401,
+      0x38: 0x2100400,
+      0x48: 0x100000,
+      0x58: 0x2000001,
+      0x68: 0x2000000,
+      0x78: 0x401,
+      0x88: 0x100401,
+      0x98: 0x2000400,
+      0xa8: 0x2100000,
+      0xb8: 0x100001,
+      0xc8: 0x400,
+      0xd8: 0x2100401,
+      0xe8: 0x1,
+      0xf8: 0x100400,
+      0x100: 0x2000000,
+      0x110: 0x100000,
+      0x120: 0x2000401,
+      0x130: 0x2100001,
+      0x140: 0x100001,
+      0x150: 0x2000400,
+      0x160: 0x2100400,
+      0x170: 0x100401,
+      0x180: 0x401,
+      0x190: 0x2100401,
+      0x1a0: 0x100400,
+      0x1b0: 0x1,
+      0x1c0: 0x0,
+      0x1d0: 0x2100000,
+      0x1e0: 0x2000001,
+      0x1f0: 0x400,
+      0x108: 0x100400,
+      0x118: 0x2000401,
+      0x128: 0x2100001,
+      0x138: 0x1,
+      0x148: 0x2000000,
+      0x158: 0x100000,
+      0x168: 0x401,
+      0x178: 0x2100400,
+      0x188: 0x2000001,
+      0x198: 0x2100000,
+      0x1a8: 0x0,
+      0x1b8: 0x2100401,
+      0x1c8: 0x100401,
+      0x1d8: 0x400,
+      0x1e8: 0x2000400,
+      0x1f8: 0x100001
+    },
+    {
+      0x0: 0x8000820,
+      0x1: 0x20000,
+      0x2: 0x8000000,
+      0x3: 0x20,
+      0x4: 0x20020,
+      0x5: 0x8020820,
+      0x6: 0x8020800,
+      0x7: 0x800,
+      0x8: 0x8020000,
+      0x9: 0x8000800,
+      0xa: 0x20800,
+      0xb: 0x8020020,
+      0xc: 0x820,
+      0xd: 0x0,
+      0xe: 0x8000020,
+      0xf: 0x20820,
+      0x80000000: 0x800,
+      0x80000001: 0x8020820,
+      0x80000002: 0x8000820,
+      0x80000003: 0x8000000,
+      0x80000004: 0x8020000,
+      0x80000005: 0x20800,
+      0x80000006: 0x20820,
+      0x80000007: 0x20,
+      0x80000008: 0x8000020,
+      0x80000009: 0x820,
+      0x8000000a: 0x20020,
+      0x8000000b: 0x8020800,
+      0x8000000c: 0x0,
+      0x8000000d: 0x8020020,
+      0x8000000e: 0x8000800,
+      0x8000000f: 0x20000,
+      0x10: 0x20820,
+      0x11: 0x8020800,
+      0x12: 0x20,
+      0x13: 0x800,
+      0x14: 0x8000800,
+      0x15: 0x8000020,
+      0x16: 0x8020020,
+      0x17: 0x20000,
+      0x18: 0x0,
+      0x19: 0x20020,
+      0x1a: 0x8020000,
+      0x1b: 0x8000820,
+      0x1c: 0x8020820,
+      0x1d: 0x20800,
+      0x1e: 0x820,
+      0x1f: 0x8000000,
+      0x80000010: 0x20000,
+      0x80000011: 0x800,
+      0x80000012: 0x8020020,
+      0x80000013: 0x20820,
+      0x80000014: 0x20,
+      0x80000015: 0x8020000,
+      0x80000016: 0x8000000,
+      0x80000017: 0x8000820,
+      0x80000018: 0x8020820,
+      0x80000019: 0x8000020,
+      0x8000001a: 0x8000800,
+      0x8000001b: 0x0,
+      0x8000001c: 0x20800,
+      0x8000001d: 0x820,
+      0x8000001e: 0x20020,
+      0x8000001f: 0x8020800
+    }
+  ];
+
+  // Masks that select the SBOX input
+  var SBOX_MASK = [
+    0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+    0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+  ];
+
+  /**
+   * DES block cipher algorithm.
+   */
+  var DES = C_algo.DES = BlockCipher.extend({
+    _doReset: function () {
+      // Shortcuts
+      var key = this._key;
+      var keyWords = key.words;
+
+      // Select 56 bits according to PC1
+      var keyBits = [];
+      for (var i = 0; i < 56; i++) {
+        var keyBitPos = PC1[i] - 1;
+        keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+      }
+
+      // Assemble 16 subkeys
+      var subKeys = this._subKeys = [];
+      for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+        // Create subkey
+        var subKey = subKeys[nSubKey] = [];
+
+        // Shortcut
+        var bitShift = BIT_SHIFTS[nSubKey];
+
+        // Select 48 bits according to PC2
+        for (var i = 0; i < 24; i++) {
+          // Select from the left 28 key bits
+          subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+          // Select from the right 28 key bits
+          subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+        }
+
+        // Since each subkey is applied to an expanded 32-bit input,
+        // the subkey can be broken into 8 values scaled to 32-bits,
+        // which allows the key to be used without expansion
+        subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+        for (var i = 1; i < 7; i++) {
+          subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+        }
+        subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+      }
+
+      // Compute inverse subkeys
+      var invSubKeys = this._invSubKeys = [];
+      for (var i = 0; i < 16; i++) {
+        invSubKeys[i] = subKeys[15 - i];
+      }
+    },
+
+    encryptBlock: function (M, offset) {
+      this._doCryptBlock(M, offset, this._subKeys);
+    },
+
+    decryptBlock: function (M, offset) {
+      this._doCryptBlock(M, offset, this._invSubKeys);
+    },
+
+    _doCryptBlock: function (M, offset, subKeys) {
+      // Get input
+      this._lBlock = M[offset];
+      this._rBlock = M[offset + 1];
+
+      // Initial permutation
+      exchangeLR.call(this, 4,  0x0f0f0f0f);
+      exchangeLR.call(this, 16, 0x0000ffff);
+      exchangeRL.call(this, 2,  0x33333333);
+      exchangeRL.call(this, 8,  0x00ff00ff);
+      exchangeLR.call(this, 1,  0x55555555);
+
+      // Rounds
+      for (var round = 0; round < 16; round++) {
+        // Shortcuts
+        var subKey = subKeys[round];
+        var lBlock = this._lBlock;
+        var rBlock = this._rBlock;
+
+        // Feistel function
+        var f = 0;
+        for (var i = 0; i < 8; i++) {
+          f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+        }
+        this._lBlock = rBlock;
+        this._rBlock = lBlock ^ f;
+      }
+
+      // Undo swap from last round
+      var t = this._lBlock;
+      this._lBlock = this._rBlock;
+      this._rBlock = t;
+
+      // Final permutation
+      exchangeLR.call(this, 1,  0x55555555);
+      exchangeRL.call(this, 8,  0x00ff00ff);
+      exchangeRL.call(this, 2,  0x33333333);
+      exchangeLR.call(this, 16, 0x0000ffff);
+      exchangeLR.call(this, 4,  0x0f0f0f0f);
+
+      // Set output
+      M[offset] = this._lBlock;
+      M[offset + 1] = this._rBlock;
+    },
+
+    keySize: 64/32,
+
+    ivSize: 64/32,
+
+    blockSize: 64/32
+  });
+
+  // Swap bits across the left and right words
+  function exchangeLR(offset, mask) {
+    var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+    this._rBlock ^= t;
+    this._lBlock ^= t << offset;
+  }
+
+  function exchangeRL(offset, mask) {
+    var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+    this._lBlock ^= t;
+    this._rBlock ^= t << offset;
+  }
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+   */
+  C.DES = BlockCipher._createHelper(DES);
+
+  /**
+   * Triple-DES block cipher algorithm.
+   */
+  var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+    _doReset: function () {
+      // Shortcuts
+      var key = this._key;
+      var keyWords = key.words;
+
+      // Create DES instances
+      this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
+      this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
+      this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
+    },
+
+    encryptBlock: function (M, offset) {
+      this._des1.encryptBlock(M, offset);
+      this._des2.decryptBlock(M, offset);
+      this._des3.encryptBlock(M, offset);
+    },
+
+    decryptBlock: function (M, offset) {
+      this._des3.decryptBlock(M, offset);
+      this._des2.encryptBlock(M, offset);
+      this._des1.decryptBlock(M, offset);
+    },
+
+    keySize: 192/32,
+
+    ivSize: 64/32,
+
+    blockSize: 64/32
+  });
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+   */
+  C.TripleDES = BlockCipher._createHelper(TripleDES);
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var StreamCipher = C_lib.StreamCipher;
+  var C_algo = C.algo;
+
+  /**
+   * RC4 stream cipher algorithm.
+   */
+  var RC4 = C_algo.RC4 = StreamCipher.extend({
+    _doReset: function () {
+      // Shortcuts
+      var key = this._key;
+      var keyWords = key.words;
+      var keySigBytes = key.sigBytes;
+
+      // Init sbox
+      var S = this._S = [];
+      for (var i = 0; i < 256; i++) {
+        S[i] = i;
+      }
+
+      // Key setup
+      for (var i = 0, j = 0; i < 256; i++) {
+        var keyByteIndex = i % keySigBytes;
+        var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+        j = (j + S[i] + keyByte) % 256;
+
+        // Swap
+        var t = S[i];
+        S[i] = S[j];
+        S[j] = t;
+      }
+
+      // Counters
+      this._i = this._j = 0;
+    },
+
+    _doProcessBlock: function (M, offset) {
+      M[offset] ^= generateKeystreamWord.call(this);
+    },
+
+    keySize: 256/32,
+
+    ivSize: 0
+  });
+
+  function generateKeystreamWord() {
+    // Shortcuts
+    var S = this._S;
+    var i = this._i;
+    var j = this._j;
+
+    // Generate keystream word
+    var keystreamWord = 0;
+    for (var n = 0; n < 4; n++) {
+      i = (i + 1) % 256;
+      j = (j + S[i]) % 256;
+
+      // Swap
+      var t = S[i];
+      S[i] = S[j];
+      S[j] = t;
+
+      keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+    }
+
+    // Update counters
+    this._i = i;
+    this._j = j;
+
+    return keystreamWord;
+  }
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+   */
+  C.RC4 = StreamCipher._createHelper(RC4);
+
+  /**
+   * Modified RC4 stream cipher algorithm.
+   */
+  var RC4Drop = C_algo.RC4Drop = RC4.extend({
+    /**
+     * Configuration options.
+     *
+     * @property {number} drop The number of keystream words to drop. Default 192
+     */
+    cfg: RC4.cfg.extend({
+      drop: 192
+    }),
+
+    _doReset: function () {
+      RC4._doReset.call(this);
+
+      // Drop
+      for (var i = this.cfg.drop; i > 0; i--) {
+        generateKeystreamWord.call(this);
+      }
+    }
+  });
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+   */
+  C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+}());
+
+
+/** @preserve
+ * Counter block mode compatible with  Dr Brian Gladman fileenc.c
+ * derived from CryptoJS.mode.CTR
+ * Jan Hruby jhruby.web@gmail.com
+ */
+CryptoJS.mode.CTRGladman = (function () {
+  var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+  function incWord(word)
+  {
+    if (((word >> 24) & 0xff) === 0xff) { //overflow
+      var b1 = (word >> 16)&0xff;
+      var b2 = (word >> 8)&0xff;
+      var b3 = word & 0xff;
+
+      if (b1 === 0xff) // overflow b1
+      {
+        b1 = 0;
+        if (b2 === 0xff)
+        {
+          b2 = 0;
+          if (b3 === 0xff)
+          {
+            b3 = 0;
+          }
+          else
+          {
+            ++b3;
+          }
+        }
+        else
+        {
+          ++b2;
+        }
+      }
+      else
+      {
+        ++b1;
+      }
+
+      word = 0;
+      word += (b1 << 16);
+      word += (b2 << 8);
+      word += b3;
+    }
+    else
+    {
+      word += (0x01 << 24);
+    }
+    return word;
+  }
+
+  function incCounter(counter)
+  {
+    if ((counter[0] = incWord(counter[0])) === 0)
+    {
+      // encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
+      counter[1] = incWord(counter[1]);
+    }
+    return counter;
+  }
+
+  var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+    processBlock: function (words, offset) {
+      // Shortcuts
+      var cipher = this._cipher
+      var blockSize = cipher.blockSize;
+      var iv = this._iv;
+      var counter = this._counter;
+
+      // Generate keystream
+      if (iv) {
+        counter = this._counter = iv.slice(0);
+
+        // Remove IV for subsequent blocks
+        this._iv = undefined;
+      }
+
+      incCounter(counter);
+
+      var keystream = counter.slice(0);
+      cipher.encryptBlock(keystream, 0);
+
+      // Encrypt
+      for (var i = 0; i < blockSize; i++) {
+        words[offset + i] ^= keystream[i];
+      }
+    }
+  });
+
+  CTRGladman.Decryptor = Encryptor;
+
+  return CTRGladman;
+}());
+
+
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var StreamCipher = C_lib.StreamCipher;
+  var C_algo = C.algo;
+
+  // Reusable objects
+  var S  = [];
+  var C_ = [];
+  var G  = [];
+
+  /**
+   * Rabbit stream cipher algorithm
+   */
+  var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+    _doReset: function () {
+      // Shortcuts
+      var K = this._key.words;
+      var iv = this.cfg.iv;
+
+      // Swap endian
+      for (var i = 0; i < 4; i++) {
+        K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
+          (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
+      }
+
+      // Generate initial state values
+      var X = this._X = [
+        K[0], (K[3] << 16) | (K[2] >>> 16),
+        K[1], (K[0] << 16) | (K[3] >>> 16),
+        K[2], (K[1] << 16) | (K[0] >>> 16),
+        K[3], (K[2] << 16) | (K[1] >>> 16)
+      ];
+
+      // Generate initial counter values
+      var C = this._C = [
+        (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+        (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+        (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+        (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+      ];
+
+      // Carry bit
+      this._b = 0;
+
+      // Iterate the system four times
+      for (var i = 0; i < 4; i++) {
+        nextState.call(this);
+      }
+
+      // Modify the counters
+      for (var i = 0; i < 8; i++) {
+        C[i] ^= X[(i + 4) & 7];
+      }
+
+      // IV setup
+      if (iv) {
+        // Shortcuts
+        var IV = iv.words;
+        var IV_0 = IV[0];
+        var IV_1 = IV[1];
+
+        // Generate four subvectors
+        var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+        var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+        var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+        var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
+
+        // Modify counter values
+        C[0] ^= i0;
+        C[1] ^= i1;
+        C[2] ^= i2;
+        C[3] ^= i3;
+        C[4] ^= i0;
+        C[5] ^= i1;
+        C[6] ^= i2;
+        C[7] ^= i3;
+
+        // Iterate the system four times
+        for (var i = 0; i < 4; i++) {
+          nextState.call(this);
+        }
+      }
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Shortcut
+      var X = this._X;
+
+      // Iterate the system
+      nextState.call(this);
+
+      // Generate four keystream words
+      S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+      S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+      S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+      S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+      for (var i = 0; i < 4; i++) {
+        // Swap endian
+        S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
+          (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
+
+        // Encrypt
+        M[offset + i] ^= S[i];
+      }
+    },
+
+    blockSize: 128/32,
+
+    ivSize: 64/32
+  });
+
+  function nextState() {
+    // Shortcuts
+    var X = this._X;
+    var C = this._C;
+
+    // Save old counter values
+    for (var i = 0; i < 8; i++) {
+      C_[i] = C[i];
+    }
+
+    // Calculate new counter values
+    C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+    C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+    C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+    C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+    C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+    C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+    C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+    C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+    this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+    // Calculate the g-values
+    for (var i = 0; i < 8; i++) {
+      var gx = X[i] + C[i];
+
+      // Construct high and low argument for squaring
+      var ga = gx & 0xffff;
+      var gb = gx >>> 16;
+
+      // Calculate high and low result of squaring
+      var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+      var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+      // High XOR low
+      G[i] = gh ^ gl;
+    }
+
+    // Calculate new state values
+    X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+    X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
+    X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+    X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
+    X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+    X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
+    X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+    X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
+  }
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+   */
+  C.Rabbit = StreamCipher._createHelper(Rabbit);
+}());
+
+
+/**
+ * Counter block mode.
+ */
+CryptoJS.mode.CTR = (function () {
+  var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+  var Encryptor = CTR.Encryptor = CTR.extend({
+    processBlock: function (words, offset) {
+      // Shortcuts
+      var cipher = this._cipher
+      var blockSize = cipher.blockSize;
+      var iv = this._iv;
+      var counter = this._counter;
+
+      // Generate keystream
+      if (iv) {
+        counter = this._counter = iv.slice(0);
+
+        // Remove IV for subsequent blocks
+        this._iv = undefined;
+      }
+      var keystream = counter.slice(0);
+      cipher.encryptBlock(keystream, 0);
+
+      // Increment counter
+      counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+      // Encrypt
+      for (var i = 0; i < blockSize; i++) {
+        words[offset + i] ^= keystream[i];
+      }
+    }
+  });
+
+  CTR.Decryptor = Encryptor;
+
+  return CTR;
+}());
+
+
+(function () {
+  // Shortcuts
+  var C = CryptoJS;
+  var C_lib = C.lib;
+  var StreamCipher = C_lib.StreamCipher;
+  var C_algo = C.algo;
+
+  // Reusable objects
+  var S  = [];
+  var C_ = [];
+  var G  = [];
+
+  /**
+   * Rabbit stream cipher algorithm.
+   *
+   * This is a legacy version that neglected to convert the key to little-endian.
+   * This error doesn't affect the cipher's security,
+   * but it does affect its compatibility with other implementations.
+   */
+  var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+    _doReset: function () {
+      // Shortcuts
+      var K = this._key.words;
+      var iv = this.cfg.iv;
+
+      // Generate initial state values
+      var X = this._X = [
+        K[0], (K[3] << 16) | (K[2] >>> 16),
+        K[1], (K[0] << 16) | (K[3] >>> 16),
+        K[2], (K[1] << 16) | (K[0] >>> 16),
+        K[3], (K[2] << 16) | (K[1] >>> 16)
+      ];
+
+      // Generate initial counter values
+      var C = this._C = [
+        (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+        (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+        (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+        (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+      ];
+
+      // Carry bit
+      this._b = 0;
+
+      // Iterate the system four times
+      for (var i = 0; i < 4; i++) {
+        nextState.call(this);
+      }
+
+      // Modify the counters
+      for (var i = 0; i < 8; i++) {
+        C[i] ^= X[(i + 4) & 7];
+      }
+
+      // IV setup
+      if (iv) {
+        // Shortcuts
+        var IV = iv.words;
+        var IV_0 = IV[0];
+        var IV_1 = IV[1];
+
+        // Generate four subvectors
+        var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+        var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+        var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+        var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
+
+        // Modify counter values
+        C[0] ^= i0;
+        C[1] ^= i1;
+        C[2] ^= i2;
+        C[3] ^= i3;
+        C[4] ^= i0;
+        C[5] ^= i1;
+        C[6] ^= i2;
+        C[7] ^= i3;
+
+        // Iterate the system four times
+        for (var i = 0; i < 4; i++) {
+          nextState.call(this);
+        }
+      }
+    },
+
+    _doProcessBlock: function (M, offset) {
+      // Shortcut
+      var X = this._X;
+
+      // Iterate the system
+      nextState.call(this);
+
+      // Generate four keystream words
+      S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+      S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+      S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+      S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+      for (var i = 0; i < 4; i++) {
+        // Swap endian
+        S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
+          (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
+
+        // Encrypt
+        M[offset + i] ^= S[i];
+      }
+    },
+
+    blockSize: 128/32,
+
+    ivSize: 64/32
+  });
+
+  function nextState() {
+    // Shortcuts
+    var X = this._X;
+    var C = this._C;
+
+    // Save old counter values
+    for (var i = 0; i < 8; i++) {
+      C_[i] = C[i];
+    }
+
+    // Calculate new counter values
+    C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+    C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+    C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+    C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+    C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+    C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+    C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+    C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+    this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+    // Calculate the g-values
+    for (var i = 0; i < 8; i++) {
+      var gx = X[i] + C[i];
+
+      // Construct high and low argument for squaring
+      var ga = gx & 0xffff;
+      var gb = gx >>> 16;
+
+      // Calculate high and low result of squaring
+      var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+      var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+      // High XOR low
+      G[i] = gh ^ gl;
+    }
+
+    // Calculate new state values
+    X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+    X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
+    X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+    X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
+    X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+    X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
+    X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+    X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
+  }
+
+  /**
+   * Shortcut functions to the cipher's object interface.
+   *
+   * @example
+   *
+   *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+   *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+   */
+  C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+}());
+
+
+/**
+ * Zero padding strategy.
+ */
+CryptoJS.pad.ZeroPadding = {
+  pad: function (data, blockSize) {
+    // Shortcut
+    var blockSizeBytes = blockSize * 4;
+
+    // Pad
+    data.clamp();
+    data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+  },
+
+  unpad: function (data) {
+    // Shortcut
+    var dataWords = data.words;
+
+    // Unpad
+    var i = data.sigBytes - 1;
+    while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+      i--;
+    }
+    data.sigBytes = i + 1;
+  }
+};
+

+ 198 - 0
.svn/pristine/18/186c34c1f302b5dc42cdf39ba294ff26239054ac.svn-base

@@ -0,0 +1,198 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="河流名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hlmc">
+                <j-popup
+                    v-model="model.hlmc"
+                    field="hlmc"
+                    org-fields="hlmc,hlbm"
+                    dest-fields="hlmc,hlbm"
+                    code="hllist"
+                    :multi="false"
+                    @input="popupCallback"
+                />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="界桩编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="jzbh">
+              <a-input v-model="model.jzbh" placeholder="请输入界桩编号"></a-input>
+            </a-form-model-item>
+          </a-col>
+
+          <a-col :span="24">
+            <a-form-model-item label="横坐标" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hzb">
+              <a-input-number v-model="model.hzb" placeholder="请输入横坐标" style="width: 100%" @blur="coordsChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="纵坐标" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zzb">
+              <a-input-number v-model="model.zzb" placeholder="请输入纵坐标" style="width: 100%" @blur="coordsChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="东经"  :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lng">
+              <a-input-number v-model="this.lng" disabled="" placeholder="请输入纵坐标" style="width: 100%" @blur="coordsChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="北纬" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lat">
+              <a-input-number v-model="this.lat" disabled="" placeholder="请输入纵坐标" style="width: 100%" @blur="coordsChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="是否移位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lat">
+              <a-input v-model="model.sfyw" placeholder="请输入是否移位"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="移位横坐标" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lat">
+              <a-input-number v-model="model.ywhzb" placeholder="请输入移位横坐标" style="width: 100%" @blur="coordsChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="移位纵坐标" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lat">
+              <a-input-number v-model="model.ywzzb" placeholder="请输入移位纵坐标" style="width: 100%" @blur="coordsChange"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="岸别" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ab">
+              <j-dict-select-tag type="list" v-model="model.ab" dictCode="ab" placeholder="请选择岸别"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="高程" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gc">
+              <a-input-number v-model="model.gc" placeholder="请输入高程" style="width: 100%"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="行政区划" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xzqh">
+              <j-area-linkage type="cascader" v-model="model.xzqh" placeholder="请输入省市区"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="所在位置" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dmdz">
+              <a-input v-model="model.dmdz" placeholder="请输入所在位置"></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol2" prop="bz">
+              <!--              <j-editor v-model="model.bz" />-->
+
+              <a-textarea v-model="model.bz"></a-textarea>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+import {httpAction, getAction} from '@/api/manage'
+import {validateDuplicateValue} from '@/utils/util'
+
+export default {
+  name: 'RmBoundaryMarkerForm',
+  components: {},
+  props: {
+    //表单禁用
+    disabled: {
+      type: Boolean,
+      default: false,
+      required: false
+    },
+    lng: {
+      type: Number
+    },
+    lat: {
+      type: Number
+    }
+  },
+  data() {
+    return {
+      model: {},
+      labelCol: {
+        xs: {span: 24},
+        sm: {span: 6},
+      },
+      wrapperCol: {
+        xs: {span: 24},
+        sm: {span: 16},
+      },
+      wrapperCol2: {
+        xs: {span: 24},
+        sm: {span: 16},
+      },
+      confirmLoading: false,
+      validatorRules: {
+        jzbh: {
+          required: true,
+          message: '请输入界桩编号!'
+        }
+      },
+      url: {
+        add: "/hzz.hhhj.jzd/rmBoundaryMarker/add",
+        edit: "/hzz.hhhj.jzd/rmBoundaryMarker/edit",
+        queryById: "/hzz.hhhj.jzd/rmBoundaryMarker/queryById"
+      }
+    }
+  },
+  computed: {
+    formDisabled() {
+      return this.disabled
+    },
+  },
+  created() {
+    //备份model原始值
+    this.modelDefault = JSON.parse(JSON.stringify(this.model));
+  },
+  methods: {
+    add() {
+      this.edit(this.modelDefault);
+    },
+    edit(record) {
+      this.model = Object.assign({}, record);
+      this.visible = true;
+    },
+    submitForm() {
+      const that = this;
+      // 触发表单验证
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          that.confirmLoading = true;
+          let httpurl = '';
+          let method = '';
+          if (!this.model.id) {
+            httpurl += this.url.add;
+            method = 'post';
+          } else {
+            httpurl += this.url.edit;
+            //method = 'put';
+            method = 'post';
+          }
+          httpAction(httpurl, this.model, method).then((res) => {
+            if (res.success) {
+              that.$message.success(res.message);
+              that.$emit('ok');
+            } else {
+              that.$message.warning(res.message);
+            }
+          }).finally(() => {
+            that.confirmLoading = false;
+          })
+        }
+      })
+    },
+    popupCallback(value, row) {
+      this.model = Object.assign(this.model, row);
+    },
+    coordsChange() {
+      this.$emit("coordsChange", this.model.hzb, this.model.zzb);
+    }
+  }
+}
+</script>

+ 245 - 0
.svn/pristine/18/18c7fd9d7f624c514e96215ff131c4f44aa48d51.svn-base

@@ -0,0 +1,245 @@
+<template>
+  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" v-if="mainId">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('目标清单')">导出</a-button>
+      <a-upload
+        name="file"
+        :showUploadList="false"
+        :multiple="false"
+        :headers="tokenHeader"
+        :action="importExcelUrl"
+        @change="handleImportExcel">
+          <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+
+      </a-table>
+    </div>
+
+    <rmMbqd-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></rmMbqd-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmMbqdModal from './modules/RmMbqdModal'
+
+  export default {
+    name: "RmMbqdList",
+    mixins:[JeecgListMixin],
+    components: { RmMbqdModal },
+    props:{
+      mainId:{
+        type:String,
+        default:'',
+        required:false
+      }
+    },
+    watch:{
+      mainId:{
+        immediate: true,
+        handler(val) {
+          if(!this.mainId){
+            this.clearList()
+          }else{
+            this.queryParam['mainId'] = val
+            this.loadData(1);
+          }
+        }
+      }
+    },
+    data () {
+      return {
+        description: '基本信息表管理页面',
+        disableMixinCreated:true,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'目标类别',
+            align:"center",
+            dataIndex: 'mblb_dictText',
+          },
+          {
+            title:'指标分类',
+            align:"center",
+            dataIndex: 'zbfl_dictText',
+          },
+          {
+            title:'主要指标',
+            align:"center",
+            dataIndex: 'zyzb'
+          },
+          {
+            title:'指标现状',
+            align:"center",
+            dataIndex: 'zbxz'
+          },
+          {
+            title:'指标预期',
+            align:"center",
+            dataIndex: 'zbyq'
+          },
+          {
+            title:'所在地址',
+            align:"center",
+            dataIndex: 'szdz'
+          },
+          {
+            title:'经度',
+            align:"center",
+            dataIndex: 'jd'
+          },
+          {
+            title:'纬度',
+            align:"center",
+            dataIndex: 'wd'
+          },
+          {
+            title:'第一年度',
+            align:"center",
+            dataIndex: 'dynd'
+          },
+          {
+            title:'第二年度',
+            align:"center",
+            dataIndex: 'dernd'
+          },
+          {
+            title:'第三年度',
+            align:"center",
+            dataIndex: 'dsnd'
+          },
+          {
+            title:'责任部门',
+            align:"center",
+            dataIndex: 'zrbm'
+          },
+          {
+            title:'意见/备注',
+            align:"center",
+            dataIndex: 'yjbz'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/hzz.yhyc/rmJbxx/listRmMbqdByMainId",
+          delete: "/hzz.yhyc/rmJbxx/deleteRmMbqd",
+          deleteBatch: "/hzz.yhyc/rmJbxx/deleteBatchRmMbqd",
+          exportXlsUrl: "/hzz.yhyc/rmJbxx/exportRmMbqd",
+          importUrl: "/hzz.yhyc/rmJbxx/importRmMbqd",
+        },
+        dictOptions:{
+         hdmc:[],
+        },
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl(){
+        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
+      }
+    },
+    methods: {
+      clearList(){
+        this.dataSource=[]
+        this.selectedRowKeys=[]
+        this.ipagination.current = 1
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'hdmc',text:'河段名称',dictCode:'hlmc'})
+        fieldList.push({type:'string',value:'famc',text:'方案名称',dictCode:''})
+        fieldList.push({type:'date',value:'bzrq',text:'编制日期'})
+        fieldList.push({type:'date',value:'ksnf',text:'开始年月'})
+        fieldList.push({type:'date',value:'zznf',text:'终止年月'})
+        fieldList.push({type:'string',value:'bzdw',text:'编制单位',dictCode:''})
+        fieldList.push({type:'string',value:'bz',text:'备注',dictCode:''})
+        fieldList.push({type:'string',value:'wbfa',text:'文本方案',dictCode:''})
+        fieldList.push({type:'string',value:'xgtj',text:'相关图件',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 680 - 0
.svn/pristine/19/1940e732287fdc5afc5a58c3b3f15194f437c84d.svn-base

@@ -0,0 +1,680 @@
+<template xmlns:background-color="http://www.w3.org/1999/xhtml">
+  <a-row :gutter="10">
+    <a-col :md="12" :sm="24">
+      <a-card :bordered="false">
+
+        <!-- 按钮操作区域 -->
+        <a-row style="margin: 0 0 0 14px" class="table-operator">
+          <a-button @click="handleAdd(1)" type="primary">添加部门</a-button>
+          <a-button @click="handleAdd(2)" type="primary">添加下级</a-button>
+          <a-button type="primary" icon="download" @click="handleExportXls('部门信息')">导出</a-button>
+          <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+            <a-button type="primary" icon="import">导入</a-button>
+          </a-upload>
+          <j-third-app-button biz-type="depart" :selected-row-keys="selectedRowKeys" syncToApp @sync-finally="onSyncFinally"/>
+          <a-button title="删除多条数据" @click="batchDel" type="default">批量删除</a-button>
+        </a-row>
+        <div style="background: #fff;padding-left:16px;height: 100%; margin-top: 5px">
+          <a-alert type="info" :showIcon="true">
+            <div slot="message">
+              当前选择:<span v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</span>
+              <a v-if="this.currSelected.title" style="margin-left: 10px" @click="onClearSelected">取消选择</a>
+            </div>
+          </a-alert>
+          <a-input-search @search="onSearch" style="width:100%;margin-top: 10px" placeholder="请输入部门名称"/>
+          <!-- 树-->
+          <a-col :md="10" :sm="24">
+            <template>
+              <a-dropdown :trigger="[this.dropTrigger]" @visibleChange="dropStatus">
+               <span style="user-select: none">
+            <a-tree
+              v-if="loading"
+              checkable
+              multiple
+              @select="onSelect"
+              @check="onCheck"
+              @rightClick="rightHandle"
+              :selectedKeys="selectedKeys"
+              :checkedKeys="checkedKeys"
+              :treeData="departTree"
+              :checkStrictly="checkStrictly"
+              :expandedKeys.sync="iExpandedKeys"
+              :load-data="loadSubTree"
+              @expand="onExpand"/>
+                </span>
+                <a-menu slot="overlay">
+                  <a-menu-item @click="handleAdd(3)" key="1">添加</a-menu-item>
+                  <a-menu-item @click="handleDelete" key="2">删除</a-menu-item>
+                  <a-menu-item @click="closeDrop" key="3">取消</a-menu-item>
+                </a-menu>
+              </a-dropdown>
+            </template>
+          </a-col>
+        </div>
+      </a-card>
+      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      <div class="drawer-bootom-button">
+        <a-dropdown :trigger="['click']" placement="topCenter">
+          <a-menu slot="overlay">
+            <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
+            <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
+            <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
+            <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
+            <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
+            <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
+          </a-menu>
+          <a-button>
+            树操作 <a-icon type="up" />
+          </a-button>
+        </a-dropdown>
+      </div>
+      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+    </a-col>
+    <a-col :md="12" :sm="24">
+      <a-tabs defaultActiveKey="1">
+        <a-tab-pane tab="基本信息" key="1" >
+          <a-card :bordered="false" v-if="selectedKeys.length>0">
+            <a-form-model ref="form" :model="model" :rules="validatorRules">
+              <a-form-model-item :labelCol="labelCol"  :wrapperCol="wrapperCol"  label="机构名称" prop="departName" >
+                <a-input placeholder="请输入机构/部门名称" v-model="model.departName"/>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门" prop="parentId">
+                <a-tree-select style="width:100%" :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"  :treeData="treeData" :disabled="disable" v-model="model.parentId"  placeholder="无">
+                </a-tree-select>
+              </a-form-model-item>
+              <a-form-model-item  :labelCol="labelCol" :wrapperCol="wrapperCol" label="机构编码" prop="orgCode">
+                <a-input disabled placeholder="请输入机构编码" v-model="model.orgCode"/>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="机构类型" prop="orgCategory">
+                <template v-if="orgCategoryDisabled">
+                  <a-radio-group v-model="model.orgCategory" placeholder="请选择机构类型">
+                    <a-radio value="1">
+                      公司
+                    </a-radio>
+                  </a-radio-group>
+                </template>
+                <template v-else>
+                  <a-radio-group v-model="model.orgCategory" placeholder="请选择机构类型">
+                    <a-radio value="2">
+                      部门
+                    </a-radio>
+                    <a-radio value="3">
+                      岗位
+                    </a-radio>
+                  </a-radio-group>
+                </template>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol"  label="排序"  prop="departOrder">
+                <a-input v-model="model.departOrder"/>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol"  :wrapperCol="wrapperCol" label="手机号" prop="mobile">
+                <a-input placeholder="请输入手机号" v-model="model.mobile"/>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol"  :wrapperCol="wrapperCol"  label="地址"  prop="address">
+                <a-input placeholder="请输入地址" v-model="model.address"/>
+              </a-form-model-item>
+              <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol"  label="备注"  prop="memo">
+                <a-textarea placeholder="请输入备注" v-model="model.memo"/>
+              </a-form-model-item>
+            </a-form-model>
+            <div class="anty-form-btn">
+              <a-button @click="emptyCurrForm" type="default" htmlType="button" icon="sync">重置</a-button>
+              <a-button @click="submitCurrForm" type="primary" htmlType="button" icon="form">保存</a-button>
+            </div>
+          </a-card>
+          <a-card v-else >
+            <a-empty>
+              <span slot="description"> 请先选择一个部门! </span>
+            </a-empty>
+          </a-card>
+        </a-tab-pane>
+        <a-tab-pane tab="部门权限" key="2" forceRender>
+          <depart-auth-modal ref="departAuth"/>
+        </a-tab-pane>
+      </a-tabs>
+
+    </a-col>
+    <depart-modal ref="departModal" @ok="loadTree"></depart-modal>
+  </a-row>
+</template>
+<script>
+  import DepartModal from './modules/DepartModal'
+  import { deleteByDepartId, queryDepartTreeSync, searchByKeywords } from '@/api/api'
+  import { deleteAction, httpAction } from '@/api/manage'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import DepartAuthModal from './modules/DepartAuthModal'
+  import { cloneObject } from '@/utils/util'
+  import JThirdAppButton from '@comp/jeecgbiz/thirdApp/JThirdAppButton'
+  // 表头
+  const columns = [
+    {
+      title: '机构名称',
+      dataIndex: 'departName'
+    },
+    {
+      title: '机构类型',
+      align: 'center',
+      dataIndex: 'orgType'
+    },
+    {
+      title: '机构编码',
+      dataIndex: 'orgCode',
+    },
+    {
+      title: '手机号',
+      dataIndex: 'mobile'
+    },
+    {
+      title: '传真',
+      dataIndex: 'fax'
+    },
+    {
+      title: '地址',
+      dataIndex: 'address'
+    },
+    {
+      title: '排序',
+      align: 'center',
+      dataIndex: 'departOrder'
+    },
+    {
+      title: '操作',
+      align: 'center',
+      dataIndex: 'action',
+      scopedSlots: {customRender: 'action'}
+    }
+  ]
+  export default {
+    name: 'DepartList',
+    mixins: [JeecgListMixin],
+    components: {
+      JThirdAppButton,
+      DepartAuthModal,
+      DepartModal
+    },
+    data() {
+      return {
+        iExpandedKeys: [],
+        loading: true,
+        autoExpandParent: false,
+        currFlowId: '',
+        currFlowName: '',
+        disable: true,
+        treeData: [],
+        visible: false,
+        departTree: [],
+        departTreeAll: [],
+        loadedKeys: [],
+        allIds: [],
+        rightClickSelectedKey: '',
+        rightClickSelectedOrgCode: '',
+        hiding: true,
+        model: {},
+        dropTrigger: '',
+        depart: {},
+        columns: columns,
+        disableSubmit: false,
+        checkedKeys: [],
+        selectedKeys: [],
+        autoIncr: 1,
+        currSelected: {},
+
+        allTreeKeys:[],
+        loadTreeKeys:[],
+        checkStrictly: true,
+        labelCol: {
+          xs: {span: 24},
+          sm: {span: 5}
+        },
+        wrapperCol: {
+          xs: {span: 24},
+          sm: {span: 16}
+        },
+        graphDatasource: {
+          nodes: [],
+          edges: []
+        },
+        validatorRules: {
+          departName: [{required: true, message: '请输入机构/部门名称!'}],
+          orgCode: [{required: true, message: '请输入机构编码!'}],
+          orgCategory: [{required: true, message: '请输入机构类型!'}],
+          mobile: [{validator: this.validateMobile}]
+        },
+        url: {
+          delete: '/sys/sysDepart/delete',
+          edit: '/sys/sysDepart/edit',
+          deleteBatch: '/sys/sysDepart/deleteBatch',
+          exportXlsUrl: "sys/sysDepart/exportXls",
+          importExcelUrl: "sys/sysDepart/importExcel",
+        },
+        orgCategoryDisabled:false,
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      loadData() {
+        this.refresh();
+      },
+      loadTree() {
+        var that = this
+        //上级部门树信息
+        that.treeData = []
+        //保存的树信息,搜索是需要用到
+        that.departTreeAll = []
+        //所有的树信息
+        that.departTree = []
+        //所有的树节点key信息
+        that.allIds = []
+        
+        that.iExpandedKeys = []
+        
+        that.loading = false
+        queryDepartTreeSync().then((res) => {
+          if (res.success) {
+            this.allTreeKeys = [];
+            for (let i = 0; i < res.result.length; i++) {
+              let temp = res.result[i]
+              that.treeData.push(temp)
+              that.departTreeAll.push(temp)
+              that.departTree.push(temp)
+              that.allIds.push(temp.key)
+              that.allTreeKeys.push(temp.key)
+              if(that.loadTreeKeys.indexOf(temp.key)>=0){
+                that.iExpandedKeys.push(temp.key)
+              }
+            }
+            that.$nextTick(()=>{
+              that.loading = true
+            })
+          }
+        })
+      },
+      loadSubTree(treeNode) {
+        var that = this;
+        return new Promise(resolve => {
+          queryDepartTreeSync({pid:treeNode.dataRef.id}).then((res) =>  {
+            if (res.success) {
+              //判断chidlren是否为空,并修改isLeaf属性值
+              if(res.result.length == 0){
+                treeNode.dataRef['isLeaf']=true
+                return;
+              }else{
+                treeNode.dataRef['children']= res.result;
+              }
+              for (let i = 0; i < res.result.length; i++) {
+                let temp = res.result[i]
+                that.allIds.push(temp.key)
+                if(that.loadTreeKeys.indexOf(temp.key)>0){
+                  that.iExpandedKeys.push(temp.key)
+                }
+              }
+            }
+          })
+          resolve();
+        });
+        //保存全部部门信息,方便后面搜索使用
+        that.departTreeAll=that.departTree
+      },
+      refresh() {
+        this.loading = true
+        this.loadTree()
+      },
+      // 右键操作方法
+      rightHandle(node) {
+        this.dropTrigger = 'contextmenu'
+        console.log(node.node.eventKey)
+        this.rightClickSelectedKey =  node.node.eventKey
+        this.rightClickSelectedOrgCode = node.node.dataRef.orgCode
+      },
+      onExpand(expandedKeys) {
+        console.log('onExpand', expandedKeys)
+        this.iExpandedKeys = expandedKeys
+        this.autoExpandParent = false
+        this.allTreeKeys=expandedKeys
+        this.loadTreeKeys=expandedKeys
+      },
+      backFlowList() {
+        this.$router.back(-1)
+      },
+      // 右键点击下拉框改变事件
+      dropStatus(visible) {
+        if (visible == false) {
+          this.dropTrigger = ''
+        }
+      },
+      // 右键店家下拉关闭下拉框
+      closeDrop() {
+        this.dropTrigger = ''
+      },
+      addRootNode() {
+        this.$refs.nodeModal.add(this.currFlowId, '')
+      },
+      batchDel: function () {
+        console.log(this.checkedKeys)
+        if (this.checkedKeys.length <= 0) {
+          this.$message.warning('请选择一条记录!')
+        } else {
+          var ids = ''
+          for (var a = 0; a < this.checkedKeys.length; a++) {
+            ids += this.checkedKeys[a]+ ','
+          }
+          var that = this
+          this.$confirm({
+            title: '确认删除',
+            content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据,以及子节点数据吗?',
+            onOk: function () {
+              deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
+                if (res.success) {
+                  that.$message.success(res.message)
+                  that.loadTree()
+                  that.onClearSelected()
+                } else {
+                  that.$message.warning(res.message)
+                }
+              })
+            }
+          })
+        }
+      },
+      onSearch(value) {
+        let that = this
+        if (value) {
+          searchByKeywords({keyWord: value}).then((res) => {
+            if (res.success) {
+              that.departTree = []
+              for (let i = 0; i < res.result.length; i++) {
+                let temp = res.result[i]
+                that.departTree.push(temp)
+              }
+            } else {
+              that.$message.warning(res.message)
+            }
+          })
+        } else {
+          that.departTree=that.departTreeAll
+        }
+
+      },
+      nodeModalOk() {
+        this.loadTree()
+      },
+      nodeModalClose() {
+      },
+      hide() {
+        this.visible = false
+      },
+      onCheck(checkedKeys, info) {
+        console.log('onCheck', checkedKeys, info)
+        this.hiding = false
+        //this.checkedKeys = checkedKeys.checked
+        // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+        if(this.checkStrictly){
+          this.checkedKeys = checkedKeys.checked;
+        }else{
+          this.checkedKeys = checkedKeys
+        }
+        // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      },
+      onSelect(selectedKeys, e) {
+        console.log('selected', selectedKeys, e)
+        this.hiding = false
+        let record = e.node.dataRef
+        console.log('onSelect-record', record)
+        this.currSelected = Object.assign({}, record)
+        this.model = this.currSelected
+        this.selectedKeys = [record.key]
+        this.model.parentId = record.parentId
+        this.setValuesToForm(record)
+        this.$refs.departAuth.show(record.id);
+
+      },
+      // 触发onSelect事件时,为部门树右侧的form表单赋值
+      setValuesToForm(record) {
+        if(record.orgCategory == '1'){
+          this.orgCategoryDisabled = true;
+        }else{
+          this.orgCategoryDisabled = false;
+        }
+        this.$nextTick(() => {
+          this.model = cloneObject(record)
+        })
+      },
+      getCurrSelectedTitle() {
+        return !this.currSelected.title ? '' : this.currSelected.title
+      },
+      onClearSelected() {
+        this.hiding = true
+        this.checkedKeys = []
+        this.currSelected = {}
+        this.model = cloneObject(this.currSelected)
+        this.selectedKeys = []
+        this.$refs.departAuth.departId = ''
+      },
+      handleNodeTypeChange(val) {
+        this.currSelected.nodeType = val
+      },
+      notifyTriggerTypeChange(value) {
+        this.currSelected.notifyTriggerType = value
+      },
+      receiptTriggerTypeChange(value) {
+        this.currSelected.receiptTriggerType = value
+      },
+      submitCurrForm() {
+        this.$refs.form.validate((ok, err) => {
+          if (ok) {
+            if (!this.currSelected.id) {
+              this.$message.warning('请点击选择要修改部门!')
+              return
+            }
+
+            let formData = Object.assign(this.currSelected, this.model)
+            console.log('Received values of form: ', formData)
+            httpAction(this.url.edit, formData, 'put').then((res) => {
+              if (res.success) {
+                this.$message.success('保存成功!')
+                this.loadTree()
+              } else {
+                this.$message.error(res.message)
+              }
+            })
+          }
+        })
+      },
+      emptyCurrForm() {
+        this.model = this.currSelected
+      },
+      nodeSettingFormSubmit() {
+        this.$refs.form.validate((ok, err) => {
+          if (ok) {
+            console.log('Received values of form: ', this.model)
+          }
+        })
+      },
+      openSelect() {
+        this.$refs.sysDirectiveModal.show()
+      },
+      handleAdd(num) {
+        if (num == 1) {
+          this.$refs.departModal.add()
+          this.$refs.departModal.title = '新增'
+        } else if (num == 2) {
+          let key = this.currSelected.key
+          if (!key) {
+            this.$message.warning('请先点击选中上级部门!')
+            return false
+          }
+          this.$refs.departModal.add(this.selectedKeys[0])
+          this.$refs.departModal.title = '新增'
+        } else {
+          this.$refs.departModal.add(this.rightClickSelectedKey)
+          this.$refs.departModal.title = '新增'
+        }
+      },
+      handleDelete() {
+        var that = this
+        this.$confirm({
+          title: '确认删除',
+          content: '确定要删除此部门以及子节点数据吗?',
+          onOk: function () {
+            deleteByDepartId({id: that.rightClickSelectedKey}).then((resp) => {
+              if (resp.success) {
+                //删除成功后,去除已选中中的数据
+                that.checkedKeys.splice(that.checkedKeys.findIndex(key => key === that.rightClickSelectedKey), 1);
+                that.$message.success('删除成功!')
+                that.loadTree()
+                //删除后同步清空右侧基本信息内容
+                let orgCode = that.model.orgCode
+                if(orgCode && orgCode === that.rightClickSelectedOrgCode){
+                  that.onClearSelected()
+                }
+              } else {
+                that.$message.warning('删除失败!')
+              }
+            })
+          }
+        })
+      },
+      selectDirectiveOk(record) {
+        console.log('选中指令数据', record)
+        this.nodeSettingForm.setFieldsValue({directiveCode: record.directiveCode})
+        this.currSelected.sysCode = record.sysCode
+      },
+      getFlowGraphData(node) {
+        this.graphDatasource.nodes.push({
+          id: node.id,
+          text: node.flowNodeName
+        })
+        if (node.children.length > 0) {
+          for (let a = 0; a < node.children.length; a++) {
+            let temp = node.children[a]
+            this.graphDatasource.edges.push({
+              source: node.id,
+              target: temp.id
+            })
+            this.getFlowGraphData(temp)
+          }
+        }
+      },
+     // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      expandAll () {
+        this.iExpandedKeys = this.allTreeKeys
+        //this.loadTree()
+      },
+      closeAll () {
+        this.iExpandedKeys = []
+      },
+      checkALL () {
+        this.checkStriccheckStrictlytly = false
+        //this.checkedKeys = this.allTreeKeys
+        this.checkedKeys = this.allIds
+      },
+      cancelCheckALL () {
+        //this.checkedKeys = this.defaultCheckedKeys
+        this.checkedKeys = []
+      },
+      switchCheckStrictly (v) {
+        if(v==1){
+          this.checkStrictly = false
+        }else if(v==2){
+          this.checkStrictly = true
+        }
+      },
+      getAllKeys(node) {
+        // console.log('node',node);
+        this.allTreeKeys.push(node.key)
+        if (node.children && node.children.length > 0) {
+          for (let a = 0; a < node.children.length; a++) {
+            this.getAllKeys(node.children[a])
+          }
+        }
+      },
+      // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+
+      // 验证手机号
+      validateMobile(rule,value,callback){
+        if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){
+          callback();
+        }else{
+          callback("您的手机号码格式不正确!");
+        }
+
+      },
+      onSyncFinally({isToLocal}) {
+        // 同步到本地时刷新下数据
+        if (isToLocal) {
+          this.loadData()
+        }
+      },
+    },
+    created() {
+      this.currFlowId = this.$route.params.id
+      this.currFlowName = this.$route.params.name
+      // this.loadTree()
+    },
+
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
+<style scoped>
+  .ant-card-body .table-operator {
+    margin: 15px;
+  }
+
+  .anty-form-btn {
+    width: 100%;
+    text-align: center;
+  }
+
+  .anty-form-btn button {
+    margin: 0 5px;
+  }
+
+  .anty-node-layout .ant-layout-header {
+    padding-right: 0
+  }
+
+  .header {
+    padding: 0 8px;
+  }
+
+  .header button {
+    margin: 0 3px
+  }
+
+  .ant-modal-cust-warp {
+    height: 100%
+  }
+
+  .ant-modal-cust-warp .ant-modal-body {
+    height: calc(100% - 110px) !important;
+    overflow-y: auto
+  }
+
+  .ant-modal-cust-warp .ant-modal-content {
+    height: 90% !important;
+    overflow-y: hidden
+  }
+
+  #app .desktop {
+    height: auto !important;
+  }
+
+  /** Button按钮间距 */
+  .drawer-bootom-button {
+    /*position: absolute;*/
+    bottom: 0;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: left;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

BIN
.svn/pristine/19/1972ebd7aeb8456462a7bd3eba1bc28b7e90da44.svn-base


+ 330 - 0
.svn/pristine/19/197eae42ddc7310463e7ee69466e74fa7f92d1f1.svn-base

@@ -0,0 +1,330 @@
+<template>
+  <a-card :bordered="false">
+    <a-row :gutter="8">
+      <!-- 这里是父级节点 -->
+      <a-col :span="24" style="margin-bottom: 4px;">
+        <j-vxe-table
+          toolbar
+          row-number
+          row-selection
+          click-select-row
+          highlight-current-row
+          :radio-config="{highlight: false}"
+          :checkbox-config="{highlight: false}"
+          :height="340"
+          :loading="table1.loading"
+          :columns="table1.columns"
+          :dataSource="table1.dataSource"
+          :pagination="table1.pagination"
+          @pageChange="handleTable1PageChange"
+          @selectRowChange="handleTable1SelectRowChange"
+        />
+      </a-col>
+      <!-- 这里是子级节点 -->
+      <a-col :span="12">
+        <j-vxe-table
+          toolbar
+          row-number
+          row-selection
+          click-select-row
+          highlight-current-row
+          :radio-config="{highlight: false}"
+          :checkbox-config="{highlight: false}"
+          :height="340"
+          :loading="table2.loading"
+          :columns="table2.columns"
+          :dataSource="table2.dataSource"
+          :pagination="table2.pagination"
+          @pageChange="handleTable2PageChange"
+          @selectRowChange="handleTable2SelectRowChange"
+        >
+        </j-vxe-table>
+      </a-col>
+      <!-- 这里是孙级节点 -->
+      <a-col :span="12">
+        <j-vxe-table
+          toolbar
+          row-number
+          row-selection
+          :height="340"
+          :loading="table3.loading"
+          :columns="table3.columns"
+          :dataSource="table3.dataSource"
+          :pagination="table3.pagination"
+          @pageChange="handleTable3PageChange"
+        >
+        </j-vxe-table>
+      </a-col>
+    </a-row>
+  </a-card>
+</template>
+
+<script>
+  import { getAction } from '@api/manage'
+  import { JVXETypes } from '@/components/jeecg/JVxeTable'
+
+  // 【多种布局模板】上面父、左下子、右下孙
+  export default {
+    name: 'Template1',
+    data() {
+      return {
+        table1: {
+          // 是否正在加载
+          loading: false,
+          // 分页器参数
+          pagination: {
+            // 当前页码
+            current: 1,
+            // 每页的条数
+            pageSize: 200,
+            // 可切换的条数
+            pageSizeOptions: ['10', '20', '30', '100', '200'],
+            // 数据总数(目前并不知道真实的总数,所以先填写0,在后台查出来后再赋值)
+            total: 0,
+          },
+          // 最后选中的行
+          lastRow: null,
+          // 选择的行
+          selectedRows: [],
+          // 数据源,控制表格的数据
+          dataSource: [],
+          // 列配置,控制表格显示的列
+          columns: [
+            {key: 'num', title: '序号', width: '80px'},
+            {
+              // 字段key,跟后台数据的字段名匹配
+              key: 'ship_name',
+              // 列的标题
+              title: '船名',
+              // 列的宽度
+              width: '180px',
+              // 如果加上了该属性,就代表当前单元格是可编辑的,type就是表单的类型,input就是简单的输入框
+              type: JVXETypes.input,
+              formatter({cellValue, row, column}) {
+                let foo = ''
+                if (row.company === '佧伒侾佯有限公司') {
+                  foo += '-233'
+                }
+                return cellValue + foo
+              },
+            },
+            {key: 'call', title: '呼叫', width: '80px', type: JVXETypes.input},
+            {key: 'len', title: '长', width: '80px', type: JVXETypes.inputNumber},
+            {key: 'ton', title: '吨', width: '120px', type: JVXETypes.inputNumber},
+            {key: 'payer', title: '付款方', width: '120px', type: JVXETypes.input},
+            {key: 'count', title: '数', width: '40px'},
+            {
+              key: 'company',
+              title: '公司',
+              // 最小宽度,与宽度不同的是,这个不是固定的宽度,如果表格有多余的空间,会平均分配给设置了 minWidth 的列
+              // 如果要做占满表格的列可以这么写
+              minWidth: '180px',
+              type: JVXETypes.input
+            },
+            {key: 'trend', title: '动向', width: '120px', type: JVXETypes.input},
+          ],
+        },
+        // 子级表的配置信息 (配置和主表的完全一致,就不写冗余的注释了)
+        table2: {
+          loading: false,
+          pagination: {current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0},
+          // 最后选中的行
+          lastRow: null,
+          selectedRows: [],
+          dataSource: [],
+          columns: [
+            {key: 'dd_num', title: '调度序号', width: '120px'},
+            {key: 'tug', title: '拖轮', width: '180px', type: JVXETypes.input},
+            {key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVXETypes.input},
+            {key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVXETypes.input},
+            {key: 'type', title: '船舶分类', width: '120px', type: JVXETypes.input},
+            {key: 'port_area', title: '所属港区', width: '120px', type: JVXETypes.input},
+          ],
+        },
+        // 孙级表的配置信息 (配置和主表的完全一致,就不写冗余的注释了)
+        table3: {
+          loading: false,
+          pagination: {current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0},
+          selectedRows: [],
+          dataSource: [],
+          columns: [
+            {key: 'dd_num', title: '调度序号', width: '120px'},
+            {key: 'tug', title: '拖轮', width: '120px', type: JVXETypes.input},
+            {key: 'power', title: '马力', width: '120px', type: JVXETypes.input},
+            {key: 'nature', title: '性质', width: '120px', type: JVXETypes.input},
+            {key: 'departure_time', title: '发船时间', width: '180px', type: JVXETypes.input},
+          ],
+        },
+        // 查询url地址
+        url: {
+          getData: '/mock/vxe/getData',
+        },
+      }
+    },
+    // 监听器
+    watch: {
+      // 监听table1 【主表】选择的数据发生了变化
+      ['table1.lastRow'](row) {
+        this.loadTable2Data()
+      },
+      // 监听table2 【子表】选择的数据发生了变化
+      ['table2.lastRow']() {
+        this.loadTable3Data()
+      },
+    },
+    created() {
+      this.loadTable1Data()
+    },
+    methods: {
+
+      // 加载table1【主表】的数据
+      loadTable1Data() {
+        // 封装查询条件
+        let formData = {
+          pageNo: this.table1.pagination.current,
+          pageSize: this.table1.pagination.pageSize
+        }
+        // 调用查询数据接口
+        this.table1.loading = true
+        getAction(this.url.getData, formData).then(res => {
+          if (res.success) {
+            // 后台查询回来的 total,数据总数量
+            this.table1.pagination.total = res.result.total
+            // 将查询的数据赋值给 dataSource
+            this.table1.dataSource = res.result.records
+            // 重置选择
+            this.table1.selectedRows = []
+          } else {
+            this.$error({title: '主表查询失败', content: res.message})
+          }
+        }).finally(() => {
+          // 这里是无论成功或失败都会执行的方法,在这里关闭loading
+          this.table1.loading = false
+        })
+      },
+
+      // 当table1【主表】分页参数变化时触发的事件
+      handleTable1PageChange(event) {
+        // 重新赋值
+        this.table1.pagination.current = event.current
+        this.table1.pagination.pageSize = event.pageSize
+        // 查询数据
+        this.loadTable1Data()
+      },
+
+      // table1【主表】当选择的行变化时触发的事件
+      handleTable1SelectRowChange(event) {
+        this.handleTableSelectRowChange(this.table1, event)
+      },
+
+      // 加载table2【子表】的数据,根据主表的id进行查询
+      loadTable2Data() {
+        // 如果主表没有选择,则不查询
+        let selectedRows = this.table1.selectedRows
+        if (!selectedRows || selectedRows.length === 0) {
+          this.table2.pagination.total = 0
+          this.table2.dataSource = []
+          this.table2.selectedRows = []
+          return
+        } else if (this.table1.lastRow == null) {
+          this.table1.lastRow = selectedRows[selectedRows.length - 1]
+        }
+        let formData = {
+          parentId: this.table1.lastRow.id,
+          pageNo: this.table2.pagination.current,
+          pageSize: this.table2.pagination.pageSize
+        }
+        this.table2.loading = true
+        getAction(this.url.getData, formData).then(res => {
+          if (res.success) {
+            this.table2.pagination.total = res.result.total
+            this.table2.dataSource = res.result.records
+            this.table2.selectedRows = []
+          } else {
+            this.$error({title: '子表查询失败', content: res.message})
+          }
+        }).finally(() => {
+          this.table2.loading = false
+        })
+      },
+
+      // table2【子表】当选择的行变化时触发的事件
+      handleTable2SelectRowChange(event) {
+        this.handleTableSelectRowChange(this.table2, event)
+      },
+
+      // 当table2【子表】分页参数变化时触发的事件
+      handleTable2PageChange(event) {
+        // 重新赋值
+        this.table2.pagination.current = event.current
+        this.table2.pagination.pageSize = event.pageSize
+        // 查询数据
+        this.loadTable2Data()
+      },
+
+      // 加载table3【孙表】的数据,根据子表的id进行查询
+      loadTable3Data() {
+        // 如果主表没有选择,则不查询
+        let selectedRows = this.table2.selectedRows
+        if (!selectedRows || selectedRows.length === 0) {
+          this.table3.pagination.total = 0
+          this.table3.dataSource = []
+          this.table3.selectedRows = []
+          return
+        } else if (this.table2.lastRow == null) {
+          this.table2.lastRow = selectedRows[selectedRows.length - 1]
+        }
+        let formData = {
+          parentId: this.table2.lastRow.id,
+          pageNo: this.table3.pagination.current,
+          pageSize: this.table3.pagination.pageSize
+        }
+        this.table3.loading = true
+        getAction(this.url.getData, formData).then(res => {
+          if (res.success) {
+            this.table3.pagination.total = res.result.total
+            this.table3.dataSource = res.result.records
+          } else {
+            this.$error({title: '子表查询失败', content: res.message})
+          }
+        }).finally(() => {
+          this.table3.loading = false
+        })
+      },
+      // 当table3【孙表】分页参数变化时触发的事件
+      handleTable3PageChange(event) {
+        // 重新赋值
+        this.table3.pagination.current = event.current
+        this.table3.pagination.pageSize = event.pageSize
+        // 查询数据
+        this.loadTable3Data()
+      },
+
+      /** 公共方法:处理表格选中变化事件 */
+      handleTableSelectRowChange(table, event) {
+        let {row, action, selectedRows, $table} = event
+        // 获取最后一个选中的
+        let lastSelected = selectedRows[selectedRows.length - 1]
+        if (action === 'selected') {
+          table.lastRow = row
+        } else if (action === 'selected-all') {
+          // 取消全选
+          if (selectedRows.length === 0) {
+            table.lastRow = null
+          } else if (!table.lastRow) {
+            table.lastRow = lastSelected
+          }
+        } else if (action === 'unselected' && row === table.lastRow) {
+          table.lastRow = lastSelected
+        }
+        $table.setCurrentRow(table.lastRow)
+        table.selectedRows = selectedRows
+      },
+
+    }
+  }
+</script>
+
+<style lang="less">
+
+</style>

+ 68 - 0
.svn/pristine/19/199290874dd4be611848fa2256846d6e671e14a2.svn-base

@@ -0,0 +1,68 @@
+<template>
+  <div class="config-list">
+    <a-radio-group v-model="type">
+      <div class="item">
+        <a-radio value="TYPE_EVERY" class="choice" :disabled="disabled">每秒</a-radio>
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_RANGE" class="choice" :disabled="disabled">区间</a-radio>
+        从
+        <a-input :disabled="type!==TYPE_RANGE || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueRange.start"/>
+        秒
+        至
+        <a-input :disabled="type!==TYPE_RANGE || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueRange.end"/>
+        秒
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_LOOP" class="choice" :disabled="disabled">循环</a-radio>
+        从
+        <a-input :disabled="type!==TYPE_LOOP || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueLoop.start"/>
+        秒开始,间隔
+        <a-input :disabled="type!==TYPE_LOOP || disabled" :max="maxValue" :min="minValue" :precision="0" class="w60" v-model="valueLoop.interval"/>
+        秒
+      </div>
+      <div class="item">
+        <a-radio value="TYPE_SPECIFY" class="choice" :disabled="disabled">指定</a-radio>
+        <div class="list">
+          <a-checkbox-group v-model="valueList">
+            <template v-for="i in specifyRange">
+              <a-checkbox class="list-check-item" :key="`key-${i}`" :value="i" :disabled="type!==TYPE_SPECIFY || disabled">{{i}}</a-checkbox>
+            </template>
+          </a-checkbox-group>
+        </div>
+      </div>
+    </a-radio-group>
+  </div>
+</template>
+
+<script>
+import mixin from './mixin'
+
+export default {
+  name: 'second',
+  mixins: [mixin],
+  data() {
+    return {}
+  },
+  watch: {
+    value_c(newVal, oldVal) {
+      this.$emit('change', newVal)
+    }
+  },
+  created() {
+    this.DEFAULT_VALUE = '*'
+    this.minValue = 0
+    this.maxValue = 59
+    this.valueRange.start = 0
+    this.valueRange.end = 59
+    this.valueLoop.start = 0
+    this.valueLoop.interval = 1
+    // console.info('created')
+    this.parseProp(this.prop)
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  @import "mixin.less";
+</style>

+ 132 - 0
.svn/pristine/1a/1a1840ed24f77af2d1d6316edc1745d166721a00.svn-base

@@ -0,0 +1,132 @@
+<template>
+  <a-checkbox-group v-if="tagType=='checkbox'" @change="onChange" :value="arrayValue" :disabled="disabled">
+    <a-checkbox v-for="(item, key) in dictOptions" :key="key" :value="item.value">{{ item.text || item.label }}</a-checkbox>
+  </a-checkbox-group>
+
+  <a-select
+    v-else-if="tagType=='select'"
+    :value="arrayValue"
+    @change="onChange"
+    :disabled="disabled"
+    mode="multiple"
+    :placeholder="placeholder"
+    :getPopupContainer="getParentContainer"
+    optionFilterProp="children"
+    :filterOption="filterOption"
+    allowClear>
+    <a-select-option
+      v-for="(item,index) in dictOptions"
+      :key="index"
+      :value="item.value">
+      <span style="display: inline-block;width: 100%" :title=" item.text || item.label ">
+        {{ item.text || item.label }}
+      </span>
+    </a-select-option>
+  </a-select>
+
+</template>
+
+<script>
+  import {ajaxGetDictItems,getDictItemsFromCache} from '@/api/api'
+  export default {
+    name: 'JMultiSelectTag',
+    props: {
+      dictCode: String,
+      placeholder: String,
+      disabled: Boolean,
+      value: String,
+      type: String,
+      options:Array,
+      spliter:{
+        type: String,
+        required: false,
+        default: ','
+      },
+      popContainer:{
+        type:String,
+        default:'',
+        required:false
+      },
+    },
+    data() {
+      return {
+        dictOptions: [],
+        tagType:"",
+        arrayValue:!this.value?[]:this.value.split(this.spliter)
+      }
+    },
+    created() {
+      if(!this.type || this.type==="list_multi"){
+        this.tagType = "select"
+      }else{
+        this.tagType = this.type
+      }
+      //获取字典数据
+      //this.initDictData();
+    },
+    watch:{
+      options: function(val){
+        this.setCurrentDictOptions(val);
+      },
+      dictCode:{
+        immediate:true,
+        handler() {
+          this.initDictData()
+        },
+      },
+      value (val) {
+        if(!val){
+          this.arrayValue = []
+        }else{
+          this.arrayValue = this.value.split(this.spliter)
+        }
+      }
+    },
+    methods: {
+      initDictData() {
+        if(this.options && this.options.length>0){
+          this.dictOptions = [...this.options]
+        }else{
+          //优先从缓存中读取字典配置
+          let cacheOption = getDictItemsFromCache(this.dictCode)
+          if(cacheOption && cacheOption.length>0){
+            this.dictOptions = cacheOption
+            return
+          }
+          //根据字典Code, 初始化字典数组
+          ajaxGetDictItems(this.dictCode, null).then((res) => {
+            if (res.success) {
+              this.dictOptions = res.result;
+            }
+          })
+        }
+
+      },
+      onChange (selectedValue) {
+        this.$emit('change', selectedValue.join(this.spliter));
+      },
+      setCurrentDictOptions(dictOptions){
+        this.dictOptions = dictOptions
+      },
+      getCurrentDictOptions(){
+        return this.dictOptions
+      },
+      getParentContainer(node){
+        if(!this.popContainer){
+          return node.parentNode
+        }else{
+          return document.querySelector(this.popContainer)
+        }
+      },
+      // update--begin--autor:lvdandan-----date:20201120------for:LOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
+      filterOption(input, option) {
+        return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      }
+      // update--end--autor:lvdandan-----date:20201120------for:LOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
+    },
+    model: {
+      prop: 'value',
+      event: 'change'
+    }
+  }
+</script>

+ 122 - 0
.svn/pristine/1a/1a24000e1ea1155476e5e27261417b4abf665db4.svn-base

@@ -0,0 +1,122 @@
+<template>
+  <a-modal
+    title="用户列表"
+    :width="1000"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleSubmit"
+    @cancel="handleCancel">
+
+    <a-table
+      ref="table"
+      bordered
+      size="middle"
+      rowKey="id"
+      :columns="columns"
+      :dataSource="dataSource"
+      :pagination="ipagination"
+      :loading="loading"
+      :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"></a-table>
+  </a-modal>
+</template>
+
+<script>
+  import {getUserList} from '@/api/api'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "SelectUserListModal",
+    mixins: [JeecgListMixin],
+    data() {
+      return {
+        title: "操作",
+        visible: false,
+        model: {},
+        confirmLoading: false,
+        url: {
+          add: "/act/model/create",
+          list: "/sys/user/list"
+        },
+        columns: [
+          {
+            title: '用户账号',
+            align: "center",
+            dataIndex: 'username',
+            fixed: 'left',
+            width: 200
+          },
+          {
+            title: '用户姓名',
+            align: "center",
+            dataIndex: 'realname',
+          },
+          {
+            title: '性别',
+            align: "center",
+            dataIndex: 'sex_dictText'
+          },
+          {
+            title: '手机号码',
+            align: "center",
+            dataIndex: 'phone'
+          },
+          {
+            title: '邮箱',
+            align: "center",
+            dataIndex: 'email'
+          },
+          {
+            title: '状态',
+            align: "center",
+            dataIndex: 'status_dictText'
+          }
+        ]
+      }
+    },
+    created() {
+      //Step.2 加载用户数据
+      getUserList().then((res) => {
+        if (res.success) {
+          this.dataSource = res.result.records;
+          this.ipagination.total = Number(res.result.total);
+        }
+      })
+    },
+    methods: {
+      open() {
+        this.visible = true;
+
+        //Step.1 清空选中用户
+        this.selectedRowKeys = []
+        this.selectedRows = []
+      },
+      close() {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleChange(info) {
+        let file = info.file;
+        if (file.response.success) {
+          this.$message.success(file.response.message);
+          this.$emit('ok');
+          this.close()
+        } else {
+          this.$message.warn(file.response.message);
+          this.close()
+        }
+
+      },
+      handleCancel() {
+        this.close()
+      },
+      handleSubmit() {
+        this.$emit('ok', this.selectionRows);
+        this.close()
+      },
+    }
+  }
+</script>
+
+<style>
+
+</style>

+ 238 - 0
.svn/pristine/1a/1a358fb3820e2613853990c4cb3599b57717ba46.svn-base

@@ -0,0 +1,238 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="8">
+            <a-form-item label="消息标题">
+              <a-input placeholder="请输入消息标题" v-model="queryParam.esTitle"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="发送内容">
+              <a-input placeholder="请输入发送内容" v-model="queryParam.esContent"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :md="6" :sm="8">
+              <a-form-item label="接收人">
+                <a-input placeholder="请输入接收人" v-model="queryParam.esReceiver"></a-input>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" v-show="show" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" v-show="show" icon="download" @click="handleExportXls('消息')">导出</a-button>
+      <a-upload v-show="show" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
+                @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel">
+            <a-icon type="delete"/>
+            删除
+          </a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作
+          <a-icon type="down"/>
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+        selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <!-- 字符串超长截取省略号显示-->
+        <span slot="esContent" slot-scope="text">
+          <j-ellipsis :value="text" :length="10" />
+        </span>
+
+        <span slot="action" slot-scope="text, record">
+          <a href="javascript:;" @click="handleDetail(record)">详情</a>
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多<a-icon type="down"/></a>
+            <a-menu slot="overlay">
+               <a-menu-item v-show="show">
+                <a  @click="handleEdit(record)">编辑</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <sysMessage-modal ref="modalForm" @ok="modalFormOk"></sysMessage-modal>
+  </a-card>
+</template>
+
+<script>
+  import SysMessageModal from './modules/SysMessageModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import JEllipsis from "@/components/jeecg/JEllipsis";
+
+  export default {
+    name: "SysMessageList",
+    mixins: [JeecgListMixin],
+    components: {
+      JEllipsis,
+      SysMessageModal
+    },
+    data() {
+      return {
+        description: '消息管理页面',
+        // 新增修改按钮是否显示
+        show: false,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: "center",
+            customRender: function (t, r, index) {
+              return parseInt(index) + 1;
+            }
+          },
+          {
+            title: '消息标题',
+            align: "center",
+            dataIndex: 'esTitle'
+          },
+          {
+            title: '发送内容',
+            align: "center",
+            dataIndex: 'esContent',
+            scopedSlots: {customRender: 'esContent'},
+          },
+          {
+            title: '接收人',
+            align: "center",
+            dataIndex: 'esReceiver'
+          },
+          {
+            title: '发送次数',
+            align: "center",
+            dataIndex: 'esSendNum'
+          },
+          {
+            title: '发送状态',
+            align: 'center',
+            dataIndex: 'esSendStatus_dictText'
+          },
+          {
+            title: '发送时间',
+            align: "center",
+            dataIndex: 'esSendTime'
+          },
+          {
+            title: '发送方式',
+            align: 'center',
+            dataIndex: 'esType_dictText'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/sys/message/sysMessage/list",
+          delete: "/sys/message/sysMessage/delete",
+          deleteBatch: "/sys/message/sysMessage/deleteBatch",
+          exportXlsUrl: "sys/message/sysMessage/exportXls",
+          importExcelUrl: "sys/message/sysMessage/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {}
+  }
+</script>
+<style lang="less" scoped>
+  /** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+
+  .ant-card-body .table-operator {
+    margin-bottom: 18px;
+  }
+
+  .ant-table-tbody .ant-table-row td {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+
+  .anty-row-operator button {
+    margin: 0 5px
+  }
+
+  .ant-btn-danger {
+    background-color: #ffffff
+  }
+
+  .ant-modal-cust-warp {
+    height: 100%
+  }
+
+  .ant-modal-cust-warp .ant-modal-body {
+    height: calc(100% - 110px) !important;
+    overflow-y: auto
+  }
+
+  .ant-modal-cust-warp .ant-modal-content {
+    height: 90% !important;
+    overflow-y: hidden
+  }
+</style>

+ 81 - 0
.svn/pristine/1a/1a793458a0d293e15bb07d5058992d1d34f7303e.svn-base

@@ -0,0 +1,81 @@
+<template>
+  <div class="rank">
+    <h4 class="title">{{ title }}</h4>
+    <ul class="list" :style="{height:height?`${height}px`:'auto',overflow:'auto'}">
+      <li :key="index" v-for="(item, index) in list">
+        <span :class="index < 3 ? 'active' : null">{{ index + 1 }}</span>
+        <span>{{ item.name }}</span>
+        <span>{{ item.total }}</span>
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "RankList",
+    // ['title', 'list']
+    props: {
+      title: {
+        type: String,
+        default: ''
+      },
+      list: {
+        type: Array,
+        default: null
+      },
+      height: {
+        type: Number,
+        default: null
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+
+  .rank {
+    padding: 0 32px 32px 72px;
+
+    .list {
+      margin: 25px 0 0;
+      padding: 0;
+      list-style: none;
+
+      li {
+        margin-top: 16px;
+
+        span {
+          color: rgba(0, 0, 0, .65);
+          font-size: 14px;
+          line-height: 22px;
+
+          &:first-child {
+            background-color: #f5f5f5;
+            border-radius: 20px;
+            display: inline-block;
+            font-size: 12px;
+            font-weight: 600;
+            margin-right: 24px;
+            height: 20px;
+            line-height: 20px;
+            width: 20px;
+            text-align: center;
+          }
+          &.active {
+            background-color: #314659;
+            color: #fff;
+          }
+          &:last-child {
+            float: right;
+          }
+        }
+      }
+    }
+  }
+
+  .mobile .rank {
+    padding: 0 32px 32px 32px;
+  }
+
+</style>

+ 236 - 0
.svn/pristine/1a/1a837b7eadd3bcdef4a853f1dc4caaee00563981.svn-base

@@ -0,0 +1,236 @@
+<template>
+  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" v-if="mainId">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('问题清单')">导出</a-button>
+      <a-upload
+        name="file"
+        :showUploadList="false"
+        :multiple="false"
+        :headers="tokenHeader"
+        :action="importExcelUrl"
+        @change="handleImportExcel">
+          <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+
+      </a-table>
+    </div>
+
+    <rmWtqd-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></rmWtqd-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import RmWtqdModal from './modules/RmWtqdModal'
+
+  export default {
+    name: "RmWtqdList",
+    mixins:[JeecgListMixin],
+    components: { RmWtqdModal },
+    props:{
+      mainId:{
+        type:String,
+        default:'',
+        required:false
+      }
+    },
+    watch:{
+      mainId:{
+        immediate: true,
+        handler(val) {
+          if(!this.mainId){
+            this.clearList()
+          }else{
+            this.queryParam['mainId'] = val
+            this.loadData(1);
+          }
+        }
+      }
+    },
+    data () {
+      return {
+        description: '基本信息表管理页面',
+        disableMixinCreated:true,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'问题序号',
+            align:"center",
+            dataIndex: 'wtxh'
+          },
+          {
+            title:'问题类别',
+            align:"center",
+            dataIndex: 'wtlb_dictText',
+          },
+          {
+            title:'主要问题',
+            align:"center",
+            dataIndex: 'zywt'
+          },
+          {
+            title:'行政区划',
+            align:"center",
+            dataIndex: 'xzqh'
+          },
+          {
+            title:'岸别',
+            align:"center",
+            dataIndex: 'ab'
+          },
+          {
+            title:'所在位置',
+            align:"center",
+            dataIndex: 'szwz'
+          },
+          {
+            title:'经度',
+            align:"center",
+            dataIndex: 'jd'
+          },
+          {
+            title:'纬度',
+            align:"center",
+            dataIndex: 'wd'
+          },
+          {
+            title:'问题照片',
+            align:"center",
+            dataIndex: 'wtzp',
+            scopedSlots: {customRender: 'imgSlot'}
+          },
+          {
+            title:'成因简析',
+            align:"center",
+            dataIndex: 'cyjx'
+          },
+          {
+            title:'意见/备注',
+            align:"center",
+            dataIndex: 'yjbz'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/hzz.yhyc/rmJbxx/listRmWtqdByMainId",
+          delete: "/hzz.yhyc/rmJbxx/deleteRmWtqd",
+          deleteBatch: "/hzz.yhyc/rmJbxx/deleteBatchRmWtqd",
+          exportXlsUrl: "/hzz.yhyc/rmJbxx/exportRmWtqd",
+          importUrl: "/hzz.yhyc/rmJbxx/importRmWtqd",
+        },
+        dictOptions:{
+         hdmc:[],
+        },
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl(){
+        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
+      }
+    },
+    methods: {
+      clearList(){
+        this.dataSource=[]
+        this.selectedRowKeys=[]
+        this.ipagination.current = 1
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'hdmc',text:'河段名称',dictCode:'hlmc'})
+        fieldList.push({type:'string',value:'famc',text:'方案名称',dictCode:''})
+        fieldList.push({type:'date',value:'bzrq',text:'编制日期'})
+        fieldList.push({type:'date',value:'ksnf',text:'开始年月'})
+        fieldList.push({type:'date',value:'zznf',text:'终止年月'})
+        fieldList.push({type:'string',value:'bzdw',text:'编制单位',dictCode:''})
+        fieldList.push({type:'string',value:'bz',text:'备注',dictCode:''})
+        fieldList.push({type:'string',value:'wbfa',text:'文本方案',dictCode:''})
+        fieldList.push({type:'string',value:'xgtj',text:'相关图件',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

Some files were not shown because too many files changed in this diff