Parcourir la source

Merge branch 'master' of http://git.cc-lotus.info/financial_platform/admin-cms

reloaded il y a 5 ans
Parent
commit
19754da219
81 fichiers modifiés avec 7532 ajouts et 1059 suppressions
  1. 9 5
      src/layout/character/characterList.vue
  2. 28 20
      src/layout/common/searchInfo.vue
  3. 6 5
      src/layout/companyidentify/detailInfo.vue
  4. 22 27
      src/layout/companyidentify/newsInfo.vue
  5. 5 3
      src/layout/companyup/detailInfo.vue
  6. 25 27
      src/layout/companyup/newsInfo.vue
  7. 11 7
      src/layout/companyuser/companyuserList.vue
  8. 164 0
      src/layout/companyuser/userForm.vue
  9. 54 0
      src/layout/custom/detailTopInfo.vue
  10. 55 0
      src/layout/custom/topInfo.vue
  11. 112 0
      src/layout/custom/uploadImage.vue
  12. 210 0
      src/layout/digitalService/digitalServiceForm.vue
  13. 241 0
      src/layout/digitalService/digitalServiceList.vue
  14. 210 0
      src/layout/financialService/financialServiceForm.vue
  15. 241 0
      src/layout/financialService/financialServiceList.vue
  16. 68 78
      src/layout/institution/detailInfo.vue
  17. 13 6
      src/layout/institution/newsInfo.vue
  18. 61 3
      src/layout/layout-part/heads.vue
  19. 20 6
      src/layout/layout-part/menus.vue
  20. 210 0
      src/layout/legalService/legalServiceForm.vue
  21. 241 0
      src/layout/legalService/legalServiceList.vue
  22. 210 0
      src/layout/marketService/marketServiceForm.vue
  23. 241 0
      src/layout/marketService/marketServiceList.vue
  24. 206 78
      src/layout/news/newsForm.vue
  25. 241 64
      src/layout/news/newsList.vue
  26. 2 0
      src/layout/otheruser/otheruserForm.vue
  27. 9 6
      src/layout/otheruser/otheruserList.vue
  28. 1 0
      src/layout/region/regionForm.vue
  29. 6 5
      src/layout/region/regionList.vue
  30. 198 85
      src/layout/specialist/zhuanjiaForm.vue
  31. 222 59
      src/layout/specialist/zhuanjiaList.vue
  32. 213 0
      src/layout/tInformationDelivery/tInformationDeliveryForm.vue
  33. 247 0
      src/layout/tInformationDelivery/tInformationDeliveryList.vue
  34. 210 0
      src/layout/tPolicyInterpretation/tPolicyInterpretationForm.vue
  35. 246 0
      src/layout/tPolicyInterpretation/tPolicyInterpretationList.vue
  36. 210 0
      src/layout/technicalService/technicalServiceForm.vue
  37. 241 0
      src/layout/technicalService/technicalServiceList.vue
  38. 151 34
      src/layout/zhidao/zhidaoForm.vue
  39. 208 63
      src/layout/zhidao/zhidaoList.vue
  40. 69 1
      src/router/index.js
  41. 34 0
      src/store/dictionary.js
  42. 16 0
      src/store/index.js
  43. 6 0
      src/store/otheruser.js
  44. 38 0
      src/store/tDeclarationApproval.js
  45. 38 0
      src/store/tDigitalService.js
  46. 38 0
      src/store/tFinancingExpert.js
  47. 38 0
      src/store/tGuidanceUnit.js
  48. 38 0
      src/store/tInformationDelivery.js
  49. 38 0
      src/store/tNewsCenter.js
  50. 38 0
      src/store/tPolicyInterpretation.js
  51. 17 4
      src/views/character/index.vue
  52. 7 5
      src/views/companyidentify/detail.vue
  53. 45 7
      src/views/companyidentify/index.vue
  54. 4 3
      src/views/companyup/detail.vue
  55. 41 12
      src/views/companyup/index.vue
  56. 108 0
      src/views/companyuser/detail.vue
  57. 25 19
      src/views/companyuser/index.vue
  58. 102 0
      src/views/digitalService/detail.vue
  59. 82 0
      src/views/digitalService/index.vue
  60. 102 0
      src/views/financialService/detail.vue
  61. 82 0
      src/views/financialService/index.vue
  62. 17 2
      src/views/institution/detail.vue
  63. 67 22
      src/views/institution/index.vue
  64. 102 0
      src/views/legalService/detail.vue
  65. 82 0
      src/views/legalService/index.vue
  66. 102 0
      src/views/marketService/detail.vue
  67. 82 0
      src/views/marketService/index.vue
  68. 79 86
      src/views/news/detail.vue
  69. 65 64
      src/views/news/index.vue
  70. 30 4
      src/views/otheruser/index.vue
  71. 17 2
      src/views/region/index.vue
  72. 76 86
      src/views/specialist/detail.vue
  73. 65 62
      src/views/specialist/index.vue
  74. 117 0
      src/views/tInformationDelivery/detail.vue
  75. 83 0
      src/views/tInformationDelivery/index.vue
  76. 117 0
      src/views/tPolicyInterpretation/detail.vue
  77. 83 0
      src/views/tPolicyInterpretation/index.vue
  78. 102 0
      src/views/technicalService/detail.vue
  79. 82 0
      src/views/technicalService/index.vue
  80. 49 59
      src/views/zhidao/detail.vue
  81. 41 40
      src/views/zhidao/index.vue

+ 9 - 5
src/layout/character/characterList.vue

@@ -26,11 +26,11 @@
             @size-change="handleSizeChange"
             @current-change="handleCurrentChange"
             :current-page="currentPage"
-            :page-sizes="[10, 20, 30, 40]"
-            :page-size="10"
             background
-            layout="total, sizes, prev, pager, next, jumper"
+            layout="total,  prev, pager, next, jumper"
             :total="total"
+            :page-size="pageSize"
+            
           >
           </el-pagination>
         </el-row>
@@ -49,6 +49,7 @@ export default {
   components: {},
   data: () => ({
     currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {},
@@ -59,8 +60,11 @@ export default {
     handleSelectionChange(val) {
       this.multipleSelection = val;
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+
+    handleCurrentChange(currentPage) {
+      console.log(currentPage);
+
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
     deleteRow(id) {
       this.$emit('deleteRow', id);

+ 28 - 20
src/layout/common/searchInfo.vue

@@ -2,25 +2,24 @@
   <div id="searchInfo">
     <el-row>
       <el-col :span="24">
-        <el-col :span="5">
-          <span>筛选条件:</span>
-          <el-select v-model="search.region" placeholder="请选择">
-            <el-option label="类型一" value="0"></el-option>
-            <el-option label="类型二" value="1"></el-option>
-          </el-select>
-        </el-col>
-        <el-col :span="4">
-          <span>输入条件:</span>
-          <el-input v-model="search.input" placeholder="请输入" class="input"></el-input>
-        </el-col>
-        <el-col :span="7">
-          <span>时间选择:</span>
-          <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
-        </el-col>
-        <el-col :span="8">
-          <el-button class="btnSearch">查询</el-button>
-          <el-button class="btnSearch qing">清空</el-button>
-        </el-col>
+        <el-form :model="search" ref="search">
+          <!-- <el-col :span="5">
+            <span>筛选条件:</span>
+
+            <el-select v-model="search.region" placeholder="请选择">
+              <el-option label="类型一" value="0"></el-option>
+              <el-option label="类型二" value="1"></el-option>
+            </el-select>
+          </el-col> -->
+          <el-col :span="5">
+            <span>输入条件:</span>
+            <el-input v-model="search.name" placeholder="请输入名称" class="input"></el-input>
+          </el-col>
+
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="resetForm(search)">查询</el-button>
+          </el-col>
+        </el-form>
       </el-col>
     </el-row>
   </div>
@@ -36,7 +35,11 @@ export default {
   }),
   created() {},
   computed: {},
-  methods: {},
+  methods: {
+    resetForm(search) {
+      this.$emit('sousuo', search);
+    },
+  },
 };
 </script>
 
@@ -59,4 +62,9 @@ export default {
 .qing {
   background: rgba(185, 185, 185, 1);
 }
+/deep/.el-input__inner {
+  height: 35px;
+  line-height: 35px;
+  width: 200px;
+}
 </style>

+ 6 - 5
src/layout/companyidentify/detailInfo.vue

@@ -3,17 +3,18 @@
     <el-row>
       <el-col :span="24" class="form">
         <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="140px" class="demo-ruleForm">
+          <span v-if="ruleForm.status === '1' || ruleForm.status === '1'">
+            <el-form-item label="认证状态:">
+              <span>{{ ruleForm.status === '0' ? '认证中' : ruleForm.status === '1' ? '认证通过' : '认证失败' }}</span>
+            </el-form-item>
+          </span>
           <el-form-item label="营业执照图片:">
             <el-image :src="ruleForm.business_license"></el-image>
           </el-form-item>
           <el-form-item label="企业名称:">
             <span>{{ ruleForm.company_name }}</span>
           </el-form-item>
-          <span v-if="ruleForm.status === '1' || ruleForm.status === '1'">
-            <el-form-item label="认证状态:">
-              <span>{{ ruleForm.status === '0' ? '认证中' : ruleForm.status === '1' ? '认证通过' : '认证失败' }}</span>
-            </el-form-item>
-          </span>
+
           <el-form-item label="成立日期:">
             <span>{{ ruleForm.establish_date }}</span>
           </el-form-item>

+ 22 - 27
src/layout/companyidentify/newsInfo.vue

@@ -5,9 +5,6 @@
         <template>
           <el-tabs v-model="activeName" @tab-click="handleClicks">
             <el-tab-pane label="认证中" name="first">
-              <el-col :span="24" class="info">
-                <searchInfo></searchInfo>
-              </el-col>
               <el-table
                 ref="debtTable"
                 :data="debtTable"
@@ -42,19 +39,15 @@
                   @size-change="handleSizeChange"
                   @current-change="handleCurrentChange"
                   :current-page="currentPage"
-                  :page-sizes="[10, 20, 30, 40]"
-                  :page-size="10"
                   background
-                  layout="total, sizes, prev, pager, next, jumper"
+                  layout="total, prev, pager, next, jumper"
                   :total="total"
+                  :page-size="pageSize"
                 >
                 </el-pagination>
               </el-col>
             </el-tab-pane>
             <el-tab-pane label="认证成功" name="second">
-              <el-col :span="24" class="info">
-                <searchInfo></searchInfo>
-              </el-col>
               <el-table
                 ref="shenheTable"
                 :data="shenheTable"
@@ -86,21 +79,17 @@
               <el-col class="page" :span="24">
                 <el-pagination
                   @size-change="handleSizeChange"
-                  @current-change="handleCurrentChange"
+                  @current-change="handleCurrentChanges"
                   :current-page="currentPage"
-                  :page-sizes="[10, 20, 30, 40]"
-                  :page-size="10"
                   background
-                  layout="total, sizes, prev, pager, next, jumper"
+                  layout="total,  prev, pager, next, jumper"
                   :total="totals"
+                  :page-size="pageSize"
                 >
                 </el-pagination>
               </el-col>
             </el-tab-pane>
             <el-tab-pane label="认证失败" name="third">
-              <el-col :span="24" class="info">
-                <searchInfo></searchInfo>
-              </el-col>
               <el-table
                 ref="noshenhetable"
                 :data="noshenhetable"
@@ -133,13 +122,12 @@
               <el-col class="page" :span="24">
                 <el-pagination
                   @size-change="handleSizeChange"
-                  @current-change="handleCurrentChange"
+                  @current-change="handleCurrentChangess"
                   :current-page="currentPage"
-                  :page-sizes="[10, 20, 30, 40]"
-                  :page-size="10"
                   background
-                  layout="total, sizes, prev, pager, next, jumper"
+                  layout="total,  prev, pager, next, jumper"
                   :total="totalss"
+                  :page-size="pageSize"
                 >
                 </el-pagination>
               </el-col>
@@ -152,7 +140,6 @@
 </template>
 
 <script>
-import searchInfo from '@/layout/common/searchInfo.vue';
 export default {
   name: 'newsInfo',
   props: {
@@ -163,13 +150,12 @@ export default {
     totals: null,
     totalss: null,
   },
-  components: {
-    searchInfo,
-  },
+  components: {},
   data: () => ({
     activeName: 'first',
     input: '',
-    currentPage: 1,
+    currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {
@@ -184,8 +170,17 @@ export default {
     handleSizeChange(val) {
       console.log(`每页 ${val} 条`);
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+    handleCurrentChange(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
+    },
+    handleCurrentChanges(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChanges', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
+    },
+    handleCurrentChangess(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChangess', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
 
     handleClicks(tab, event) {

+ 5 - 3
src/layout/companyup/detailInfo.vue

@@ -3,14 +3,16 @@
     <el-row>
       <el-col :span="24">
         <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
-          <el-form-item label="企业名称:">
-            <span>{{ ruleForm.company_name }}</span>
-          </el-form-item>
           <span v-if="ruleForm.status === '1' || ruleForm.status === '2'">
             <el-form-item label="审核状态:">
               <span>{{ ruleForm.status === '0' ? '审核中' : ruleForm.status === '1' ? '审核通过' : '审核拒绝' }}</span>
             </el-form-item>
           </span>
+
+          <el-form-item label="企业名称:">
+            <span>{{ ruleForm.company_name }}</span>
+          </el-form-item>
+
           <el-form-item label="工商注册地址:">
             <span>{{ ruleForm.registered_addr }}</span>
           </el-form-item>

+ 25 - 27
src/layout/companyup/newsInfo.vue

@@ -5,9 +5,6 @@
         <template>
           <el-tabs v-model="activeName" @tab-click="handleClicks">
             <el-tab-pane label="审核中" name="first">
-              <el-col :span="24" class="info">
-                <searchInfo></searchInfo>
-              </el-col>
               <el-table
                 ref="debtTable"
                 :data="debtTable"
@@ -45,19 +42,15 @@
                   @size-change="handleSizeChange"
                   @current-change="handleCurrentChange"
                   :current-page="currentPage"
-                  :page-sizes="[10, 20, 30, 40]"
-                  :page-size="10"
                   background
-                  layout="total, sizes, prev, pager, next, jumper"
+                  layout="total,  prev, pager, next, jumper"
                   :total="total"
+                  :page-size="pageSize"
                 >
                 </el-pagination>
               </el-col>
             </el-tab-pane>
             <el-tab-pane label="审核通过" name="second">
-              <el-col :span="24" class="info">
-                <searchInfo></searchInfo>
-              </el-col>
               <el-table
                 ref="shenheTable"
                 :data="shenheTable"
@@ -88,21 +81,17 @@
               <el-col class="page" :span="24">
                 <el-pagination
                   @size-change="handleSizeChange"
-                  @current-change="handleCurrentChange"
+                  @current-change="handleCurrentChanges"
                   :current-page="currentPage"
-                  :page-sizes="[10, 20, 30, 40]"
-                  :page-size="10"
                   background
-                  layout="total, sizes, prev, pager, next, jumper"
-                  total="totals"
+                  layout="total, prev, pager, next, jumper"
+                  :total="totals"
+                  :page-size="pageSize"
                 >
                 </el-pagination>
               </el-col>
             </el-tab-pane>
             <el-tab-pane label="审核拒绝" name="third">
-              <el-col :span="24" class="info">
-                <searchInfo></searchInfo>
-              </el-col>
               <el-table
                 ref="noshenhetable"
                 :data="noshenhetable"
@@ -135,13 +124,12 @@
               <el-col class="page" :span="24">
                 <el-pagination
                   @size-change="handleSizeChange"
-                  @current-change="handleCurrentChange"
+                  @current-change="handleCurrentChangess"
                   :current-page="currentPage"
-                  :page-sizes="[10, 20, 30, 40]"
-                  :page-size="10"
                   background
-                  layout="total, sizes, prev, pager, next, jumper"
+                  layout="total,  prev, pager, next, jumper"
                   :total="totalss"
+                  :page-size="pageSize"
                 >
                 </el-pagination> </el-col
             ></el-tab-pane>
@@ -153,7 +141,6 @@
 </template>
 
 <script>
-import searchInfo from '@/layout/common/searchInfo.vue';
 export default {
   name: 'newsInfo',
   props: {
@@ -164,13 +151,13 @@ export default {
     totals: null,
     totalss: null,
   },
-  components: {
-    searchInfo,
-  },
+  components: {},
   data: () => ({
     currentPage: 1,
     activeName: 'first',
     input: '',
+    currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {
@@ -185,9 +172,20 @@ export default {
     handleSizeChange(val) {
       console.log(`每页 ${val} 条`);
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+
+    handleCurrentChange(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
+    },
+    handleCurrentChanges(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChanges', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
+    handleCurrentChangess(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChangess', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
+    },
+
     handleClicks(tab, event) {
       console.log(tab, event);
     },

+ 11 - 7
src/layout/companyuser/companyuserList.vue

@@ -18,7 +18,7 @@
             <el-table-column property="phone" label="手机号" align="center"> </el-table-column>
             <el-table-column label="操作" align="center" width="300px">
               <template slot-scope="scope">
-                <el-button @click.native.prevent="deleteRow(scope.$index, debtTable)" type="text"><i class="el-icon-delete"></i></el-button>
+                <el-button class="delete" @click.prevent="deleteRow(scope.row.id)" type="text"><i class="el-icon-delete"></i></el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -27,11 +27,10 @@
               @size-change="handleSizeChange"
               @current-change="handleCurrentChange"
               :current-page="currentPage"
-              :page-sizes="[10, 20, 30, 40]"
-              :page-size="10"
               background
-              layout="total, sizes, prev, pager, next, jumper"
+              layout="total, prev, pager, next, jumper"
               :total="total"
+              :page-size="pageSize"
             >
             </el-pagination>
           </el-row>
@@ -51,6 +50,7 @@ export default {
   components: {},
   data: () => ({
     currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {},
@@ -61,13 +61,17 @@ export default {
     handleSizeChange(val) {
       console.log(`每页 ${val} 条`);
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+
+    deleteRow(id) {
+      this.$emit('deleteRow', id);
+    },
+    handleCurrentChange(currentPage) {
+      console.log(currentPage);
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
     handleClick(id) {
       console.log(id.id);
       let newid = id.id;
-
       this.$emit('handleClick', newid);
     },
   },

+ 164 - 0
src/layout/companyuser/userForm.vue

@@ -0,0 +1,164 @@
+<template>
+  <div id="otheruserForm">
+    <el-row>
+      <el-col :span="24" class="top">
+        <span class="shu"></span><span class="title">{{ formTitle }}</span>
+      </el-col>
+      <el-col :span="24" class="form">
+        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+          <el-col :span="24">
+            <el-form-item label="企业名称" prop="company_name">
+              <el-input v-model="ruleForm.company_name" placeholder="企业名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="手机号" prop="phone">
+              <el-input v-model="ruleForm.phone" placeholder="请输入手机号"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="注册密码" prop="passwd">
+              <el-input v-model="ruleForm.passwd" placeholder="请输入注册密码"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="请输入推荐单位名称" prop="institution_name">
+              <el-input v-model="ruleForm.institution_name" placeholder="请输入推荐单位名称"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24" class="clickBtn">
+            <el-form-item>
+              <el-button type="primary" size="small" @click="submitForm('ruleForm')">提交</el-button>
+              <el-button size="small" @click="resetForm('ruleForm')">取消</el-button>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'otheruserForm',
+  props: {
+    ruleForm: null,
+    charList: null,
+    formTitle: null,
+  },
+  components: {},
+  data: () => ({
+    rules: {
+      // name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+      // phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+      // type: [{ required: true, message: '请选择用户类型', trigger: 'change' }],
+      // characterid: [{ required: true, message: '请选择用角色', trigger: 'change' }],
+    },
+  }),
+  created() {},
+  computed: {},
+  methods: {
+    submitForm() {
+      this.$emit('submitForm', { data: this.ruleForm });
+    },
+    resetForm() {
+      this.$emit('resetForm');
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.top .shu {
+  float: left;
+  width: 4px;
+  height: 20px;
+  background: rgba(233, 2, 29, 1);
+}
+.top .title {
+  float: left;
+  padding: 0 10px;
+  font-size: 16px;
+  font-family: Source Han Sans SC;
+  font-weight: bold;
+  color: rgba(40, 40, 40, 1);
+}
+/deep/.el-textarea__inner {
+  min-height: 100px !important;
+}
+/deep/.select {
+  width: 632px;
+}
+.selects {
+  width: 473px;
+  margin: 0 15px 0 0;
+}
+/deep/.el-radio__input.is-checked + .el-radio__label {
+  color: #e9021d;
+}
+/deep/.el-radio__input.is-checked .el-radio__inner {
+  border-color: #e9021d;
+  background: #e9021d;
+}
+/deep/.el-checkbox__input.is-checked + .el-checkbox__label {
+  color: #e9021d;
+}
+/deep/.el-checkbox__input.is-checked .el-checkbox__inner,
+.el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: #e9021d;
+  border-color: #e9021d;
+}
+/deep/.el-checkbox-button,
+.el-checkbox-button__inner {
+  margin: 0 15px 0 0;
+}
+/deep/.el-checkbox-button__inner {
+  padding: 7px 5px;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+}
+/deep/.el-checkbox-button__inner:hover {
+  color: #e9021d;
+}
+/deep/.el-checkbox-button:first-child .el-checkbox-button__inner {
+  border-left: 1px solid #ccc;
+  border-radius: 5px;
+}
+/deep/.el-checkbox-button:last-child .el-checkbox-button__inner {
+  border-radius: 5px;
+}
+/deep/.el-checkbox-button.is-checked .el-checkbox-button__inner {
+  color: #e9021d;
+  background-color: #ffffff;
+  border-color: #e9021d;
+}
+/deep/.el-checkbox-button.is-checked .el-checkbox-button__inner {
+  box-shadow: none;
+}
+/deep/.el-switch.is-checked .el-switch__core {
+  border-color: #e9021d;
+  background-color: #e9021d;
+}
+.clickBtn .el-button {
+  width: 100px;
+  height: 40px;
+  padding: 0;
+  color: #ffffff;
+  background: #b9b9b9;
+  border-radius: 4px;
+  margin: 40px;
+}
+.clickBtn {
+  text-align: center;
+  margin: 40px 0;
+  border-top: 1px solid #ccc;
+}
+.clickBtn .el-button:first-child {
+  background-color: #e9021d;
+}
+</style>

+ 54 - 0
src/layout/custom/detailTopInfo.vue

@@ -0,0 +1,54 @@
+<template>
+  <div id="detailTopInfo">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="20" class="menu">
+          <el-breadcrumb separator-class="el-icon-arrow-right">
+            <el-breadcrumb-item>所在位置:</el-breadcrumb-item>
+            <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+            <el-breadcrumb-item>{{ topTitle }}</el-breadcrumb-item>
+          </el-breadcrumb>
+        </el-col>
+        <span v-if="display === 'block'">
+          <el-col :span="4" class="btn">
+            <el-button @click="goBack">返回</el-button>
+          </el-col>
+        </span>
+        <span v-else> </span>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'detailTopInfo',
+  props: {
+    topTitle: null,
+    display: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {
+    goBack() {
+      this.$emit('goBack');
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.menu {
+  padding: 14px 0;
+}
+.btn {
+  padding: 5px 0;
+  text-align: right;
+}
+/deep/.btn .el-button {
+  background: red;
+  color: #fff;
+}
+</style>

+ 55 - 0
src/layout/custom/topInfo.vue

@@ -0,0 +1,55 @@
+<template>
+  <div id="topInfo">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="20" class="menu">
+          <el-breadcrumb separator-class="el-icon-arrow-right">
+            <el-breadcrumb-item>所在位置:</el-breadcrumb-item>
+            <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+            <el-breadcrumb-item>{{ topTitle }}</el-breadcrumb-item>
+          </el-breadcrumb>
+        </el-col>
+        <span v-if="display === 'block'">
+          <el-col :span="4" class="btn">
+            <!--<el-button>批量导出</el-button>-->
+            <el-button @click="add">创建任务</el-button>
+          </el-col>
+        </span>
+        <span v-else> </span>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'topInfo',
+  props: {
+    topTitle: null,
+    display: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {
+    add() {
+      this.$emit('add');
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.menu {
+  padding: 14px 0;
+}
+.btn {
+  padding: 5px 0;
+  text-align: right;
+}
+/deep/.btn .el-button {
+  background: red;
+  color: #fff;
+}
+</style>

+ 112 - 0
src/layout/custom/uploadImage.vue

@@ -0,0 +1,112 @@
+<template>
+  <div id="uploadImage">
+    <el-upload
+            v-if="url"
+            ref="upload"
+            :action="url"
+            :list-type="listType"
+            :file-list="fileList"
+            :limit="limit"
+            :on-exceed="outLimit"
+            :on-preview="handlePictureCardPreview"
+            :on-remove="handleRemove"
+            :on-success="onSuccess"
+            :show-file-list="showList"
+            :accept="accept"
+    >
+      <el-button size="small" class="isBtn" v-if="isBtn">点击上传文件</el-button>
+      <template v-else>
+        <i class="el-icon-plus"></i>
+      </template>
+      <template #tip v-if="tip">
+        <span class="tip">{{ tip }}</span>
+      </template>
+    </el-upload>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <img width="100%" :src="dialogImageUrl" alt="" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'uploadImage',
+    props: {
+      url: { type: null },
+      limit: { type: Number },
+      data: { type: null },
+      isBtn: { type: Boolean, default: false },
+      showList: { type: Boolean, default: true },
+      accept: { type: String },
+      tip: { type: String, default: undefined },
+      listType: { type: String, default: 'picture-card' },
+    },
+    components: {},
+    data: () => ({
+      dialogVisible: false,
+      dialogImageUrl: '',
+      fileList: [],
+    }),
+    created() {
+    },
+    mounted(){
+    },
+    watch: {
+      data: {
+        handler(val) {
+          this.defaultProcess(val);
+        },
+        deep: true,
+        immediate: true,
+      },
+    },
+    computed: {},
+    methods: {
+      handlePictureCardPreview(file) {
+        /*let eleLink = document.createElement('a');
+        eleLink.setAttribute("download", file.name);
+        eleLink.href = file.url;
+        eleLink.style.display = 'none';
+        document.body.appendChild(eleLink);
+        eleLink.click();
+        document.body.removeChild(eleLink);*/
+        this.dialogImageUrl = file.url;
+        this.dialogVisible = true;
+      },
+      handleRemove(file) {
+        this.$emit('remove', file);
+      },
+      outLimit() {
+        this.$message.error(`只允许上传${this.limit}个文件`);
+      },
+      onSuccess(response, file, fileList) {
+        this.$emit('uploadSuccess', {data: response });
+      },
+      defaultProcess(val) {
+        if(val){
+          this.$set(this, 'fileList', [{name:val,url:val}]);
+        }else {
+          this.$set(this, 'fileList', []);
+        }
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .isBtn {
+    background-color: #e9021d;
+    color: #ffffff;
+  }
+  .links {
+    margin: 0 0 0 15px;
+  }
+  .tip {
+    padding: 0 10px;
+    display: inline-block;
+    color: #999999;
+  }
+</style>

+ 210 - 0
src/layout/digitalService/digitalServiceForm.vue

@@ -0,0 +1,210 @@
+<template>
+  <div id="digitalServiceForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="名称" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="服务" prop="service">
+              <el-input v-model="ruleForm.service" type="textarea" placeholder="请输入服务"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="联系人" prop="contact">
+              <el-input v-model="ruleForm.contact" placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="ruleForm.phone" placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="电子邮箱" prop="email">
+              <el-input v-model="ruleForm.email" placeholder="请输入电子邮箱"></el-input>
+            </el-form-item>
+            <el-form-item label="机构介绍" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入机构介绍"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'digitalServiceForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '数字化服务管理',
+      rules: {
+        title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        service: [{ required: true, message: '请输入服务', trigger: 'blur' }],
+        image: [{ required: true }],
+        contact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入联系电话'},
+                { min: 11, max: 11, message: '请输入11位联系电话', trigger: 'blur' },
+        ],
+        description: [{ required: true, message: '请输入机构介绍', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 241 - 0
src/layout/digitalService/digitalServiceList.vue

@@ -0,0 +1,241 @@
+<template>
+  <div id="digitalServiceList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <!--<el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>-->
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="名称" align="center"> </el-table-column>
+            <!--<el-table-column property="service" label="服务" align="center"> </el-table-column>-->
+            <el-table-column label="图片" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <el-table-column property="contact" label="联系人" align="center"> </el-table-column>
+            <el-table-column property="phone" label="联系电话" align="center"> </el-table-column>
+            <el-table-column property="email" label="电子邮箱" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/digitalService/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'digitalServiceList',
+    props: {
+      tableData: null,
+      total: null,
+      type: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入名称',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val,type:this.type, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit,type:this.type, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 210 - 0
src/layout/financialService/financialServiceForm.vue

@@ -0,0 +1,210 @@
+<template>
+  <div id="financialServiceForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="名称" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="服务" prop="service">
+              <el-input v-model="ruleForm.service" type="textarea" placeholder="请输入服务"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="联系人" prop="contact">
+              <el-input v-model="ruleForm.contact" placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="ruleForm.phone" placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="电子邮箱" prop="email">
+              <el-input v-model="ruleForm.email" placeholder="请输入电子邮箱"></el-input>
+            </el-form-item>
+            <el-form-item label="机构介绍" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入机构介绍"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'financialServiceForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '财务服务管理',
+      rules: {
+        title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        service: [{ required: true, message: '请输入服务', trigger: 'blur' }],
+        image: [{ required: true }],
+        contact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入联系电话'},
+                { min: 11, max: 11, message: '请输入11位联系电话', trigger: 'blur' },
+        ],
+        description: [{ required: true, message: '请输入机构介绍', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 241 - 0
src/layout/financialService/financialServiceList.vue

@@ -0,0 +1,241 @@
+<template>
+  <div id="financialServiceList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <!--<el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>-->
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="名称" align="center"> </el-table-column>
+            <!--<el-table-column property="service" label="服务" align="center"> </el-table-column>-->
+            <el-table-column label="图片" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <el-table-column property="contact" label="联系人" align="center"> </el-table-column>
+            <el-table-column property="phone" label="联系电话" align="center"> </el-table-column>
+            <el-table-column property="email" label="电子邮箱" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/financialService/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'financialServiceList',
+    props: {
+      tableData: null,
+      total: null,
+      type: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入名称',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val,type:this.type, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit,type:this.type, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 68 - 78
src/layout/institution/detailInfo.vue

@@ -5,7 +5,7 @@
         <el-col :span="24" class="top">
           <span class="shu"></span><span class="title">{{ formTitle }}</span>
         </el-col>
-        <el-col :span="24" class="form">
+        <el-col :span="24">
           <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
             <el-col :span="24">
               <el-form-item label="金融机构名称" prop="name">
@@ -13,98 +13,89 @@
               </el-form-item>
             </el-col>
             <el-col :span="24">
-              <!-- <el-form-item label="logo" prop="logo">
+              <el-form-item label="机构logo" prop="logo">
                 <upload
                   :limit="1"
+                  tip="请上传500×500px的图片,大小不超过2M"
                   :data="ruleForm.logo"
                   type="logo"
-                  tip="请上传500×500px的图片,大小不超过2M"
-                  :url="`/files/test/upload`"
+                  :url="`/files/teacher/upload`"
                   @upload="uploadSuccess"
                 ></upload>
-              </el-form-item> -->
+              </el-form-item>
             </el-col>
-            <el-form-item label="机构logo" prop="logo">
-              <upload
-                :limit="1"
-                tip="请上传500×500px的图片,大小不超过2M"
-                :data="ruleForm.logo"
-                type="logo"
-                :url="`/files/teacher/upload`"
-                @upload="uploadSuccess"
-              ></upload>
-            </el-form-item>
-            <el-col :span="24" class="form">
-              <el-form-item label="融资轮次">
-                <el-select v-model="ruleForm.round" multiple placeholder="请选择">
-                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+            <el-col :span="24">
+              <el-form-item label="融资轮次" prop="round">
+                <el-select v-model="ruleForm.round" multiple placeholder="请选择融资轮次">
+                  <el-option v-for="item in rzlc" :key="item.value" :label="item.name" :value="item.name"> </el-option>
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="组织形式">
+            <el-col :span="24">
+              <el-form-item label="组织形式" prop="form">
                 <el-input v-model="ruleForm.form" placeholder="请输入组织形式"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="法定代表人">
-                <el-input v-model="ruleForm.representative" placeholder="请输入组织形式"></el-input>
+            <el-col :span="24">
+              <el-form-item label="法定代表人" prop="representative">
+                <el-input v-model="ruleForm.representative" placeholder="请输入法定代表人"></el-input>
               </el-form-item>
             </el-col>
 
-            <el-col :span="24" class="form">
-              <el-form-item label="办公区域">
+            <el-col :span="24">
+              <el-form-item label="办公区域" prop="business_addr">
                 <el-input v-model="ruleForm.business_addr" placeholder="请输入办公区域"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="注册地址">
+            <el-col :span="24">
+              <el-form-item label="注册地址" prop="registered_addr">
                 <el-input v-model="ruleForm.registered_addr" placeholder="请输入注册地址"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="创立时间">
+            <el-col :span="24">
+              <el-form-item label="创立时间" prop="establish_time">
                 <el-input v-model="ruleForm.establish_time" placeholder="请输入创立时间"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="所属行业">
+            <el-col :span="24">
+              <el-form-item label="所属行业" prop="profession">
                 <el-select v-model="ruleForm.profession" multiple placeholder="请选择">
-                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+                  <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.name"> </el-option>
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="组织机构号码">
+            <el-col :span="24">
+              <el-form-item label="组织机构号码" prop="code">
                 <el-input v-model="ruleForm.code" placeholder="请输入组织机构号码"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="管理资金规模">
-                <el-input v-model="ruleForm.size" placeholder="请输入管理资金规模"></el-input>
+            <el-col :span="24">
+              <el-form-item label="所属地区" prop="belong_addr">
+                <el-input v-model="ruleForm.belong_addr" placeholder="请输入所属地区"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="注册资本">
-                <el-input v-model="ruleForm.registered_capital" placeholder="请输入注册资本"></el-input>
+
+            <el-col :span="24">
+              <el-form-item label="管理资金规模" prop="size">
+                <el-input v-model="ruleForm.size" placeholder="请输入管理资金规模"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="注册资本">
+            <el-col :span="24">
+              <el-form-item label="注册资本" prop="registered_capital">
                 <el-input v-model="ruleForm.registered_capital" placeholder="请输入注册资本"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
-              <el-form-item label="实缴资金">
+
+            <el-col :span="24">
+              <el-form-item label="实缴资金" prop="contributed_capital">
                 <el-input v-model="ruleForm.contributed_capital" placeholder="请输入实缴资金"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="form">
+            <el-col :span="24">
               <el-form-item label="机构简介" prop="introduction">
                 <el-input v-model="ruleForm.introduction" type="textarea" placeholder="请输入机构简介"></el-input>
               </el-form-item>
             </el-col>
-
             <el-col :span="24"> </el-col>
             <el-col :span="24">
               <el-form-item label="机构类型" prop="type">
@@ -115,6 +106,16 @@
                 </el-select>
               </el-form-item>
             </el-col>
+            <el-col :span="24">
+              <el-form-item label="发布状态" prop="status">
+                <el-select v-model="ruleForm.status" placeholder="请选择发布状态">
+                  <el-option label="草稿" value="0"></el-option>
+                  <el-option label="待审核" value="1"></el-option>
+                  <el-option label="已发布" value="2"></el-option>
+                  <el-option label="已下架" value="3"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
             <el-col :span="24" class="clickBtn">
               <el-form-item>
                 <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
@@ -135,21 +136,32 @@ export default {
   props: {
     formTitle: null,
     ruleForm: null,
+    options: null,
+    rzlc: null,
   },
   components: {
     upload, //图片上传
   },
   data: () => ({
     rules: {
-      name1: [{ required: true, message: '请输入名称', trigger: 'blur' }],
-      name2: [{ required: true, message: '请输入名称', trigger: 'blur' }],
-      textarea: [{ required: true, message: '请输入文本框', trigger: 'blur' }],
-      change: [{ required: true, message: '请选择', trigger: 'blur' }],
-      radio: [{ required: true, message: '请选择', trigger: 'blur' }],
-      checkbox: [{ required: true, message: '请选择', trigger: 'blur' }],
-      term: [{ required: true, message: '请选择', trigger: 'blur' }],
-      onDown: [{ required: true, message: '请选择', trigger: 'blur' }],
-      file: [{ required: true, message: '请选择', trigger: 'blur' }],
+      name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
+      type: [{ required: true, message: '请选择机构类型', trigger: 'blur' }],
+      profession: [{ required: true, message: '请选择所属行业', trigger: 'blur' }],
+      form: [{ required: true, message: '请输人组织形式', trigger: 'blur' }],
+      round: [{ required: true, message: '请选择融资轮次', trigger: 'blur' }],
+      representative: [{ required: true, message: '请输人法定代表人', trigger: 'blur' }],
+      business_addr: [{ required: true, message: '请输人办公地址', trigger: 'blur' }],
+      belong_addr: [{ required: true, message: '请输人所属地区', trigger: 'blur' }],
+      registered_addr: [{ required: true, message: '请输人注册地址', trigger: 'blur' }],
+      establish_time: [{ required: true, message: '请输人创立时间', trigger: 'blur' }],
+      establish_time: [{ required: true, message: '请输人创立时间', trigger: 'blur' }],
+      size: [{ required: true, message: '请输入管理资金规模', trigger: 'blur' }],
+      registered_capital: [{ required: true, message: '请输入注册资本', trigger: 'blur' }],
+      introduction: [{ required: true, message: '请输入机构简介', trigger: 'blur' }],
+      registered_capital: [{ required: true, message: '请输入注册资本', trigger: 'blur' }],
+      contributed_capital: [{ required: true, message: '请输入实缴资金', trigger: 'blur' }],
+      status: [{ required: true, message: '请选择发布状态', trigger: 'blur' }],
+      belong_addr: [{ required: true, message: '请输入所属地区', trigger: 'blur' }],
     },
 
     props: { multiple: true },
@@ -157,28 +169,6 @@ export default {
     value: [],
     value: [],
 
-    options: [
-      {
-        value: '选项1',
-        label: '黄金糕',
-      },
-      {
-        value: '选项2',
-        label: '双皮奶',
-      },
-      {
-        value: '选项3',
-        label: '蚵仔煎',
-      },
-      {
-        value: '选项4',
-        label: '龙须面',
-      },
-      {
-        value: '选项5',
-        label: '北京烤鸭',
-      },
-    ],
     value1: [],
     value2: [],
   }),

+ 13 - 6
src/layout/institution/newsInfo.vue

@@ -31,7 +31,7 @@
                 <!-- <el-button @click="handleClick(scope.row)" type="text"><i class="el-icon-edit"></i></el-button>
                 <el-button @click.native.prevent="deleteRow(scope.$index, debtTable)" type="text"><i class="el-icon-delete"></i></el-button> -->
                 <el-button size="mini" type="text" class="edit" icon="el-icon-edit" @click="handleClick(scope.row)"></el-button>
-                <el-button size="mini" type="text" class="delete" icon="el-icon-delete" @click.native.prevent="deleteRow(scope.$index, debtTable)"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete" @click.prevent="deleteRow(scope.row.id)"></el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -40,11 +40,10 @@
               @size-change="handleSizeChange"
               @current-change="handleCurrentChange"
               :current-page="currentPage"
-              :page-sizes="[10, 20, 30, 40]"
-              :page-size="10"
               background
-              layout="total, sizes, prev, pager, next, jumper"
+              layout="total, prev, pager, next, jumper"
               :total="total"
+              :page-size="pageSize"
             >
             </el-pagination>
           </el-row>
@@ -60,10 +59,13 @@ export default {
   props: {
     debtTable: null,
     total: null,
+    totals: null,
+    totalss: null,
   },
   components: {},
   data: () => ({
     currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {},
@@ -74,8 +76,13 @@ export default {
     handleSizeChange(val) {
       console.log(`每页 ${val} 条`);
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+    deleteRow(id) {
+      this.$emit('deleteRow', id);
+    },
+    handleCurrentChange(currentPage) {
+      console.log(currentPage);
+
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
     handleClick(id) {
       console.log(id.id);

+ 61 - 3
src/layout/layout-part/heads.vue

@@ -2,12 +2,32 @@
   <div id="heads">
     <el-row>
       <el-col :span="24">
-        <el-col :span="18" class="title">
+        <el-col :span="15" class="title">
           吉林省小微企业金融管理后台
         </el-col>
+        <el-col :span="3" class="admin"> </el-col>
+        <el-dialog title="修改密码" :visible.sync="dialogFormVisible" style="">
+          <el-form :model="form" :rules="rules">
+            <el-form-item label="旧密码" :label-width="formLabelWidth" prop="oldpasswd">
+              <el-input type="password" v-model="form.oldpasswd" autocomplete="off" placeholder="请输入旧密码"></el-input>
+            </el-form-item>
+            <el-form-item label="新密码" :label-width="formLabelWidth" prop="newpasswd">
+              <el-input type="password" v-model="form.newpasswd" autocomplete="off" placeholder="请输入新密码"></el-input>
+            </el-form-item>
+            <div class="ccc">
+              <el-form-item>
+                <el-button @click="dialogFormVisible = false">取 消</el-button>
+                <el-button type="primary" @click="onsave(form)">确 定</el-button>
+              </el-form-item>
+            </div>
+          </el-form>
+        </el-dialog>
         <el-col :span="6" class="admin">
+          <el-tooltip class="item" effect="dark" content="修改密码" placement="bottom">
+            <el-button type="text" @click="dialogFormVisible = true"><i class="el-icon-unlock"></i></el-button>
+          </el-tooltip>
           <i class="el-icon-user icon"></i>
-          <span class="name">管理员:{{ user.name }}</span>
+          <span class="name"> 管理员:{{ user.name }}</span>
           <span class="shu">|</span>
           <el-link :underline="false" class="out" @click="toLogout()">退出</el-link>
         </el-col>
@@ -18,11 +38,21 @@
 
 <script>
 import { mapState, mapMutations, createNamespacedHelpers } from 'vuex';
+const { mapActions: otheruser } = createNamespacedHelpers('otheruser');
 export default {
   name: 'heads',
   props: {},
   components: {},
-  data: () => ({}),
+  data: () => ({
+    rules: {
+      oldpasswd: [{ required: true, message: '请输入旧密码', trigger: 'blur' }],
+      newpasswd: [{ required: true, message: '请输入新密码', trigger: 'blur' }],
+    },
+    dialogTableVisible: false,
+    dialogFormVisible: false,
+    form: {},
+    formLabelWidth: '120px',
+  }),
   created() {},
   watch: {},
   computed: {
@@ -30,6 +60,8 @@ export default {
   },
   methods: {
     ...mapMutations(['deleteUser']),
+    ...otheruser(['query', 'fetch', 'updates', 'create']),
+
     async toLogout() {
       this.deleteUser();
       this.$message({
@@ -41,6 +73,20 @@ export default {
     async toLogin() {
       this.$router.push({ name: 'login' });
     },
+
+    async onsave(form) {
+      this.form.uid = this.user.uid;
+      console.log(form);
+      let res = await this.updates(form);
+      if (res.errcode === 0) {
+        this.$router.push({ path: '/login' });
+        this.$message({
+          message: '修改密码成功',
+          type: 'success',
+        });
+      }
+      // this.dialogFormVisible = false;
+    },
   },
 };
 </script>
@@ -77,4 +123,16 @@ export default {
   font-weight: 400;
   color: rgba(233, 2, 29, 1);
 }
+.ccc {
+  text-align: center;
+}
+/deep/.el-icon-unlock:before {
+  content: '\e6e4';
+  color: #ffffff;
+}
+/deep/.el-dialog {
+  height: 340px;
+
+  width: 33%;
+}
 </style>

+ 20 - 6
src/layout/layout-part/menus.vue

@@ -36,18 +36,32 @@
           <el-menu-item index="/otheruser/index">其他用户</el-menu-item>
         </el-menu-item-group>
       </el-submenu>
-      <!-- <el-submenu index="4">
+       <el-submenu index="4">
         <template v-slot:title>
           <i class="el-icon-s-grid"></i>
           <span>数字延伸服务管理</span>
         </template>
         <el-menu-item-group>
-          <el-menu-item index="/specialist/index">融资专家</el-menu-item>
-          <el-menu-item index="/otheruser/index">其他用户</el-menu-item>
+          <el-menu-item index="/financialService/index">财务服务管理</el-menu-item>
+          <el-menu-item index="/digitalService/index">数字化服务管理</el-menu-item>
+          <el-menu-item index="/legalService/index">法律服务管理</el-menu-item>
+          <el-menu-item index="/technicalService/index">技术服务管理</el-menu-item>
+          <el-menu-item index="/marketService/index">市场服务管理</el-menu-item>
+          <el-menu-item index="/specialist/index">融资专家管理</el-menu-item>
         </el-menu-item-group>
-      </el-submenu> -->
-      <!-- <el-menu-item index="/zhidao/index"> <i class="el-icon-s-grid"></i>指导单位管理</el-menu-item> -->
-      <!-- <el-menu-item index="/news/index"> <i class="el-icon-s-grid"></i>新闻中心内容管理</el-menu-item> -->
+      </el-submenu>
+      <el-submenu index="5">
+        <template v-slot:title>
+          <i class="el-icon-s-grid"></i>
+          <span>政策服务管理</span>
+        </template>
+        <el-menu-item-group>
+          <el-menu-item index="/tInformationDelivery/index">政策发布管理</el-menu-item>
+          <el-menu-item index="/tPolicyInterpretation/index">政策解读管理</el-menu-item>
+        </el-menu-item-group>
+      </el-submenu>
+       <el-menu-item index="/zhidao/index"> <i class="el-icon-s-grid"></i>指导单位管理</el-menu-item>
+       <el-menu-item index="/news/index"> <i class="el-icon-s-grid"></i>新闻中心管理</el-menu-item>
       <el-menu-item index="/companyup/index"> <i class="el-icon-s-grid"></i>企业信息管理</el-menu-item>
       <el-menu-item index="/companyidentify/index"> <i class="el-icon-s-grid"></i>企业认证管理</el-menu-item>
       <el-menu-item index="/character/index"> <i class="el-icon-s-grid"></i>角色管理</el-menu-item>

+ 210 - 0
src/layout/legalService/legalServiceForm.vue

@@ -0,0 +1,210 @@
+<template>
+  <div id="legalServiceForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="名称" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="服务" prop="service">
+              <el-input v-model="ruleForm.service" type="textarea" placeholder="请输入服务"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="联系人" prop="contact">
+              <el-input v-model="ruleForm.contact" placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="ruleForm.phone" placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="电子邮箱" prop="email">
+              <el-input v-model="ruleForm.email" placeholder="请输入电子邮箱"></el-input>
+            </el-form-item>
+            <el-form-item label="机构介绍" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入机构介绍"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'legalServiceForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '法律服务管理',
+      rules: {
+        title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        service: [{ required: true, message: '请输入服务', trigger: 'blur' }],
+        image: [{ required: true }],
+        contact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入联系电话'},
+                { min: 11, max: 11, message: '请输入11位联系电话', trigger: 'blur' },
+        ],
+        description: [{ required: true, message: '请输入机构介绍', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 241 - 0
src/layout/legalService/legalServiceList.vue

@@ -0,0 +1,241 @@
+<template>
+  <div id="legalServiceList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <!--<el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>-->
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="名称" align="center"> </el-table-column>
+            <!--<el-table-column property="service" label="服务" align="center"> </el-table-column>-->
+            <el-table-column label="图片" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <el-table-column property="contact" label="联系人" align="center"> </el-table-column>
+            <el-table-column property="phone" label="联系电话" align="center"> </el-table-column>
+            <el-table-column property="email" label="电子邮箱" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/legalService/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'legalServiceList',
+    props: {
+      tableData: null,
+      total: null,
+      type: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入名称',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val,type:this.type, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit,type:this.type, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 210 - 0
src/layout/marketService/marketServiceForm.vue

@@ -0,0 +1,210 @@
+<template>
+  <div id="marketServiceForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="名称" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="服务" prop="service">
+              <el-input v-model="ruleForm.service" type="textarea" placeholder="请输入服务"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="联系人" prop="contact">
+              <el-input v-model="ruleForm.contact" placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="ruleForm.phone" placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="电子邮箱" prop="email">
+              <el-input v-model="ruleForm.email" placeholder="请输入电子邮箱"></el-input>
+            </el-form-item>
+            <el-form-item label="机构介绍" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入机构介绍"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'marketServiceForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '市场服务管理',
+      rules: {
+        title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        service: [{ required: true, message: '请输入服务', trigger: 'blur' }],
+        image: [{ required: true }],
+        contact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入联系电话'},
+                { min: 11, max: 11, message: '请输入11位联系电话', trigger: 'blur' },
+        ],
+        description: [{ required: true, message: '请输入机构介绍', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 241 - 0
src/layout/marketService/marketServiceList.vue

@@ -0,0 +1,241 @@
+<template>
+  <div id="marketServiceList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <!--<el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>-->
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="名称" align="center"> </el-table-column>
+            <!--<el-table-column property="service" label="服务" align="center"> </el-table-column>-->
+            <el-table-column label="图片" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <el-table-column property="contact" label="联系人" align="center"> </el-table-column>
+            <el-table-column property="phone" label="联系电话" align="center"> </el-table-column>
+            <el-table-column property="email" label="电子邮箱" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/marketService/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'marketServiceList',
+    props: {
+      tableData: null,
+      total: null,
+      type: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入名称',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val,type:this.type, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit,type:this.type, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 206 - 78
src/layout/news/newsForm.vue

@@ -1,92 +1,220 @@
 <template>
-  <div id="otheruserForm">
-    <el-row>
-      <el-col :span="24" class="form">
-        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
-          <el-form-item label="标题" prop="name">
-            <el-input v-model="ruleForm.title" placeholder="请输入标题"></el-input>
-          </el-form-item>
-          <el-form-item label="图片" prop="image">
-            <upload :limit="1" :data="ruleForm.image" type="image" :url="`/files/teacher/upload`" @upload="uploadSuccess"></upload>
-          </el-form-item>
-          <el-form-item label="来源" prop="source">
-            <el-input v-model="ruleForm.source" placeholder="请输入来源"></el-input>
-          </el-form-item>
-          <el-form-item label="发布日期" prop="publish_time">
-            <el-input v-model="ruleForm.publish_time" placeholder="请输入发布日期"></el-input>
-          </el-form-item>
-          <el-form-item label="发布状态" prop="type">
-            <el-select v-model="ruleForm.type" placeholder="请选择发布状态">
-              <el-option label="未发布" value="0"></el-option>
-              <el-option label="发布" value="1"></el-option>
-              <el-option label="下架" value="2"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="简介">
-            <!-- <span v-if="toDisplay()"> -->
-            <wang-editor v-model="ruleForm.description" placeholder="请输入简介"></wang-editor>
-            <!-- </span> -->
-          </el-form-item>
-          <el-form-item>
-            <el-button size="small" @click="resetForm('ruleForm')">取消</el-button>
-
-            <el-button type="danger" size="small" @click="submitForm('ruleForm')">提交</el-button>
-          </el-form-item>
-        </el-form>
+  <div id="newsForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <!--<el-form-item label="名称" prop="name">
+              <el-input v-model="ruleForm.name" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="链接" prop="link">
+              <el-input v-model="ruleForm.link" placeholder="请输入链接"></el-input>
+            </el-form-item>-->
+            <el-form-item label="标题" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入标题"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="简介" prop="brief_introduction">
+              <el-input v-model="ruleForm.brief_introduction" type="textarea" placeholder="请输入简介"></el-input>
+            </el-form-item>
+            <el-form-item label="来源" prop="source">
+              <el-input v-model="ruleForm.source" placeholder="请输入来源"></el-input>
+            </el-form-item>
+            <el-form-item label="是否热门" prop="hot">
+              <el-radio-group v-model="ruleForm.hot">
+                <el-radio label="1" >是</el-radio>
+                <el-radio label="0" >否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="内容" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入内容"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
       </el-col>
     </el-row>
   </div>
 </template>
 
 <script>
-import WangEditor from '@/components/wang-editor.vue';
-import upload from '@/components/upload.vue';
-export default {
-  name: 'otheruserForm',
-  props: {
-    ruleForm: null,
-  },
-  components: {
-    WangEditor, //富文本
-    upload, //图片
-  },
-  data: () => ({
-    rules: {
-      title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
-      source: [{ required: true, message: '请输入来源', trigger: 'blur' }],
-      publish_time: [{ required: true, message: '请输入发布日期', trigger: 'blur' }],
-      description: [{ required: true, message: '请输入简介', trigger: 'blur' }],
-      type: [{ required: true, message: '请选择发布状态', trigger: 'change' }],
-    },
-  }),
-  created() {},
-  computed: {},
-  methods: {
-    submitForm() {
-      this.$emit('submitForm', { data: this.ruleForm });
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'newsForm',
+    props: {
+      ruleForm: null,
+      loading: null,
     },
-    resetForm() {
-      this.$emit('resetForm');
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
     },
-    uploadSuccess({ type, data }) {
-      if (type !== 'logo') {
-        let arr = _.get(this.ruleForm, type);
-        if (arr !== undefined) {
-          this.ruleForm[type].push({ name: data.name, uri: data.uri });
-        } else {
-          let newArr = [{ name: data.name, uri: data.uri }];
-          this.$set(this.ruleForm, `${type}`, newArr);
-        }
-      } else {
-        this.$set(this.ruleForm, `${type}`, data.uri);
-      }
+    data: () => ({
+      formTitle: '新闻中心管理',
+      rules: {
+        title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+        hot: [{ required: true }],
+        description: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.form {
-  padding: 0 200px 0 0;
-}
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
 </style>

+ 241 - 64
src/layout/news/newsList.vue

@@ -1,82 +1,259 @@
 <template>
-  <div id="otheruserList">
+  <div id="newsList">
     <el-row>
       <el-col :span="24">
-        <el-table ref="debtTable" :data="debtTable" style="width: 100%" border>
-          <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
-          <el-table-column property="title" label="标题" align="center"> </el-table-column>
-          <el-table-column label="图片" align="center">
-            <template slot-scope="scope">
-              <span style="margin-left: 10px"> <el-image :src="scope.row.image"></el-image></span>
-            </template>
-          </el-table-column>
-          <el-table-column property="source" label="来源" align="center"> </el-table-column>
-          <el-table-column property="publish_time" label="发布日期" align="center"> </el-table-column>
-          <el-table-column property="" label="发布状态" align="center"> </el-table-column>
-
-          <el-table-column label="状态" align="center">
-            <template slot-scope="scope">
-              <span style="margin-left: 10px">{{ scope.row.publish_state === '0' ? '未发布' : scope.row.publish_state === '1' ? '已发布' : '停用' }}</span>
-            </template>
-          </el-table-column>
-
-          <el-table-column property="description" label="内容" align="center"> </el-table-column>
-
-          <el-table-column fixed="right" label="操作" align="center">
-            <template slot-scope="scope">
-              <el-button @click="$router.push({ path: '/news/detail', query: { id: scope.row.id } })" type="text"><i class="el-icon-edit"></i></el-button>
-              <el-button @click.prevent="deleteRow(scope.row.id)" type="text"><i class="el-icon-delete"></i></el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        <el-row class="page">
-          <el-pagination
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-            :current-page="currentPage"
-            layout="total, prev, pager, next, jumper"
-            :total="total"
+        <el-col :span="24" class="search">
+          <el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
           >
-          </el-pagination>
-        </el-row>
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="标题" align="center"> </el-table-column>
+            <el-table-column label="图片" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <!--<el-table-column property="brief_introduction" label="简介" align="center"> </el-table-column>-->
+            <el-table-column label="发布日期" align="center">
+              <template slot-scope="scope">
+                <span>{{ getDate(scope.row.publish_time) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="发布状态" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.publish_state === '1' ? '已发布' : '未发布'}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column property="source" label="来源" align="center"> </el-table-column>
+            <el-table-column label="是否热门" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.hot === '1' ? '是' : '否'}}</span>
+              </template>
+            </el-table-column>
+            <!--<el-table-column label="状态" align="center">
+              <template slot-scope="scope">
+                <span style="margin-left: 10px">{{ scope.row.publish_state === '0' ? '未发布' : scope.row.publish_state === '1' ? '已发布' : '停用' }}</span>
+              </template>
+            </el-table-column>-->
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="other" @click="publish(scope.row)">发布</el-button>
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/news/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
       </el-col>
     </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-export default {
-  name: 'otheruserList',
-  props: {
-    debtTable: null,
-    total: null,
-  },
-  components: {},
-  data: () => ({
-    currentPage: 1,
-  }),
-  created() {},
-  computed: {},
-  methods: {
-    deleteRow(id) {
-      this.$emit('deleteRow', id);
-    },
-    clickRest(id) {
-      this.$emit('clickRest', id);
+  export default {
+    name: 'newsList',
+    props: {
+      tableData: null,
+      total: null,
     },
-    handleSizeChange(val) {
-      console.log(`每页 ${val} 条`);
+    components: {},
+    data: () => ({
+      placeholder: '请输入标题',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+    computed: {
     },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
   },
-};
+    },
+  };
 </script>
 
 <style lang="less" scoped>
-.page {
-  text-align: center;
-  padding: 15px 0;
-}
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
 </style>

+ 2 - 0
src/layout/otheruser/otheruserForm.vue

@@ -55,8 +55,10 @@ export default {
   components: {},
   data: () => ({
     rules: {
+      name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
       phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
       type: [{ required: true, message: '请选择用户类型', trigger: 'change' }],
+      characterid: [{ required: true, message: '请选择用角色', trigger: 'change' }],
     },
   }),
   created() {},

+ 9 - 6
src/layout/otheruser/otheruserList.vue

@@ -30,7 +30,7 @@
                 <el-button @click="$router.push({ path: '/otheruser/detail', query: { id: scope.row.id } })" type="text"
                   ><i class="el-icon-edit"></i
                 ></el-button>
-                <el-button @click.prevent="deleteRow(scope.row.id)" type="text"><i class="el-icon-delete"></i></el-button>
+                <el-button class="delete" @click.prevent="deleteRow(scope.row.id)" type="text"><i class="el-icon-delete"></i></el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -39,11 +39,10 @@
               @size-change="handleSizeChange"
               @current-change="handleCurrentChange"
               :current-page="currentPage"
-              :page-sizes="[10, 20, 30, 40]"
-              :page-size="10"
               background
-              layout="total, sizes, prev, pager, next, jumper"
+              layout="total,  prev, pager, next, jumper"
               :total="total"
+              :page-size="pageSize"
             >
             </el-pagination>
           </el-row>
@@ -63,6 +62,7 @@ export default {
   components: {},
   data: () => ({
     currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {},
@@ -79,8 +79,11 @@ export default {
     handleSizeChange(val) {
       console.log(`每页 ${val} 条`);
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+
+    handleCurrentChange(currentPage) {
+      console.log(currentPage);
+
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
   },
 };

+ 1 - 0
src/layout/region/regionForm.vue

@@ -40,6 +40,7 @@ export default {
   data: () => ({
     rules: {
       name: [{ required: true, message: '请输入地区名称', trigger: 'blur' }],
+      url: [{ required: true, message: '请输入路径', trigger: 'blur' }],
     },
   }),
   created() {},

+ 6 - 5
src/layout/region/regionList.vue

@@ -28,11 +28,10 @@
             @size-change="handleSizeChange"
             @current-change="handleCurrentChange"
             :current-page="currentPage"
-            :page-sizes="[10, 20, 30, 40]"
-            :page-size="10"
             background
-            layout="total, sizes, prev, pager, next, jumper"
+            layout="total,  prev, pager, next, jumper"
             :total="total"
+            :page-size="pageSize"
           >
           </el-pagination>
         </el-row>
@@ -51,6 +50,7 @@ export default {
   components: {},
   data: () => ({
     currentPage: 0,
+    pageSize: 10,
   }),
   created() {},
   computed: {},
@@ -64,8 +64,9 @@ export default {
     deleteRow(id) {
       this.$emit('deleteRow', id);
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+
+    handleCurrentChange(currentPage) {
+      this.$emit('handleCurrentChange', { skip: (currentPage - 1) * this.pageSize, limit: this.pageSize, currentPage });
     },
   },
 };

+ 198 - 85
src/layout/specialist/zhuanjiaForm.vue

@@ -1,99 +1,212 @@
 <template>
-  <div id="otheruserForm">
-    <el-row>
-      <el-col :span="24" class="form">
-        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
-          <el-form-item label="名称" prop="name">
-            <el-input v-model="ruleForm.name" placeholder="请输入名称"></el-input>
-          </el-form-item>
-          <el-form-item label="性别" prop="gender">
-            <el-input v-model="ruleForm.gender" placeholder="请输入性别"></el-input>
-          </el-form-item>
-
-          <el-form-item label="图片" prop="image">
-            <upload :limit="1" :data="ruleForm.image" type="image" :url="`/files/teacher/upload`" @upload="uploadSuccess"></upload>
-          </el-form-item>
-          <el-form-item label="单位" prop="company">
-            <el-input v-model="ruleForm.company" placeholder="请输入单位"></el-input>
-          </el-form-item>
-          <el-form-item label="职务" prop="job">
-            <el-input v-model="ruleForm.job" placeholder="请输入职务"></el-input>
-          </el-form-item>
-
-          <el-form-item label="曾获荣誉或融资成果" prop="result">
-            <el-input v-model="ruleForm.result" placeholder="请输入曾获荣誉或融资成果"></el-input>
-          </el-form-item>
-          <el-form-item label="擅长领域" prop="field">
-            <el-input v-model="ruleForm.field" placeholder="请输入擅长领域"></el-input>
-          </el-form-item>
-
-          <el-form-item label="从事财政/金融类工作经历">
-            <!-- <span v-if="toDisplay()"> -->
-            <wang-editor v-model="ruleForm.work_history" placeholder="请输入从事财政/金融类工作经历"></wang-editor>
-            <!-- </span> -->
-          </el-form-item>
-
-          <el-form-item>
-            <el-button size="small" @click="resetForm('ruleForm')">取消</el-button>
-
-            <el-button type="danger" size="small" @click="submitForm('ruleForm')">提交</el-button>
-          </el-form-item>
-        </el-form>
+  <div id="zhuanjiaForm">
+    <el-row >
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="姓名" prop="name">
+              <el-input v-model="ruleForm.name" placeholder="请输入姓名"></el-input>
+            </el-form-item>
+            <el-form-item label="性别" prop="gender">
+              <el-radio-group v-model="ruleForm.gender">
+                <el-radio label="男" >男</el-radio>
+                <el-radio label="女" >女</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="单位" prop="company">
+              <el-input v-model="ruleForm.company" placeholder="请输入单位"></el-input>
+            </el-form-item>
+            <el-form-item label="职务" prop="job">
+              <el-input v-model="ruleForm.job" placeholder="请输入职务"></el-input>
+            </el-form-item>
+            <el-form-item label="头像" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="擅长领域" prop="field">
+              <el-input v-model="ruleForm.field" placeholder="请输入擅长领域"></el-input>
+            </el-form-item>
+            <el-form-item label="从事财政/金融类工作经历"  prop="work_history">
+              <el-input v-model="ruleForm.work_history" type="textarea" placeholder="请输入从事财政/金融类工作经历"></el-input>
+            </el-form-item>
+            <el-form-item label="曾获荣誉或融资成果" prop="result">
+              <el-input v-model="ruleForm.result" type="textarea" placeholder="请输入曾获荣誉或融资成果"></el-input>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
       </el-col>
     </el-row>
   </div>
 </template>
 
 <script>
-import WangEditor from '@/components/wang-editor.vue';
-import upload from '@/components/upload.vue';
-export default {
-  name: 'otheruserForm',
-  props: {
-    ruleForm: null,
-  },
-  components: {
-    upload, //图片
-    WangEditor,
-  },
-  data: () => ({
-    rules: {
-      name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
-      name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
-      company: [{ required: true, message: '请输入单位', trigger: 'blur' }],
-
-      result: [{ required: true, message: '请输入曾获荣誉或融资成果', trigger: 'blur' }],
-      field: [{ required: true, message: '请输入擅长领域', trigger: 'blur' }],
-    },
-  }),
-  created() {},
-  computed: {},
-  methods: {
-    submitForm() {
-      this.$emit('submitForm', { data: this.ruleForm });
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'zhuanjiaForm',
+    props: {
+      ruleForm: null,
     },
-    resetForm() {
-      this.$emit('resetForm');
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
     },
-    uploadSuccess({ type, data }) {
-      if (type !== 'logo') {
-        let arr = _.get(this.ruleForm, type);
-        if (arr !== undefined) {
-          this.ruleForm[type].push({ name: data.name, uri: data.uri });
-        } else {
-          let newArr = [{ name: data.name, uri: data.uri }];
-          this.$set(this.ruleForm, `${type}`, newArr);
-        }
-      } else {
-        this.$set(this.ruleForm, `${type}`, data.uri);
-      }
+    data: () => ({
+      formTitle: '融资专家管理',
+      rules: {
+        name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+        gender: [{ required: true }],
+        work_history: [{ required: true, message: '请输入从事财政/金融类工作经历', trigger: 'blur' }],
+        image: [{ required: true }],
+        result: [{ required: true, message: '请输入曾获荣誉或融资成果', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.form {
-  padding: 0 200px 0 0;
-}
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
 </style>

+ 222 - 59
src/layout/specialist/zhuanjiaList.vue

@@ -1,77 +1,240 @@
 <template>
-  <div id="otheruserList">
+  <div id="zhuanjiaList">
     <el-row>
       <el-col :span="24">
-        <el-table ref="debtTable" :data="debtTable" style="width: 100%" border>
-          <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
-          <el-table-column property="name" label="名称" align="center"> </el-table-column>
-          <el-table-column property="gender" label="性别" align="center"> </el-table-column>
-          <el-table-column property="company" label="单位" align="center"> </el-table-column>
-          <el-table-column property="job" label="职务" align="center"> </el-table-column>
-          <!-- <el-table-column property="result" label="曾获荣誉或融资成果" align="center"> </el-table-column> -->
-          <el-table-column property="field" label="擅长领域" align="center"> </el-table-column>
-
-          <el-table-column label="图片" align="center">
-            <template slot-scope="scope">
-              <span style="margin-left: 10px"> <el-image :src="scope.row.image"></el-image></span>
-            </template>
-          </el-table-column>
-
-          <el-table-column fixed="right" label="操作" align="center">
-            <template slot-scope="scope">
-              <el-button @click="$router.push({ path: '/specialist/detail', query: { id: scope.row.id } })" type="text"><i class="el-icon-edit"></i></el-button>
-              <el-button @click.prevent="deleteRow(scope.row.id)" type="text"><i class="el-icon-delete"></i></el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        <el-row class="page">
-          <el-pagination
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-            :current-page="currentPage"
-            layout="total, prev, pager, next, jumper"
-            :total="total"
+        <el-col :span="24" class="search">
+          <!--<el-col :span="5">
+            <span>筛选条件:</span>
+            <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+              <el-option label="未发布" value="0"></el-option>
+              <el-option label="已发布" value="1"></el-option>
+            </el-select>
+          </el-col>-->
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.name" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
           >
-          </el-pagination>
-        </el-row>
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="name" label="姓名" align="center"> </el-table-column>
+            <el-table-column property="gender" label="性别" align="center"> </el-table-column>
+            <el-table-column property="company" label="单位" align="center"> </el-table-column>
+            <el-table-column label="头像" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <el-table-column property="job" label="职务" align="center"> </el-table-column>
+            <el-table-column property="field" label="擅长领域" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/specialist/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
       </el-col>
     </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-export default {
-  name: 'otheruserList',
-  props: {
-    debtTable: null,
-    total: null,
-  },
-  components: {},
-  data: () => ({
-    currentPage: 1,
-  }),
-  created() {},
-  computed: {},
-  methods: {
-    deleteRow(id) {
-      this.$emit('deleteRow', id);
+  export default {
+    name: 'zhuanjiaList',
+    props: {
+      tableData: null,
+      total: null,
     },
-    clickRest(id) {
-      this.$emit('clickRest', id);
+    components: {},
+    data: () => ({
+      placeholder: '请输入姓名',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
     },
-    handleSizeChange(val) {
-      console.log(`每页 ${val} 条`);
+    computed: {
     },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.page {
-  text-align: center;
-  padding: 15px 0;
-}
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
 </style>

+ 213 - 0
src/layout/tInformationDelivery/tInformationDeliveryForm.vue

@@ -0,0 +1,213 @@
+<template>
+  <div id="tInformationDeliveryForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="标题" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入标题"></el-input>
+            </el-form-item>
+            <el-form-item label="政策等级" prop="subject_classification">
+              <el-select v-model="ruleForm.subject_classification" placeholder="请选择政策等级">
+                <el-option v-for="(item, index) in subject_classification_list" :key="item.code" :label="item.name" :value="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="主题词" prop="subject_headings">
+              <el-select v-model="ruleForm.subject_headings" placeholder="请选择主题词">
+                <el-option v-for="(item, index) in subject_headings_list" :key="item.code" :label="item.name" :value="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="发文机关" prop="issuing_organ">
+              <el-input v-model="ruleForm.issuing_organ" placeholder="请输入发文机关"></el-input>
+            </el-form-item>
+            <el-form-item label="索引号" prop="index_number">
+              <el-input v-model="ruleForm.index_number" placeholder="请输入索引号"></el-input>
+            </el-form-item>
+            <el-form-item label="发文字号" prop="issued_number">
+              <el-input v-model="ruleForm.issued_number" placeholder="请输入发文字号"></el-input>
+            </el-form-item>
+            <el-form-item label="来源" prop="source">
+              <el-input v-model="ruleForm.source" placeholder="请输入来源"></el-input>
+            </el-form-item>
+            <el-form-item label="简介" prop="brief_introduction">
+              <el-input v-model="ruleForm.brief_introduction" type="textarea" placeholder="请输入简介"></el-input>
+            </el-form-item>
+            <el-form-item label="内容" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入内容"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'tInformationDeliveryForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+      subject_classification_list:{ type: Array, default: () => [] },
+      subject_headings_list:{ type: Array, default: () => [] },
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '政策发布管理',
+      rules: {
+        title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+        issuing_organ: [{ required: true, message: '请输入发文机关', trigger: 'blur' }],
+        subject_classification: [{ required: true }],
+        subject_headings: [{ required: true }],
+        description: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 247 - 0
src/layout/tInformationDelivery/tInformationDeliveryList.vue

@@ -0,0 +1,247 @@
+<template>
+  <div id="tInformationDeliveryList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="标题" align="center"> </el-table-column>
+            <el-table-column property="issuing_organ" label="发文机关" align="center"> </el-table-column>
+            <el-table-column property="index_number" label="索引号" align="center"> </el-table-column>
+            <el-table-column property="subject_classification" label="政策等级" align="center"> </el-table-column>
+            <el-table-column property="issued_number" label="发文字号" align="center"> </el-table-column>
+            <el-table-column property="subject_headings" label="主题词" align="center"> </el-table-column>
+            <el-table-column label="发布日期" align="center">
+              <template slot-scope="scope">
+                <span>{{ getDate(scope.row.publish_time) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="发布状态" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.publish_state === '1' ? '已发布' : '未发布'}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column property="source" label="来源" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="other" @click="publish(scope.row)">发布</el-button>
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/tInformationDelivery/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'tInformationDeliveryList',
+    props: {
+      tableData: null,
+      total: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入标题',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 210 - 0
src/layout/tPolicyInterpretation/tPolicyInterpretationForm.vue

@@ -0,0 +1,210 @@
+<template>
+  <div id="tPolicyInterpretationForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="标题" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入标题"></el-input>
+            </el-form-item>
+            <el-form-item label="政策等级" prop="subject_classification">
+              <el-select v-model="ruleForm.subject_classification" placeholder="请选择政策等级">
+                <el-option v-for="(item, index) in subject_classification_list" :key="item.code" :label="item.name" :value="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="主题词" prop="subject_headings">
+              <el-select v-model="ruleForm.subject_headings" placeholder="请选择主题词">
+                <el-option v-for="(item, index) in subject_headings_list" :key="item.code" :label="item.name" :value="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="发文机关" prop="issuing_organ">
+              <el-input v-model="ruleForm.issuing_organ" placeholder="请输入发文机关"></el-input>
+            </el-form-item>
+            <el-form-item label="索引号" prop="index_number">
+              <el-input v-model="ruleForm.index_number" placeholder="请输入索引号"></el-input>
+            </el-form-item>
+            <el-form-item label="发文字号" prop="issued_number">
+              <el-input v-model="ruleForm.issued_number" placeholder="请输入发文字号"></el-input>
+            </el-form-item>
+            <el-form-item label="简介" prop="brief_introduction">
+              <el-input v-model="ruleForm.brief_introduction" type="textarea" placeholder="请输入简介"></el-input>
+            </el-form-item>
+            <el-form-item label="内容" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入内容"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'tPolicyInterpretationForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+      subject_classification_list:{ type: Array, default: () => [] },
+      subject_headings_list:{ type: Array, default: () => [] },
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '政策解读管理',
+      rules: {
+        title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+        issuing_organ: [{ required: true, message: '请输入发文机关', trigger: 'blur' }],
+        subject_classification: [{ required: true }],
+        subject_headings: [{ required: true }],
+        description: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 246 - 0
src/layout/tPolicyInterpretation/tPolicyInterpretationList.vue

@@ -0,0 +1,246 @@
+<template>
+  <div id="tPolicyInterpretationList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="标题" align="center"> </el-table-column>
+            <el-table-column property="issuing_organ" label="发文机关" align="center"> </el-table-column>
+            <el-table-column property="index_number" label="索引号" align="center"> </el-table-column>
+            <el-table-column property="subject_classification" label="政策等级" align="center"> </el-table-column>
+            <el-table-column property="issued_number" label="发文字号" align="center"> </el-table-column>
+            <el-table-column property="subject_headings" label="主题词" align="center"> </el-table-column>
+            <el-table-column label="发布日期" align="center">
+              <template slot-scope="scope">
+                <span>{{ getDate(scope.row.publish_time) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="发布状态" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.publish_state === '1' ? '已发布' : '未发布'}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="other" @click="publish(scope.row)">发布</el-button>
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/tPolicyInterpretation/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'tPolicyInterpretationList',
+    props: {
+      tableData: null,
+      total: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入标题',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 210 - 0
src/layout/technicalService/technicalServiceForm.vue

@@ -0,0 +1,210 @@
+<template>
+  <div id="technicalServiceForm">
+    <el-row v-if="loading">
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="名称" prop="title">
+              <el-input v-model="ruleForm.title" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="服务" prop="service">
+              <el-input v-model="ruleForm.service" type="textarea" placeholder="请输入服务"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="联系人" prop="contact">
+              <el-input v-model="ruleForm.contact" placeholder="请输入联系人"></el-input>
+            </el-form-item>
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="ruleForm.phone" placeholder="请输入联系电话"></el-input>
+            </el-form-item>
+            <el-form-item label="电子邮箱" prop="email">
+              <el-input v-model="ruleForm.email" placeholder="请输入电子邮箱"></el-input>
+            </el-form-item>
+            <el-form-item label="机构介绍" prop="description">
+              <wang-editor v-model="ruleForm.description" placeholder="请输入机构介绍"></wang-editor>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import uploadImage from '@/layout/custom/uploadImage.vue';
+  import WangEditor from '@/components/wang-editor.vue';
+
+  export default {
+    name: 'technicalServiceForm',
+    props: {
+      ruleForm: null,
+      loading: null,
+    },
+    components: {
+      uploadImage, //图片
+      WangEditor, //富文本
+    },
+    data: () => ({
+      formTitle: '技术服务管理',
+      rules: {
+        title: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        service: [{ required: true, message: '请输入服务', trigger: 'blur' }],
+        image: [{ required: true }],
+        contact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
+        phone: [{ required: true, message: '请输入联系电话'},
+                { min: 11, max: 11, message: '请输入11位联系电话', trigger: 'blur' },
+        ],
+        description: [{ required: true, message: '请输入机构介绍', trigger: 'blur' }],
+      },
+    }),
+    created() {},
+    computed: {},
+    methods: {
+      submitForm() {
+        this.$emit('submitForm', { data: this.ruleForm });
+      },
+      resetForm() {
+        this.$emit('resetForm');
+      },
+      uploadSuccess({ data }) {
+        this.$set(this.ruleForm, 'image', data.uri);
+      },
+      remove(file) {
+        this.$set(this.ruleForm, 'image', '')
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .form {
+    padding: 0 200px 0 0;
+  }
+
+  p {
+    padding: 0;
+    margin: 0;
+  }
+
+  .top .shu {
+    float: left;
+    width: 4px;
+    height: 20px;
+    background: rgba(233, 2, 29, 1);
+  }
+
+  .top .title {
+    float: left;
+    padding: 0 10px;
+    font-size: 16px;
+    font-family: Source Han Sans SC;
+    font-weight: bold;
+    color: rgba(40, 40, 40, 1);
+  }
+
+  /deep/ .el-textarea__inner {
+    min-height: 100px !important;
+  }
+
+  /deep/ .select {
+    width: 632px;
+  }
+
+  .selects {
+    width: 473px;
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-radio__input.is-checked .el-radio__inner {
+    border-color: #e9021d;
+    background: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: #e9021d;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button,
+  .el-checkbox-button__inner {
+    margin: 0 15px 0 0;
+  }
+
+  /deep/ .el-checkbox-button__inner {
+    padding: 7px 5px;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button__inner:hover {
+    color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+    border-left: 1px solid #ccc;
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+    border-radius: 5px;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    color: #e9021d;
+    background-color: #ffffff;
+    border-color: #e9021d;
+  }
+
+  /deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+    box-shadow: none;
+  }
+
+  /deep/ .el-switch.is-checked .el-switch__core {
+    border-color: #e9021d;
+    background-color: #e9021d;
+  }
+
+  .clickBtn .el-button {
+    width: 100px;
+    height: 40px;
+    padding: 0;
+    color: #ffffff;
+    background: #b9b9b9;
+    border-radius: 4px;
+    margin: 40px;
+  }
+
+  .clickBtn {
+    text-align: center;
+    margin: 40px 0;
+    border-top: 1px solid #ccc;
+  }
+
+  .clickBtn .el-button:first-child {
+    background-color: #e9021d;
+  }
+</style>

+ 241 - 0
src/layout/technicalService/technicalServiceList.vue

@@ -0,0 +1,241 @@
+<template>
+  <div id="technicalServiceList">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="search">
+          <!--<el-col :span="5">
+          <span>筛选条件:</span>
+          <el-select v-model="search.publish_state" placeholder="请选择发布状态">
+            <el-option label="未发布" value="0"></el-option>
+            <el-option label="已发布" value="1"></el-option>
+          </el-select>
+        </el-col>-->
+          <el-col :span="4">
+            <span>输入条件:</span>
+            <el-input v-model="search.title" :placeholder="placeholder" class="input"></el-input>
+          </el-col>
+          <!--<el-col :span="7">
+            <span>时间选择:</span>
+            <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+          </el-col>-->
+          <el-col :span="8">
+            <el-button class="btnSearch" @click="toQuery">查询</el-button>
+            <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24">
+          <el-table
+                  ref="tableData"
+                  :data="tableData"
+                  tooltip-effect="dark"
+                  :default-sort="{ prop: 'date', order: 'descending' }"
+                  style="width: 100%"
+                  @selection-change="handleSelectionChange"
+          >
+            <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+            <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+            <el-table-column property="title" label="名称" align="center"> </el-table-column>
+            <!--<el-table-column property="service" label="服务" align="center"> </el-table-column>-->
+            <el-table-column label="图片" align="center">
+              <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+              </template>
+            </el-table-column>
+            <el-table-column property="contact" label="联系人" align="center"> </el-table-column>
+            <el-table-column property="phone" label="联系电话" align="center"> </el-table-column>
+            <el-table-column property="email" label="电子邮箱" align="center"> </el-table-column>
+            <el-table-column label="操作" align="center" width="300px">
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                           @click="$router.push({ path: '/technicalService/detail', query: { id: scope.row.id } })"></el-button>
+                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="currentPage"
+                    :page-sizes="[10, 20, 30, 40]"
+                    :page-size.sync="limit"
+                    background
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="total"
+            >
+            </el-pagination>
+          </el-row>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog
+            :visible.sync="dialogVisible"
+            width="30%"
+    >
+      <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'technicalServiceList',
+    props: {
+      tableData: null,
+      total: null,
+      type: null,
+    },
+    components: {},
+    data: () => ({
+      placeholder: '请输入名称',
+      search: {},
+      currentPage: 1,
+      limit: 10,
+      dialogVisible: false,
+      elImage: '',
+    }),
+    created() {
+    },
+    computed: {
+    },
+    methods: {
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      deleteRow(id) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      handleSizeChange(val) {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: val,type:this.type, ...this.search});
+      },
+      handleCurrentChange(val) {
+        this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit,type:this.type, ...this.search});
+      },
+      toQuery() {
+        this.$set(this, `currentPage`, 1);
+        this.$emit('select', {skip: 0, limit: this.limit,type:this.type, ...this.search});
+      },
+      toClear() {
+        let keys = Object.keys(this.search);
+        for (const key of keys) {
+          this.$set(this.search, `${key}`, '');
+        }
+      },
+      showImage(image) {
+        if(image){
+          this.$set(this, `elImage`, image);
+          this.$set(this, `dialogVisible`, true);
+        }else{
+          this.$set(this, `dialogVisible`, false);
+        }
+      },
+      getDate(val) {
+        if(val){
+          return this.format(new Date(Number(val)),'yyyy年MM月dd');
+        }
+        return '';
+      },
+      format(date,formatStr){
+        formatStr=formatStr.replace(/yyyy|YYYY/,date.getFullYear());
+        formatStr=formatStr.replace(/MM/,(date.getMonth()+1)>9?(date.getMonth()+1).toString():'0' + (date.getMonth()+1));
+        formatStr=formatStr.replace(/dd|DD/,date.getDate()>9?date.getDate().toString():'0' + date.getDate());
+        return formatStr;
+      },
+      publish(row){
+        if(row.publish_state === '1'){
+          this.$message.error('已发布');
+          return ;
+        }
+        this.$emit('publish', {row:row,skip: (this.currentPage - 1) * this.limit, limit: this.limit, ...this.search});
+  },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+    background-color: red;
+    border-color: red;
+  }
+
+  /deep/ .el-table th {
+    background-color: #f5f6fa;
+    padding: 8px 0;
+  }
+
+  /deep/ .el-table td {
+    padding: 11px 0;
+  }
+
+  .other {
+    color: #f36302;
+  }
+
+  .view {
+    color: #f36302;
+  }
+
+  .edit {
+    color: #2ccc02;
+  }
+
+  .delete {
+    color: #e9021d;
+  }
+
+  /deep/ .el-pagination {
+    padding: 26px 20px;
+  }
+
+  /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background-color: red;
+  }
+
+  .input {
+    width: 150px;
+  }
+
+  /deep/ .el-input__inner {
+    height: 35px;
+    line-height: 35px;
+  }
+
+  .btnSearch {
+    width: 80px;
+    height: 34px;
+    background: rgba(233, 2, 29, 1);
+    border-radius: 4px;
+    padding: 0;
+    color: #fff;
+  }
+
+  .qing {
+    background: rgba(185, 185, 185, 1);
+  }
+
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+
+  .search {
+    background: #ffffff;
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+    margin-left: 0px;
+  }
+
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 151 - 34
src/layout/zhidao/zhidaoForm.vue

@@ -1,43 +1,55 @@
 <template>
-  <div id="otheruserForm">
+  <div id="zhidaoForm">
     <el-row>
-      <el-col :span="24" class="form">
-        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
-          <el-form-item label="名称" prop="name">
-            <el-input v-model="ruleForm.name" placeholder="请输入名称"></el-input>
-          </el-form-item>
-          <el-form-item label="图片" prop="image">
-            <upload :limit="1" :data="ruleForm.image" type="image" :url="`/files/teacher/upload`" @upload="uploadSuccess"></upload>
-          </el-form-item>
-          <el-form-item label="链接" prop="source">
-            <el-input v-model="ruleForm.link" placeholder="请输入链接"></el-input>
-          </el-form-item>
-
-          <el-form-item>
-            <el-button size="small" @click="resetForm('ruleForm')">取消</el-button>
-
-            <el-button type="danger" size="small" @click="submitForm('ruleForm')">提交</el-button>
-          </el-form-item>
-        </el-form>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <span class="shu"></span><span class="title">{{ formTitle }}</span>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="名称" prop="name">
+              <el-input v-model="ruleForm.name" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="图片" prop="image">
+              <uploadImage
+                      :limit="1"
+                      :data="ruleForm.image"
+                      :url="`/files/financial/custom/upload`"
+                      @uploadSuccess="uploadSuccess"
+                      @remove="remove"
+              ></uploadImage>
+            </el-form-item>
+            <el-form-item label="链接" prop="link">
+              <el-input v-model="ruleForm.link" placeholder="请输入链接"></el-input>
+            </el-form-item>
+            <el-col :span="24" class="clickBtn">
+              <el-button @click="submitForm">提交</el-button>
+              <el-button @click="resetForm">取消</el-button>
+            </el-col>
+          </el-form>
+        </el-col>
       </el-col>
     </el-row>
   </div>
 </template>
 
 <script>
-import upload from '@/components/upload.vue';
+import uploadImage from '@/layout/custom/uploadImage.vue';
+
 export default {
-  name: 'otheruserForm',
+  name: 'zhidaoForm',
   props: {
     ruleForm: null,
   },
   components: {
-    upload, //图片
+    uploadImage, //图片
   },
   data: () => ({
+    formTitle: '指导单位管理',
     rules: {
       name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
       link: [{ required: true, message: '请输入链接', trigger: 'blur' }],
+      image: [{ required: true}],
     },
   }),
   created() {},
@@ -49,18 +61,11 @@ export default {
     resetForm() {
       this.$emit('resetForm');
     },
-    uploadSuccess({ type, data }) {
-      if (type !== 'logo') {
-        let arr = _.get(this.ruleForm, type);
-        if (arr !== undefined) {
-          this.ruleForm[type].push({ name: data.name, uri: data.uri });
-        } else {
-          let newArr = [{ name: data.name, uri: data.uri }];
-          this.$set(this.ruleForm, `${type}`, newArr);
-        }
-      } else {
-        this.$set(this.ruleForm, `${type}`, data.uri);
-      }
+    uploadSuccess({ data }) {
+      this.$set(this.ruleForm, 'image', data.uri);
+    },
+    remove(file) {
+      this.$set(this.ruleForm, 'image', '')
     },
   },
 };
@@ -70,4 +75,116 @@ export default {
 .form {
   padding: 0 200px 0 0;
 }
+
+p {
+  padding: 0;
+  margin: 0;
+}
+
+.top .shu {
+  float: left;
+  width: 4px;
+  height: 20px;
+  background: rgba(233, 2, 29, 1);
+}
+
+.top .title {
+  float: left;
+  padding: 0 10px;
+  font-size: 16px;
+  font-family: Source Han Sans SC;
+  font-weight: bold;
+  color: rgba(40, 40, 40, 1);
+}
+
+/deep/ .el-textarea__inner {
+  min-height: 100px !important;
+}
+
+/deep/ .select {
+  width: 632px;
+}
+
+.selects {
+  width: 473px;
+  margin: 0 15px 0 0;
+}
+
+/deep/ .el-radio__input.is-checked + .el-radio__label {
+  color: #e9021d;
+}
+
+/deep/ .el-radio__input.is-checked .el-radio__inner {
+  border-color: #e9021d;
+  background: #e9021d;
+}
+
+/deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
+  color: #e9021d;
+}
+
+/deep/ .el-checkbox__input.is-checked .el-checkbox__inner,
+.el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: #e9021d;
+  border-color: #e9021d;
+}
+
+/deep/ .el-checkbox-button,
+.el-checkbox-button__inner {
+  margin: 0 15px 0 0;
+}
+
+/deep/ .el-checkbox-button__inner {
+  padding: 7px 5px;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+}
+
+/deep/ .el-checkbox-button__inner:hover {
+  color: #e9021d;
+}
+
+/deep/ .el-checkbox-button:first-child .el-checkbox-button__inner {
+  border-left: 1px solid #ccc;
+  border-radius: 5px;
+}
+
+/deep/ .el-checkbox-button:last-child .el-checkbox-button__inner {
+  border-radius: 5px;
+}
+
+/deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+  color: #e9021d;
+  background-color: #ffffff;
+  border-color: #e9021d;
+}
+
+/deep/ .el-checkbox-button.is-checked .el-checkbox-button__inner {
+  box-shadow: none;
+}
+
+/deep/ .el-switch.is-checked .el-switch__core {
+  border-color: #e9021d;
+  background-color: #e9021d;
+}
+
+.clickBtn .el-button {
+  width: 100px;
+  height: 40px;
+  padding: 0;
+  color: #ffffff;
+  background: #b9b9b9;
+  border-radius: 4px;
+  margin: 40px;
+}
+
+.clickBtn {
+  text-align: center;
+  margin: 40px 0;
+  border-top: 1px solid #ccc;
+}
+
+.clickBtn .el-button:first-child {
+  background-color: #e9021d;
+}
 </style>

+ 208 - 63
src/layout/zhidao/zhidaoList.vue

@@ -1,72 +1,217 @@
 <template>
-  <div id="otheruserList">
-    <el-row>
-      <el-col :span="24">
-        <el-table ref="debtTable" :data="debtTable" style="width: 100%" border>
-          <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
-          <el-table-column property="name" label="名称" align="center"> </el-table-column>
-          <el-table-column label="图片" align="center">
-            <template slot-scope="scope">
-              <span style="margin-left: 10px"> <el-image :src="scope.row.image"></el-image></span>
-            </template>
-          </el-table-column>
-          <el-table-column property="link" label="链接" align="center"> </el-table-column>
-
-          <el-table-column fixed="right" label="操作" align="center">
-            <template slot-scope="scope">
-              <el-button @click="$router.push({ path: '/zhidao/detail', query: { id: scope.row.id } })" type="text"><i class="el-icon-edit"></i></el-button>
-              <el-button @click.prevent="deleteRow(scope.row.id)" type="text"><i class="el-icon-delete"></i></el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        <el-row class="page">
-          <el-pagination
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-            :current-page="currentPage"
-            layout="total, prev, pager, next, jumper"
-            :total="total"
-          >
-          </el-pagination>
+    <div id="zhidaoList">
+        <el-row>
+            <el-col :span="24">
+                <el-col :span="24" class="search">
+                    <!--<el-col :span="5">
+                    <span>筛选条件:</span>
+                    <el-select v-model="search.region" placeholder="请选择">
+                      <el-option label="类型一" value="0"></el-option>
+                      <el-option label="类型二" value="1"></el-option>
+                    </el-select>
+                  </el-col>-->
+                    <el-col :span="4">
+                        <span>输入条件:</span>
+                        <el-input v-model="search.name" :placeholder="placeholder" class="input"></el-input>
+                    </el-col>
+                    <!--<el-col :span="7">
+                      <span>时间选择:</span>
+                      <el-date-picker v-model="search.date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
+                    </el-col>-->
+                    <el-col :span="8">
+                        <el-button class="btnSearch" @click="toQuery">查询</el-button>
+                        <el-button class="btnSearch qing" @click="toClear">清空</el-button>
+                    </el-col>
+                </el-col>
+                <el-col :span="24">
+                    <el-table
+                            ref="tableData"
+                            :data="tableData"
+                            tooltip-effect="dark"
+                            :default-sort="{ prop: 'date', order: 'descending' }"
+                            style="width: 100%"
+                            @selection-change="handleSelectionChange"
+                    >
+                        <!--<el-table-column type="selection" align="center"> </el-table-column>-->
+                        <el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
+                        <el-table-column property="name" label="名称" align="center"></el-table-column>
+                        <el-table-column label="图片" align="center">
+                            <template slot-scope="scope">
+                                <span> <el-image v-if="scope.row.image" :src="scope.row.image" style="height:20px;width:20px "
+                                                 @click="showImage(scope.row.image)"></el-image></span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column property="link" label="链接" align="center"></el-table-column>
+                        <el-table-column label="操作" align="center" width="300px">
+                            <template slot-scope="scope">
+                                <el-button size="mini" type="text" class="edit" icon="el-icon-edit"
+                                           @click="$router.push({ path: '/zhidao/detail', query: { id: scope.row.id } })"></el-button>
+                                <el-button size="mini" type="text" class="delete" icon="el-icon-delete"
+                                           @click.prevent="deleteRow(scope.row.id)"></el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                    <el-row>
+                        <el-pagination
+                                @size-change="handleSizeChange"
+                                @current-change="handleCurrentChange"
+                                :current-page.sync="currentPage"
+                                :page-sizes="[10, 20, 30, 40]"
+                                :page-size.sync="limit"
+                                background
+                                layout="total, sizes, prev, pager, next, jumper"
+                                :total="total"
+                        >
+                        </el-pagination>
+                    </el-row>
+                </el-col>
+            </el-col>
         </el-row>
-      </el-col>
-    </el-row>
-  </div>
+        <el-dialog
+                :visible.sync="dialogVisible"
+                width="30%"
+        >
+            <el-image :src="elImage" style="height:100%;width:100% "></el-image>
+        </el-dialog>
+    </div>
 </template>
 
 <script>
-export default {
-  name: 'otheruserList',
-  props: {
-    debtTable: null,
-    total: null,
-  },
-  components: {},
-  data: () => ({
-    currentPage: 1,
-  }),
-  created() {},
-  computed: {},
-  methods: {
-    deleteRow(id) {
-      this.$emit('deleteRow', id);
-    },
-    clickRest(id) {
-      this.$emit('clickRest', id);
-    },
-    handleSizeChange(val) {
-      console.log(`每页 ${val} 条`);
-    },
-    handleCurrentChange(val) {
-      console.log(`当前页: ${val}`);
-    },
-  },
-};
+    export default {
+        name: 'zhidaoList',
+        props: {
+            tableData: null,
+            total: null,
+        },
+        components: {},
+        data: () => ({
+            placeholder: '请输入名称',
+            search: {},
+            currentPage: 1,
+            limit: 10,
+            dialogVisible: false,
+            elImage: '',
+        }),
+        created() {
+        },
+        computed: {},
+        methods: {
+            handleSelectionChange(val) {
+                this.multipleSelection = val;
+            },
+            deleteRow(id) {
+                this.$set(this, `currentPage`, 1);
+                this.$emit('deleteRow', {id: id, skip: 0, limit: this.limit, ...this.search});
+            },
+            handleSizeChange(val) {
+                this.$set(this, `currentPage`, 1);
+                this.$emit('select', {skip: 0, limit: val, ...this.search});
+            },
+            handleCurrentChange(val) {
+                this.$emit('select', {skip: (val - 1) * this.limit, limit: this.limit, ...this.search});
+            },
+            toQuery() {
+                this.$set(this, `currentPage`, 1);
+                this.$emit('select', {skip: 0, limit: this.limit, ...this.search});
+            },
+            toClear() {
+                let keys = Object.keys(this.search);
+                for (const key of keys) {
+                    this.$set(this.search, `${key}`, '');
+                }
+            },
+            showImage(image) {
+              if(image){
+                this.$set(this, `elImage`, image);
+                this.$set(this, `dialogVisible`, true);
+              }else{
+                this.$set(this, `dialogVisible`, false);
+              }
+            }
+        },
+    };
 </script>
 
 <style lang="less" scoped>
-.page {
-  text-align: center;
-  padding: 15px 0;
-}
+    /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
+        background-color: red;
+        border-color: red;
+    }
+
+    /deep/ .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+        background-color: red;
+        border-color: red;
+    }
+
+    /deep/ .el-table th {
+        background-color: #f5f6fa;
+        padding: 8px 0;
+    }
+
+    /deep/ .el-table td {
+        padding: 11px 0;
+    }
+
+    .other {
+        color: #f36302;
+    }
+
+    .view {
+        color: #f36302;
+    }
+
+    .edit {
+        color: #2ccc02;
+    }
+
+    .delete {
+        color: #e9021d;
+    }
+
+    /deep/ .el-pagination {
+        padding: 26px 20px;
+    }
+
+    /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
+        background-color: red;
+    }
+
+    .input {
+        width: 150px;
+    }
+
+    /deep/ .el-input__inner {
+        height: 35px;
+        line-height: 35px;
+    }
+
+    .btnSearch {
+        width: 80px;
+        height: 34px;
+        background: rgba(233, 2, 29, 1);
+        border-radius: 4px;
+        padding: 0;
+        color: #fff;
+    }
+
+    .qing {
+        background: rgba(185, 185, 185, 1);
+    }
+
+    .top {
+        height: 50px;
+        margin: 0 0 10px 0;
+    }
+
+    .search {
+        background: #ffffff;
+        width: 97%;
+        height: 35px;
+        margin: 20px;
+        margin-left: 0px;
+    }
+
+    .list {
+        padding: 0 20px;
+    }
 </style>

+ 69 - 1
src/router/index.js

@@ -65,6 +65,12 @@ const routes = [
     path: '/companyuser/index',
     component: () => import('../views/companyuser/index.vue'),
   },
+
+  {
+    path: '/companyuser/detail',
+    component: () => import('../views/companyuser/detail.vue'),
+  },
+
   //指导单位
   {
     path: '/zhidao/index',
@@ -116,7 +122,52 @@ const routes = [
     component: () => import('../views/region/detail.vue'),
   },
 
-  //融资专家
+  //数字延伸服务管理
+  {
+    path: '/financialService/index',
+    component: () => import('../views/financialService/index.vue'),
+  },
+  {
+    path: '/financialService/detail',
+    component: () => import('../views/financialService/detail.vue'),
+  },
+
+  {
+    path: '/digitalService/index',
+    component: () => import('../views/digitalService/index.vue'),
+  },
+  {
+    path: '/digitalService/detail',
+    component: () => import('../views/digitalService/detail.vue'),
+  },
+
+  {
+    path: '/legalService/index',
+    component: () => import('../views/legalService/index.vue'),
+  },
+  {
+    path: '/legalService/detail',
+    component: () => import('../views/legalService/detail.vue'),
+  },
+
+  {
+    path: '/technicalService/index',
+    component: () => import('../views/technicalService/index.vue'),
+  },
+  {
+    path: '/technicalService/detail',
+    component: () => import('../views/technicalService/detail.vue'),
+  },
+
+  {
+    path: '/marketService/index',
+    component: () => import('../views/marketService/index.vue'),
+  },
+  {
+    path: '/marketService/detail',
+    component: () => import('../views/marketService/detail.vue'),
+  },
+
   {
     path: '/specialist/index',
     component: () => import('../views/specialist/index.vue'),
@@ -125,6 +176,23 @@ const routes = [
     path: '/specialist/detail',
     component: () => import('../views/specialist/detail.vue'),
   },
+  //政策服务管理
+  {
+    path: '/tInformationDelivery/index',
+    component: () => import('../views/tInformationDelivery/index.vue'),
+  },
+  {
+    path: '/tInformationDelivery/detail',
+    component: () => import('../views/tInformationDelivery/detail.vue'),
+  },
+  {
+    path: '/tPolicyInterpretation/index',
+    component: () => import('../views/tPolicyInterpretation/index.vue'),
+  },
+  {
+    path: '/tPolicyInterpretation/detail',
+    component: () => import('../views/tPolicyInterpretation/detail.vue'),
+  },
 
   {
     path: '/login',

+ 34 - 0
src/store/dictionary.js

@@ -0,0 +1,34 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  companyuserInfo: `/api/financial/dictionary`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.companyuserInfo}`, { skip, limit, ...info });
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.companyuserInfo}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.companyuserInfo}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.companyuserInfo}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 16 - 0
src/store/index.js

@@ -9,6 +9,14 @@ import character from './character';
 import menurole from './menurole';
 import region from './region';
 import profession from './profession';
+import tDeclarationApproval from './tDeclarationApproval';
+import tDigitalService from './tDigitalService';
+import tFinancingExpert from './tFinancingExpert';
+import tGuidanceUnit from './tGuidanceUnit';
+import tInformationDelivery from './tInformationDelivery';
+import tNewsCenter from './tNewsCenter';
+import tPolicyInterpretation from './tPolicyInterpretation';
+import dictionary from './dictionary';
 import login from './login';
 import * as muta from './user/mutations';
 import * as states from './user/state';
@@ -26,7 +34,15 @@ export default new Vuex.Store({
     menurole,
     region,
     profession,
+    tDeclarationApproval,
+    tDigitalService,
+    tFinancingExpert,
+    tGuidanceUnit,
+    tInformationDelivery,
+    tNewsCenter,
+    tPolicyInterpretation,
     login,
+    dictionary,
   },
   state: { ...states },
   mutations: { ...muta },

+ 6 - 0
src/store/otheruser.js

@@ -25,6 +25,12 @@ const actions = {
     const res = await this.$axios.$post(`${api.otheruserInfo}/update/${id}`, data);
     return res;
   },
+
+  async updates({ commit }, { ...data }) {
+    const res = await this.$axios.$post(`${api.otheruserInfo}/uppasswd`, data);
+    return res;
+  },
+
   async delete({ commit }, payload) {
     const res = await this.$axios.$delete(`${api.otheruserInfo}/${payload}`);
     return res;

+ 38 - 0
src/store/tDeclarationApproval.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tDeclarationApproval`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 38 - 0
src/store/tDigitalService.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tDigitalService`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 38 - 0
src/store/tFinancingExpert.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tFinancingExpert`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 38 - 0
src/store/tGuidanceUnit.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tGuidanceUnit`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 38 - 0
src/store/tInformationDelivery.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tInformationDelivery`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}/select`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 38 - 0
src/store/tNewsCenter.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tNewsCenter`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 38 - 0
src/store/tPolicyInterpretation.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+    characterInfo: `/api/financial/tPolicyInterpretation`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+    async query({ commit }, { skip = 0, limit, ...info } = {}) {
+        const res = await this.$axios.$get(`${api.characterInfo}/select`, { skip, limit, ...info });
+        return res;
+    },
+    async create({ commit }, payload) {
+        const res = await this.$axios.$post(`${api.characterInfo}`, payload);
+        return res;
+    },
+    async fetch({ commit }, payload) {
+        const res = await this.$axios.$get(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+    async update({ commit }, { id, ...data }) {
+        const res = await this.$axios.$post(`${api.characterInfo}/update/${id}`, data);
+        return res;
+    },
+    async delete({ commit }, payload) {
+        const res = await this.$axios.$delete(`${api.characterInfo}/${payload}`);
+        return res;
+    },
+};
+export default {
+    namespaced: true,
+    state,
+    mutations,
+    actions,
+};

+ 17 - 4
src/views/character/index.vue

@@ -6,10 +6,10 @@
       </el-col>
       <el-col :span="24" class="main">
         <el-col :span="24" class="search">
-          <searchInfo></searchInfo>
+          <searchInfo @sousuo="sousuo"></searchInfo>
         </el-col>
         <el-col :span="24" class="list">
-          <characterList :total="total" :debtTable="debtTable" @deleteRow="deleteRow"></characterList>
+          <characterList :total="total" @handleCurrentChange="handleCurrentChange" :debtTable="debtTable" @deleteRow="deleteRow"></characterList>
         </el-col>
       </el-col>
     </el-col>
@@ -35,6 +35,8 @@ export default {
     topTitle: '角色管理',
     display: 'bk',
     debtTable: [],
+    skip: '',
+    info: {},
   }),
   created() {
     this.searchInfo();
@@ -43,10 +45,11 @@ export default {
   methods: {
     ...character(['query', 'delete']),
 
-    async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
+    async searchInfo({ skip, limit = 10, ...info } = {}) {
+      info = this.info;
+      skip = this.skip;
       const res = await this.query({ skip, limit, ...info });
       console.log(res.total);
-
       this.$set(this, `debtTable`, res.data);
       this.$set(this, `total`, res.total);
     },
@@ -60,6 +63,16 @@ export default {
       this.$checkRes(res, '删除成功', '删除失败');
       this.searchInfo();
     },
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+
+      this.searchInfo();
+    },
+    async sousuo(search) {
+      console.log(search);
+      this.$set(this, `info`, search);
+      this.searchInfo();
+    },
   },
 };
 </script>

+ 7 - 5
src/views/companyidentify/detail.vue

@@ -3,7 +3,7 @@
     <el-row>
       <el-col :span="24" class="debt">
         <el-col :span="24" class="top">
-          <topInfo :topTitle="topTitle" :display="display"></topInfo>
+          <detailTopInfo :topTitle="topTitle" :display="display"></detailTopInfo>
         </el-col>
         <el-col :span="24" class="main">
           <el-col :span="24" class="back">
@@ -30,7 +30,7 @@
 </template>
 
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
+import detailTopInfo from '@/layout/common/detailTopInfo.vue';
 import detailTop from '@/layout/common/detailTop.vue';
 import detailInfo from '@/layout/companyidentify/detailInfo.vue';
 import { createNamespacedHelpers } from 'vuex';
@@ -41,7 +41,7 @@ export default {
   name: 'detail',
   props: {},
   components: {
-    topInfo, //头部导航
+    detailTopInfo, //头部导航
     detailTop, //头部返回
     detailInfo, //审核
   },
@@ -108,14 +108,16 @@ export default {
       this.ruleForm.status = 1;
       console.log(this.ruleForm);
       let res = this.update(this.ruleForm);
+      this.$checkRes(res, '认证成功', '发布失败');
+      this.$router.push({ path: '/companyidentify/index' });
     },
     // 取消
     resetForm(ruleForm) {
       this.ruleForm.status = 2;
       console.log(this.ruleForm);
       let res = this.update(this.ruleForm);
-
-      // this.$router.push({ path: '/companyup/index' });
+      this.$checkRes(res, '认证失败', '发布失败');
+      this.$router.push({ path: '/companyidentify/index' });
     },
     // 返回
     goBack() {

+ 45 - 7
src/views/companyidentify/index.vue

@@ -14,6 +14,9 @@
           @handleClick="handleClick"
           :noshenhetable="noshenhetable"
           :shenheTable="shenheTable"
+          @handleCurrentChange="handleCurrentChange"
+          @handleCurrentChanges="handleCurrentChanges"
+          @handleCurrentChangess="handleCurrentChangess"
         ></newsInfo>
       </el-col>
     </el-col>
@@ -43,30 +46,65 @@ export default {
     total: 0,
     totals: 0,
     totalss: 0,
+    skip: '',
   }),
   created() {
     this.search();
+    this.searchinfo();
+    this.searchinfos();
   },
   computed: {},
 
   methods: {
     ...mapActions(['query', 'delete']),
-    async search({ skip = 0, limit = 10, ...info } = {}) {
+    async search({ skip, limit = 10, ...info } = {}) {
+      let sea = { status: 0 };
+      info = sea;
+      skip = this.skip;
       const res = await this.query({ skip, limit, ...info });
+      console.log(res);
       var weishenhe = res.data.filter(item => item.status === '0');
-      var success = res.data.filter(item => item.status === '1');
-      var shibai = res.data.filter(item => item.status === '2');
       this.$set(this, `debtTable`, weishenhe);
+      this.$set(this, `total`, res.total);
+    },
+
+    async searchinfo({ skip, limit = 10, ...info } = {}) {
+      let sea = { status: 1 };
+      info = sea;
+      skip = this.skip;
+      const res = await this.query({ skip, limit, ...info });
+      var success = res.data.filter(item => item.status === '1');
       this.$set(this, `shenheTable`, success);
+      this.$set(this, `totals`, res.total);
+    },
+
+    async searchinfos({ skip, limit = 10, ...info } = {}) {
+      let sea = { status: 2 };
+      info = sea;
+      skip = this.skip;
+      const res = await this.query({ skip, limit, ...info });
+      var shibai = res.data.filter(item => item.status === '2');
       this.$set(this, `noshenhetable`, shibai);
-      this.$set(this, `total`, weishenhe.length);
-      this.$set(this, `totals`, success.length);
-      this.$set(this, `totalss`, shibai.length);
+      this.$set(this, `totalss`, res.total);
     },
+
     handleClick(newid) {
       console.log(newid);
       this.$router.push({ path: '/companyidentify/detail', query: { id: newid } });
     },
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.search();
+    },
+    async handleCurrentChanges({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.searchinfo();
+    },
+    async handleCurrentChangess({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+
+      this.searchinfos();
+    },
   },
 };
 </script>
@@ -79,7 +117,7 @@ export default {
 .main {
   height: 765px;
   background: #ffffff;
-  padding: 0 20px 0 20px;
+  padding: 0 30px 0 30px;
 }
 .search {
   width: 97%;

+ 4 - 3
src/views/companyup/detail.vue

@@ -3,7 +3,7 @@
     <el-row>
       <el-col :span="24" class="debt">
         <el-col :span="24" class="top">
-          <topInfo :topTitle="topTitle" :display="display"></topInfo>
+          <detailTopInfo :topTitle="topTitle" :display="display"></detailTopInfo>
         </el-col>
         <el-col :span="24" class="main">
           <el-col :span="24" class="back">
@@ -31,7 +31,7 @@
 </template>
 
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
+import detailTopInfo from '@/layout/common/detailTopInfo.vue';
 import detailTop from '@/layout/common/detailTop.vue';
 import detailInfo from '@/layout/companyup/detailInfo.vue';
 import { createNamespacedHelpers } from 'vuex';
@@ -41,7 +41,7 @@ export default {
   name: 'detail',
   props: {},
   components: {
-    topInfo, //头部导航
+    detailTopInfo, //头部导航
     detailTop, //返回
     detailInfo, //提交
   },
@@ -110,6 +110,7 @@ export default {
       this.ruleForm.status = 1;
       console.log(this.ruleForm);
       let res = this.update(this.ruleForm);
+      this.$checkRes(res, '审核成功', '审核成功');
     },
     // 取消
     resetForm(ruleForm) {

+ 41 - 12
src/views/companyup/index.vue

@@ -16,6 +16,9 @@
           @handleClick="handleClick"
           :noshenhetable="noshenhetable"
           :shenheTable="shenheTable"
+          @handleCurrentChange="handleCurrentChange"
+          @handleCurrentChanges="handleCurrentChanges"
+          @handleCurrentChangess="handleCurrentChangess"
         ></newsInfo>
       </el-col>
     </el-col>
@@ -49,27 +52,53 @@ export default {
   }),
   created() {
     this.search();
+    this.searchinfo();
+    this.searchinfos();
   },
   computed: {},
   methods: {
     ...mapActions(['query', 'delete']),
-    async search({ skip = 0, limit = 10, ...info } = {}) {
+    async search({ skip, limit = 10, ...info } = {}) {
+      let status = { status: 0 };
+      info = status;
+      skip = this.skip;
       const res = await this.query({ skip, limit, ...info });
       var weishenhe = res.data.filter(item => item.status === '0');
-      var success = res.data.filter(item => item.status === '1');
-      var shibai = res.data.filter(item => item.status === '2');
-      console.log(shibai);
-      console.log(weishenhe);
-      console.log(success);
-      success.length;
-      this.$set(this, `total`, weishenhe.length);
-      this.$set(this, `totals`, success.length);
-      this.$set(this, `totalss`, shibai.length);
+      this.$set(this, `total`, res.total);
       this.$set(this, `debtTable`, weishenhe);
+    },
+
+    async searchinfo({ skip, limit = 10, ...info } = {}) {
+      let status = { status: 1 };
+      info = status;
+      skip = this.skip;
+      const res = await this.query({ skip, limit, ...info });
+      var success = res.data.filter(item => item.status === '1');
+      this.$set(this, `totals`, res.total);
       this.$set(this, `shenheTable`, success);
-      this.$set(this, `noshenhetable`, shibai);
     },
 
+    async searchinfos({ skip, limit = 10, ...info } = {}) {
+      let status = { status: 2 };
+      info = status;
+      skip = this.skip;
+      const res = await this.query({ skip, limit, ...info });
+      var shibai = res.data.filter(item => item.status === '2');
+      this.$set(this, `totalss`, res.total);
+      this.$set(this, `noshenhetable`, shibai);
+    },
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.search();
+    },
+    async handleCurrentChanges({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.searchinfo();
+    },
+    async handleCurrentChangess({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.searchinfos();
+    },
     // 修改
     handleClick(newid) {
       this.$router.push({ path: '/companyup/detail', query: { id: newid } });
@@ -86,7 +115,7 @@ export default {
 .main {
   height: 765px;
   background: #ffffff;
-  padding: 0 20px 0 20px;
+  padding: 0 30px 0 30px;
 }
 .search {
   width: 97%;

+ 108 - 0
src/views/companyuser/detail.vue

@@ -0,0 +1,108 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="debt">
+        <el-col :span="24" class="top">
+          <!-- <topInfo :topTitle="topTitle" :display="display"></topInfo> -->
+          <detailTopInfo :topTitle="topTitle" :display="display"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <userForm :ruleForm="ruleForm" :formTitle="formTitle" :charList="charList" @submitForm="submitForm" @resetForm="resetForm"></userForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import topInfo from '@/layout/common/topInfo.vue';
+import detailTopInfo from '@/layout/common/detailTopInfo.vue';
+import userForm from '@/layout/companyuser/userForm.vue';
+import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: otheruser } = createNamespacedHelpers('companyuser');
+const { mapActions: character } = createNamespacedHelpers('character');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    detailTopInfo, //头部导航
+    userForm, //头部返回
+  },
+  data: () => ({
+    topTitle: '用户信息管理',
+    display: 'block',
+
+    formTitle: '其他用户管理',
+    ruleForm: {
+      passwd: '123456',
+      characterid: '',
+    },
+    charList: {
+      name: '10',
+    },
+  }),
+  created() {
+    this.searchInfo();
+  },
+  computed: {
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  methods: {
+    ...otheruser(['query', 'fetch', 'update', 'create']),
+    ...character({ charquery: 'query', charFetch: 'fetch' }),
+    async searchInfo() {
+      if (this.id) {
+        const res = await this.fetch(this.id);
+        this.$set(this, `ruleForm`, res.data);
+      }
+    },
+
+    // 提交
+    async submitForm({ data }) {
+      let res;
+      if (this.id) {
+        res = await this.update(data);
+        if (res.errcode === 0) {
+          this.$message({
+            message: '信息修改成功',
+            type: 'success',
+          });
+        }
+      } else {
+        res = await this.create(data);
+        if (res.errcode === 0) {
+          this.$message({
+            message: '信息创建成功',
+            type: 'success',
+          });
+        }
+      }
+      if (this.$checkRes(res)) this.resetForm();
+
+      console.log(res.data);
+    },
+    // 取消
+    resetForm() {
+      this.$router.push({ path: '/companyuser/index' });
+    },
+    // 返回
+    goBack() {
+      this.$router.go(-1);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top {
+  height: 50px;
+  margin: 0 0 10px 0;
+}
+.main {
+  min-height: 765px;
+  background: #ffffff;
+  padding: 20px;
+}
+</style>

+ 25 - 19
src/views/companyuser/index.vue

@@ -6,10 +6,10 @@
       </el-col>
       <el-col :span="24" class="main">
         <el-col :span="24" class="search">
-          <searchInfo></searchInfo>
+          <searchInfo @sousuo="sousuo"></searchInfo>
         </el-col>
         <el-col :span="24" class="list">
-          <companyuserList :debtTable="debtTable" @deleteRow="deleteRow" :total="total"></companyuserList>
+          <companyuserList @handleCurrentChange="handleCurrentChange" @deleteRow="deleteRow" :debtTable="debtTable" :total="total"></companyuserList>
         </el-col>
       </el-col>
     </el-row>
@@ -36,36 +36,42 @@ export default {
     total: 0,
     topTitle: '企业用户',
     display: 'block',
-    debtTable: [
-      {
-        company_name: '测试企业1',
-        institution_name: '推荐单位1',
-        phone: '123456789',
-      },
-      {
-        company_name: '测试企业2',
-        institution_name: '推荐单位2',
-        phone: '123456789',
-      },
-    ],
+    debtTable: [],
+    skip: '',
+    info: {},
   }),
   created() {
     this.searchInfo();
   },
   computed: {},
   methods: {
-    ...companyuser(['query']),
-    async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
+    ...companyuser(['query', 'delete']),
+    async searchInfo({ skip, limit = 10, ...info } = {}) {
+      skip = this.skip;
+      info = this.info;
       const res = await this.query({ skip, limit, ...info });
       console.log(res);
       this.$set(this, `debtTable`, res.data);
       this.$set(this, `total`, res.total);
     },
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.searchInfo();
+    },
+    async sousuo(search) {
+      console.log(search);
+      this.$set(this, `info`, search);
+      this.searchInfo();
+    },
     // 删除
-    deleteRow(id) {
-      console.log(id);
+    async deleteRow(id) {
+      const res = await this.delete(id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.searchInfo();
+    },
+    add() {
+      this.$router.push({ path: '/companyuser/detail' });
     },
-    add() {},
   },
 };
 </script>

+ 102 - 0
src/views/digitalService/detail.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <digitalServiceForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading"></digitalServiceForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import digitalServiceForm from '@/layout/digitalService/digitalServiceForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      digitalServiceForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '数字化服务管理',
+      ruleForm: {},
+      loading: true,
+      type:'1',
+    }),
+    created() {
+      this.select();
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      // 提交
+      async submitForm({ data }) {
+        if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create({type:this.type,...data});
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/digitalService/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 82 - 0
src/views/digitalService/index.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <digitalServiceList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" :type="type"></digitalServiceList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import digitalServiceList from '@/layout/digitalService/digitalServiceList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      digitalServiceList, //列表
+    },
+    data: () => ({
+      topTitle: '数字化服务管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+      type:'1',
+    }),
+    created() {
+      this.select({type:this.type});
+    },
+    computed: {},
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10,  ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/digitalService/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 102 - 0
src/views/financialService/detail.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <financialServiceForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading"></financialServiceForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import financialServiceForm from '@/layout/financialService/financialServiceForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      financialServiceForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '财务服务管理',
+      ruleForm: {},
+      loading: true,
+      type:'0',
+    }),
+    created() {
+      this.select();
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      // 提交
+      async submitForm({ data }) {
+        if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create({type:this.type,...data});
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/financialService/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 82 - 0
src/views/financialService/index.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <financialServiceList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" :type="type"></financialServiceList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import financialServiceList from '@/layout/financialService/financialServiceList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      financialServiceList, //列表
+    },
+    data: () => ({
+      topTitle: '财务服务管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+      type:'0',
+    }),
+    created() {
+      this.select({type:this.type});
+    },
+    computed: {},
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10,  ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/financialService/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 17 - 2
src/views/institution/detail.vue

@@ -6,7 +6,7 @@
           <detailTopInfo :topTitle="topTitle" :display="display"></detailTopInfo>
         </el-col>
         <el-col :span="24" class="main">
-          <detailInfo :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :formTitle="formTitle"></detailInfo>
+          <detailInfo :ruleForm="ruleForm" :rzlc="rzlc" :options="options" @submitForm="submitForm" @resetForm="resetForm" :formTitle="formTitle"></detailInfo>
         </el-col>
       </el-col>
     </el-row>
@@ -19,6 +19,7 @@ import detailInfo from '@/layout/institution/detailInfo.vue';
 
 import { createNamespacedHelpers } from 'vuex';
 const { mapActions } = createNamespacedHelpers('institution');
+const { mapActions: Mapdictionary } = createNamespacedHelpers('dictionary');
 export default {
   name: 'detail',
   props: {},
@@ -31,9 +32,12 @@ export default {
     display: 'block',
     formTitle: '信息管理',
     ruleForm: {},
+    options: [],
+    rzlc: [],
   }),
   created() {
     this.search();
+    this.searchinfo();
   },
   computed: {
     id() {
@@ -42,16 +46,27 @@ export default {
   },
   methods: {
     ...mapActions(['query', 'delete', 'fetch', 'update']),
+    ...Mapdictionary({ list: 'query' }),
     async search() {
       const res = await this.fetch(this.id);
       console.log(res.data);
       this.$set(this, `ruleForm`, res.data);
     },
+
+    async searchinfo() {
+      const val = await this.list();
+      console.log(val.data);
+      // var options = res.data.filter(item => item.type === '0');
+      // var rzlc = res.data.filter(item => item.type === '1');
+      this.$set(this, `options`, val.data);
+      this.$set(this, `rzlc`, val.data);
+    },
     // 提交
     submitForm(ruleForm) {
       console.log(ruleForm);
       let res = this.update(this.ruleForm);
-      this.$router.push({ path: '/institution/index' });
+      this.$checkRes(res, '修改成功', '修改失败');
+      this.$router.push({ path: '/institution/index/0' });
     },
     // 取消
     resetForm() {

+ 67 - 22
src/views/institution/index.vue

@@ -6,10 +6,18 @@
       </el-col>
       <el-col :span="24" class="main">
         <el-col :span="24" class="search">
-          <searchInfo></searchInfo>
+          <searchInfo @sousuo="sousuo"></searchInfo>
         </el-col>
         <el-col :span="24" class="list">
-          <newsInfo :debtTable="debtTable" :total="totals" :totals="totals" :totalss="totalss" @handleClick="handleClick"></newsInfo>
+          <newsInfo
+            :debtTable="debtTable"
+            @handleCurrentChange="handleCurrentChange"
+            @deleteRow="deleteRow"
+            :total="total"
+            :totals="totals"
+            :totalss="totalss"
+            @handleClick="handleClick"
+          ></newsInfo>
         </el-col>
       </el-col>
     </el-row>
@@ -49,6 +57,9 @@ export default {
     total: 0,
     totals: 0,
     totalss: 0,
+    type: '',
+    skip: '',
+    info: {},
   }),
   created() {
     // this.search();
@@ -74,12 +85,18 @@ export default {
 
         if (oval == 0) {
           console.log('if');
+          this.skip = '';
+          this.info = {};
           this.search();
         } else if (oval == 1) {
+          this.skip = '';
+          this.info = {};
           console.log('elseif');
           this.searchstatus1();
         } else {
           console.log('else');
+          this.skip = '';
+          this.info = {};
           this.searchelse();
         }
       },
@@ -92,39 +109,67 @@ export default {
     add() {
       // this.$router.push({ path: '/test/detail' });
     },
-    // 修改
+
     ...mapActions(['query', 'delete']),
     async search({ skip = 0, limit = 10, ...info } = {}) {
-      console.log(status);
-
+      // console.log(this.info.name);
+      let type = { type: 0, name: this.info.name };
+      this.$set(this, `type`, type.type);
+      skip = this.skip;
+      info = type;
       const res = await this.query({ skip, limit, ...info });
+      this.$set(this, `debtTable`, res.data);
+      this.$set(this, `total`, res.total);
+    },
 
-      var weishenhe = res.data.filter(item => item.type === '0');
-      console.log(weishenhe);
-
-      this.$set(this, `debtTable`, weishenhe);
-      this.$set(this, `total`, weishenhe.length);
+    async deleteRow(id) {
+      const res = await this.delete(id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.search();
     },
     async searchstatus1({ skip = 0, limit = 10, ...info } = {}) {
-      console.log(status);
-
+      let type = { type: 1, name: this.info.name };
+      this.$set(this, `type`, type.type);
+      info = type;
+      skip = this.skip;
       const res = await this.query({ skip, limit, ...info });
 
-      var weishenhe = res.data.filter(item => item.type === '1');
-
-      this.$set(this, `debtTable`, weishenhe);
-      this.$set(this, `totals`, weishenhe.length);
+      this.$set(this, `debtTable`, res.data);
+      this.$set(this, `total`, res.total);
     },
     async searchelse({ skip = 0, limit = 10, ...info } = {}) {
-      console.log(status);
+      let type = { type: 2, name: this.info.name };
+      this.$set(this, `type`, type.type);
+      skip = this.skip;
+      info = type;
 
       const res = await this.query({ skip, limit, ...info });
-      console.log(res.data);
-      var weishenhe = res.data.filter(item => item.type === '2');
-      console.log(weishenhe);
 
-      this.$set(this, `debtTable`, weishenhe);
-      this.$set(this, `totalss`, weishenhe.length);
+      this.$set(this, `debtTable`, res.data);
+
+      this.$set(this, `total`, res.total);
+    },
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      console.log(this.type);
+      if (this.type == 0) {
+        this.search();
+      } else if (this.type == 1) {
+        this.searchstatus1();
+      } else if (this.type == 2) {
+        this.searchelse();
+      }
+    },
+    //搜索
+    async sousuo(search) {
+      this.$set(this, `info`, search);
+      if (this.type == 0) {
+        this.search();
+      } else if (this.type == 1) {
+        this.searchstatus1();
+      } else if (this.type == 2) {
+        this.searchelse();
+      }
     },
     handleClick(newid) {
       this.$router.push({ path: '/institution/detail', query: { id: newid } });

+ 102 - 0
src/views/legalService/detail.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <legalServiceForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading"></legalServiceForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import legalServiceForm from '@/layout/legalService/legalServiceForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      legalServiceForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '法律服务管理',
+      ruleForm: {},
+      loading: true,
+      type:'2',
+    }),
+    created() {
+      this.select();
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      // 提交
+      async submitForm({ data }) {
+        if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create({type:this.type,...data});
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/legalService/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 82 - 0
src/views/legalService/index.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <legalServiceList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" :type="type"></legalServiceList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import legalServiceList from '@/layout/legalService/legalServiceList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      legalServiceList, //列表
+    },
+    data: () => ({
+      topTitle: '法律服务管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+      type:'2',
+    }),
+    created() {
+      this.select({type:this.type});
+    },
+    computed: {},
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10,  ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/legalService/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 102 - 0
src/views/marketService/detail.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <marketServiceForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading"></marketServiceForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import marketServiceForm from '@/layout/marketService/marketServiceForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      marketServiceForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '市场服务管理',
+      ruleForm: {},
+      loading: true,
+      type:'4',
+    }),
+    created() {
+      this.select();
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      // 提交
+      async submitForm({ data }) {
+        if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create({type:this.type,...data});
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/marketService/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 82 - 0
src/views/marketService/index.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <marketServiceList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" :type="type"></marketServiceList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import marketServiceList from '@/layout/marketService/marketServiceList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      marketServiceList, //列表
+    },
+    data: () => ({
+      topTitle: '市场服务管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+      type:'4',
+    }),
+    created() {
+      this.select({type:this.type});
+    },
+    computed: {},
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10,  ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/marketService/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 79 - 86
src/views/news/detail.vue

@@ -1,17 +1,12 @@
 <template>
   <div id="detail">
     <el-row>
-      <el-col :span="24" class="debt">
+      <el-col :span="24">
         <el-col :span="24" class="top">
-          <topInfo :topTitle="topTitle" :display="display"></topInfo>
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
         </el-col>
         <el-col :span="24" class="main">
-          <el-col :span="24" class="back">
-            <detailTop @goBack="goBack"></detailTop>
-          </el-col>
-          <el-col :span="24" class="info">
-            <newsForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm"></newsForm>
-          </el-col>
+          <newsForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading"></newsForm>
         </el-col>
       </el-col>
     </el-row>
@@ -19,90 +14,88 @@
 </template>
 
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
-import detailTop from '@/layout/common/detailTop.vue';
-import newsForm from '@/layout/news/newsForm.vue';
-import { createNamespacedHelpers, mapGetters } from 'vuex';
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import newsForm from '@/layout/news/newsForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tNewsCenter } = createNamespacedHelpers('tNewsCenter');
 
-export default {
-  name: 'detail',
-  props: {},
-  components: {
-    topInfo, //头部导航
-    detailTop, //头部返回
-    newsForm, //添加其他用户
-  },
-  data: () => ({
-    display: 'none',
-    topTitle: '新闻中心内容管理',
-    ruleForm: {},
-  }),
-  created() {
-    this.searchInfo();
-  },
-  computed: {
-    id() {
-      return this.$route.query.id;
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      newsForm,
     },
-  },
-  methods: {
-    // ...otheruser(['query', 'fetch', 'update', 'create']),
-    // ...character({ charquery: 'query', charFetch: 'fetch' }),
-    async searchInfo() {
-      // if (this.id) {
-      //   const res = await this.fetch(this.id);
-      //   this.$set(this, `ruleForm`, res.data);
-      // }
+    data: () => ({
+      display: 'block',
+      topTitle: '新闻中心管理',
+      ruleForm: {},
+      loading: true,
+    }),
+    created() {
+      this.select();
     },
-
-    // 提交
-    async submitForm({ data }) {
-      // let res;
-      // if (this.id) {
-      //   res = await this.update(data);
-      //   if (res.errcode === 0) {
-      //     this.$message({
-      //       message: '信息修改成功',
-      //       type: 'success',
-      //     });
-      //   }
-      // } else {
-      //   res = await this.create(data);
-      //   if (res.errcode === 0) {
-      //     this.$message({
-      //       message: '信息创建成功',
-      //       type: 'success',
-      //     });
-      //   }
-      // }
-      // if (this.$checkRes(res)) this.resetForm();
-      // console.log(res.data);
-    },
-    // 取消
-    resetForm() {
-      this.$router.push({ path: '/news/index' });
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
     },
-    // 返回
-    goBack() {
-      this.$router.go(-1);
+    methods: {
+      ...tNewsCenter(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      // 提交
+      async submitForm({ data }) {
+        /*if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }*/
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/news/index' });
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.debt {
-  padding: 20px;
-}
-.top {
-  border-bottom: 1px solid #ccc;
-}
-.main {
-  border-radius: 10px;
-  margin: 20px 0 0 0;
-  box-shadow: 0 0 3px #666;
-}
-.main .back {
-  padding: 10px 0 10px 15px;
-}
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
 </style>

+ 65 - 64
src/views/news/index.vue

@@ -1,80 +1,81 @@
 <template>
   <div id="index">
-    <el-col :span="24" class="debt">
+    <el-row>
       <el-col :span="24" class="top">
-        <topInfo :topTitle="topTitle" :display="display" @clickBtn="clickBtn"></topInfo>
-      </el-col>
-      <el-col :span="24" class="search">
-        <searchInfo></searchInfo>
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
       </el-col>
       <el-col :span="24" class="main">
-        <newsList :debtTable="debtTable" :total="total" @deleteRow="deleteRow" @clickRest="clickRest"></newsList>
+        <el-col :span="24" class="list">
+          <newsList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" @publish="publish"></newsList>
+        </el-col>
       </el-col>
-    </el-col>
+    </el-row>
   </div>
 </template>
-
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
-import searchInfo from '@/layout/common/searchInfo.vue';
-import newsList from '@/layout/news/newsList.vue';
-// import { createNamespacedHelpers, mapGetters } from 'vuex';
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import newsList from '@/layout/news/newsList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tNewsCenter } = createNamespacedHelpers('tNewsCenter');
 
-export default {
-  name: 'index',
-  props: {},
-  components: {
-    topInfo, //头部导航
-    searchInfo, //搜素
-    newsList, //其他用户列表
-  },
-  data: () => ({
-    topTitle: '新闻中心内容管理',
-    display: 'block',
-    debtTable: [
-      {
-        image: require('@/assets/logo.png'),
-        title: 'title',
-        issuing_organ: '科技厅',
-        score: '1',
-        subject_classification: '123',
-        issued_number: '131',
-        publish_time: '21:12',
-        publish_state: '1',
-      },
-    ],
-    total: 1,
-  }),
-  created() {
-    // this.searchInfo();
-  },
-  computed: {},
-  methods: {
-    // ...otheruser(['query', 'delete', 'update']),
-    // async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
-    //   const res = await this.query({ skip, limit, ...info });
-    //   this.$set(this, `debtTable`, res.data);
-    //   this.$set(this, `total`, res.total);
-    // },
-    // 添加
-    clickBtn() {
-      this.$router.push({ path: '/news/detail' });
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      newsList, //列表
+    },
+    data: () => ({
+      topTitle: '新闻中心管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+    }),
+    created() {
+      this.select();
     },
-    async clickRest() {},
-    async deleteRow(id) {
-      // const res = await this.delete(id);
-      // this.$checkRes(res, '删除成功', '删除失败');
-      // this.searchInfo();
+    computed: {},
+    methods: {
+      ...tNewsCenter(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/news/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.debt {
-  padding: 20px;
-}
-.top {
-  border-bottom: 1px solid #ccc;
-}
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
 </style>

+ 30 - 4
src/views/otheruser/index.vue

@@ -6,10 +6,17 @@
       </el-col>
       <el-col :span="24" class="main">
         <el-col :span="24" class="search">
-          <searchInfo></searchInfo>
+          <searchInfo @sousuo="sousuo"></searchInfo>
         </el-col>
         <el-col :span="24" class="list">
-          <otheruserList :debtTable="debtTable" :total="total" @deleteRow="deleteRow" @clickRest="clickRest"></otheruserList>
+          <otheruserList
+            :debtTable="debtTable"
+            @handleCurrentChange="handleCurrentChange"
+            :search="search"
+            :total="total"
+            @deleteRow="deleteRow"
+            @clickRest="clickRest"
+          ></otheruserList>
         </el-col>
       </el-col>
     </el-row>
@@ -36,6 +43,10 @@ export default {
     display: 'ck',
     debtTable: [],
     total: 0,
+    info: [],
+    search: {},
+    limit: '',
+    skip: '',
   }),
   created() {
     this.searchInfo();
@@ -46,8 +57,10 @@ export default {
     ...character({ userquery: 'query' }),
 
     ...otheruser(['query', 'delete', 'update']),
-    async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info });
+    async searchInfo({ skip, limit = 10, ...info } = {}) {
+      skip = this.skip;
+
+      const res = await this.query({ skip, limit, ...(info = this.info) });
       this.$set(this, `debtTable`, res.data);
       this.$set(this, `total`, res.total);
     },
@@ -73,6 +86,19 @@ export default {
         });
       }
     },
+    //搜索
+    async sousuo(search) {
+      console.log(search);
+      this.$set(this, `info`, search);
+      this.searchInfo();
+    },
+    //分页
+
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      this.$set(this, `skip`, skip);
+      this.$set(this, `limit`, limit);
+      this.searchInfo();
+    },
   },
 };
 </script>

+ 17 - 2
src/views/region/index.vue

@@ -6,11 +6,11 @@
       </el-col>
       <el-col :span="24" class="main">
         <el-col :span="24" class="search">
-          <searchInfo></searchInfo>
+          <searchInfo @sousuo="sousuo"></searchInfo>
         </el-col>
 
         <el-col :span="24" class="list">
-          <regionList :debtTable="debtTable" :total="total" @deleteRow="deleteRow"></regionList>
+          <regionList :debtTable="debtTable" @handleCurrentChange="handleCurrentChange" :total="total" @deleteRow="deleteRow"></regionList>
         </el-col>
       </el-col>
     </el-col>
@@ -36,6 +36,7 @@ export default {
     display: 'bck',
     total: 0,
     debtTable: [],
+    info: [],
   }),
   created() {
     this.searchInfo();
@@ -45,7 +46,10 @@ export default {
     ...region(['query', 'delete']),
 
     async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
+      info = this.info;
       const res = await this.query({ skip, limit, ...info });
+      console.log(res.data);
+
       this.$set(this, `debtTable`, res.data);
       this.$set(this, `total`, res.total);
     },
@@ -59,6 +63,17 @@ export default {
       this.$checkRes(res, '删除成功', '删除失败');
       this.searchInfo();
     },
+    //分页
+    async handleCurrentChange({ skip, limit, currentPage }) {
+      const res = await this.query({ skip, limit });
+      this.$set(this, `debtTable`, res.data);
+    },
+    //搜索
+    async sousuo(search) {
+      console.log(search);
+      this.$set(this, `info`, search);
+      this.searchInfo();
+    },
   },
 };
 </script>

+ 76 - 86
src/views/specialist/detail.vue

@@ -1,17 +1,12 @@
 <template>
   <div id="detail">
     <el-row>
-      <el-col :span="24" class="debt">
+      <el-col :span="24">
         <el-col :span="24" class="top">
-          <topInfo :topTitle="topTitle" :display="display"></topInfo>
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
         </el-col>
         <el-col :span="24" class="main">
-          <el-col :span="24" class="back">
-            <detailTop @goBack="goBack"></detailTop>
-          </el-col>
-          <el-col :span="24" class="info">
-            <zhuanjiaForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm"></zhuanjiaForm>
-          </el-col>
+          <zhuanjiaForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" ></zhuanjiaForm>
         </el-col>
       </el-col>
     </el-row>
@@ -19,90 +14,85 @@
 </template>
 
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
-import detailTop from '@/layout/common/detailTop.vue';
-import zhuanjiaForm from '@/layout/specialist/zhuanjiaForm.vue';
-import { createNamespacedHelpers, mapGetters } from 'vuex';
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import zhuanjiaForm from '@/layout/specialist/zhuanjiaForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tFinancingExpert } = createNamespacedHelpers('tFinancingExpert');
 
-export default {
-  name: 'detail',
-  props: {},
-  components: {
-    topInfo, //头部导航
-    detailTop, //头部返回
-    zhuanjiaForm, //添加其他用户
-  },
-  data: () => ({
-    display: 'none',
-    topTitle: '新闻中心内容管理',
-    ruleForm: {},
-  }),
-  created() {
-    this.searchInfo();
-  },
-  computed: {
-    id() {
-      return this.$route.query.id;
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      zhuanjiaForm,
     },
-  },
-  methods: {
-    // ...otheruser(['query', 'fetch', 'update', 'create']),
-    // ...character({ charquery: 'query', charFetch: 'fetch' }),
-    async searchInfo() {
-      // if (this.id) {
-      //   const res = await this.fetch(this.id);
-      //   this.$set(this, `ruleForm`, res.data);
-      // }
+    data: () => ({
+      display: 'block',
+      topTitle: '融资专家管理',
+      ruleForm: {},
+    }),
+    created() {
+      this.select();
     },
-
-    // 提交
-    async submitForm({ data }) {
-      // let res;
-      // if (this.id) {
-      //   res = await this.update(data);
-      //   if (res.errcode === 0) {
-      //     this.$message({
-      //       message: '信息修改成功',
-      //       type: 'success',
-      //     });
-      //   }
-      // } else {
-      //   res = await this.create(data);
-      //   if (res.errcode === 0) {
-      //     this.$message({
-      //       message: '信息创建成功',
-      //       type: 'success',
-      //     });
-      //   }
-      // }
-      // if (this.$checkRes(res)) this.resetForm();
-      // console.log(res.data);
-    },
-    // 取消
-    resetForm() {
-      this.$router.push({ path: '/news/index' });
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
     },
-    // 返回
-    goBack() {
-      this.$router.go(-1);
+    methods: {
+      ...tFinancingExpert(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+      },
+      // 提交
+      async submitForm({ data }) {
+        if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/specialist/index' });
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.debt {
-  padding: 20px;
-}
-.top {
-  border-bottom: 1px solid #ccc;
-}
-.main {
-  border-radius: 10px;
-  margin: 20px 0 0 0;
-  box-shadow: 0 0 3px #666;
-}
-.main .back {
-  padding: 10px 0 10px 15px;
-}
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
 </style>

+ 65 - 62
src/views/specialist/index.vue

@@ -1,78 +1,81 @@
 <template>
   <div id="index">
-    <el-col :span="24" class="debt">
+    <el-row>
       <el-col :span="24" class="top">
-        <topInfo :topTitle="topTitle" :display="display" @clickBtn="clickBtn"></topInfo>
-      </el-col>
-      <el-col :span="24" class="search">
-        <searchInfo></searchInfo>
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
       </el-col>
       <el-col :span="24" class="main">
-        <zhuanjiaList :debtTable="debtTable" :total="total" @deleteRow="deleteRow" @clickRest="clickRest"></zhuanjiaList>
+        <el-col :span="24" class="list">
+          <zhuanjiaList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" ></zhuanjiaList>
+        </el-col>
       </el-col>
-    </el-col>
+    </el-row>
   </div>
 </template>
-
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
-import searchInfo from '@/layout/common/searchInfo.vue';
-import zhuanjiaList from '@/layout/specialist/zhuanjiaList.vue';
-// import { createNamespacedHelpers, mapGetters } from 'vuex';
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import zhuanjiaList from '@/layout/specialist/zhuanjiaList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tFinancingExpert } = createNamespacedHelpers('tFinancingExpert');
 
-export default {
-  name: 'index',
-  props: {},
-  components: {
-    topInfo, //头部导航
-    searchInfo, //搜素
-    zhuanjiaList, //其他用户列表
-  },
-  data: () => ({
-    topTitle: '新闻中心内容管理',
-    display: 'block',
-    debtTable: [
-      {
-        image: require('@/assets/logo.png'),
-        name: '专家1',
-        gender: '男',
-        company: 'sd',
-        job: '职务1',
-        field: 'it',
-      },
-    ],
-    total: 1,
-  }),
-  created() {
-    // this.searchInfo();
-  },
-  computed: {},
-  methods: {
-    // ...otheruser(['query', 'delete', 'update']),
-    // async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
-    //   const res = await this.query({ skip, limit, ...info });
-    //   this.$set(this, `debtTable`, res.data);
-    //   this.$set(this, `total`, res.total);
-    // },
-    // 添加
-    clickBtn() {
-      this.$router.push({ path: '/zhidao/detail' });
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      zhuanjiaList, //列表
+    },
+    data: () => ({
+      topTitle: '融资专家管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+    }),
+    created() {
+      this.select();
     },
-    async clickRest() {},
-    async deleteRow(id) {
-      // const res = await this.delete(id);
-      // this.$checkRes(res, '删除成功', '删除失败');
-      // this.searchInfo();
+    computed: {},
+    methods: {
+      ...tFinancingExpert(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/specialist/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
     },
-  },
-};
+  };
 </script>
 
 <style lang="less" scoped>
-.debt {
-  padding: 20px;
-}
-.top {
-  border-bottom: 1px solid #ccc;
-}
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
 </style>

+ 117 - 0
src/views/tInformationDelivery/detail.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <tInformationDeliveryForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading" :subject_classification_list="subject_classification_list" :subject_headings_list="subject_headings_list"></tInformationDeliveryForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import tInformationDeliveryForm from '@/layout/tInformationDelivery/tInformationDeliveryForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tInformationDelivery } = createNamespacedHelpers('tInformationDelivery');
+  const { mapActions: dictionary } = createNamespacedHelpers('dictionary');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      tInformationDeliveryForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '政策发布管理',
+      ruleForm: {},
+      loading: true,
+      subject_classification_list: [],
+      subject_headings_list: [],
+    }),
+    created() {
+      this.select();
+      this.selectDict(['subject_classification','subject_headings']);
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tInformationDelivery(['create', 'delete', 'update', 'fetch', 'query']),
+      ...dictionary({dictQuery:'query'}),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      filterDict(dict){
+        return dict.filter((val) => {
+          return val.name !== '不限';
+        });
+      },
+      async selectDict(arr) {
+        for (let value of arr) {
+          let res = await this.dictQuery({skip:0,limit:100,type:value});
+          this.$set(this, `${value}_list`, this.filterDict(res.data));
+        }
+      },
+      // 提交
+      async submitForm({ data }) {
+        /*if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }*/
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/tInformationDelivery/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 83 - 0
src/views/tInformationDelivery/index.vue

@@ -0,0 +1,83 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <tInformationDeliveryList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" @publish="publish"></tInformationDeliveryList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import tInformationDeliveryList from '@/layout/tInformationDelivery/tInformationDeliveryList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tInformationDelivery } = createNamespacedHelpers('tInformationDelivery');
+  const { mapActions: dictionary } = createNamespacedHelpers('dictionary');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      tInformationDeliveryList, //列表
+    },
+    data: () => ({
+      topTitle: '政策发布管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+    }),
+    created() {
+      this.select();
+    },
+    computed: {},
+    methods: {
+      ...tInformationDelivery(['create', 'delete', 'update', 'fetch', 'query']),
+      ...dictionary({dictQuery:'query'}),
+      async select({ skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/tInformationDelivery/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 117 - 0
src/views/tPolicyInterpretation/detail.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <tPolicyInterpretationForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading" :subject_classification_list="subject_classification_list" :subject_headings_list="subject_headings_list"></tPolicyInterpretationForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import tPolicyInterpretationForm from '@/layout/tPolicyInterpretation/tPolicyInterpretationForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tPolicyInterpretation } = createNamespacedHelpers('tPolicyInterpretation');
+  const { mapActions: dictionary } = createNamespacedHelpers('dictionary');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      tPolicyInterpretationForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '政策解读管理',
+      ruleForm: {},
+      loading: true,
+      subject_classification_list: [],
+      subject_headings_list: [],
+    }),
+    created() {
+      this.select();
+      this.selectDict(['subject_classification','subject_headings']);
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tPolicyInterpretation(['create', 'delete', 'update', 'fetch', 'query']),
+      ...dictionary({dictQuery:'query'}),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      filterDict(dict){
+        return dict.filter((val) => {
+          return val.name !== '不限';
+        });
+      },
+      async selectDict(arr) {
+        for (let value of arr) {
+          let res = await this.dictQuery({skip:0,limit:100,type:value});
+          this.$set(this, `${value}_list`, this.filterDict(res.data));
+        }
+      },
+      // 提交
+      async submitForm({ data }) {
+        /*if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }*/
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/tPolicyInterpretation/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 83 - 0
src/views/tPolicyInterpretation/index.vue

@@ -0,0 +1,83 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <tPolicyInterpretationList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" @publish="publish"></tPolicyInterpretationList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import tPolicyInterpretationList from '@/layout/tPolicyInterpretation/tPolicyInterpretationList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tPolicyInterpretation } = createNamespacedHelpers('tPolicyInterpretation');
+  const { mapActions: dictionary } = createNamespacedHelpers('dictionary');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      tPolicyInterpretationList, //列表
+    },
+    data: () => ({
+      topTitle: '政策解读管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+    }),
+    created() {
+      this.select();
+    },
+    computed: {},
+    methods: {
+      ...tPolicyInterpretation(['create', 'delete', 'update', 'fetch', 'query']),
+      ...dictionary({dictQuery:'query'}),
+      async select({ skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/tPolicyInterpretation/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 102 - 0
src/views/technicalService/detail.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
+        </el-col>
+        <el-col :span="24" class="main">
+          <technicalServiceForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm" :loading="loading"></technicalServiceForm>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
+  import technicalServiceForm from '@/layout/technicalService/technicalServiceForm.vue';
+  import { createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'detail',
+    props: {},
+    components: {
+      detailTopInfo, //头部导航
+      technicalServiceForm,
+    },
+    data: () => ({
+      display: 'block',
+      topTitle: '技术服务管理',
+      ruleForm: {},
+      loading: true,
+      type:'3',
+    }),
+    created() {
+      this.select();
+    },
+    computed: {
+      id() {
+        return this.$route.query.id;
+      },
+    },
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      // 返回
+      goBack() {
+        this.$router.go(-1);
+      },
+      async select() {
+        this.$set(this, `loading`, false);
+        if (this.id) {
+          const res = await this.fetch(this.id);
+          this.$set(this, `ruleForm`, res.data);
+        }
+        this.$set(this, `loading`, true);
+      },
+      // 提交
+      async submitForm({ data }) {
+        if(!data.image){
+          this.$message.error('请上传图片');
+          return ;
+        }
+        let res;
+        if (this.id) {
+          res = await this.update(data);
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息修改成功',
+              type: 'success',
+            });
+          }
+        } else {
+          res = await this.create({type:this.type,...data});
+          if (res.errcode === 0) {
+            this.$message({
+              message: '信息创建成功',
+              type: 'success',
+            });
+          }
+        }
+        if (this.$checkRes(res)) this.resetForm();
+      },
+      // 取消
+      resetForm() {
+        this.$router.push({ path: '/technicalService/index' });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+    padding: 20px;
+  }
+</style>

+ 82 - 0
src/views/technicalService/index.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="list">
+          <technicalServiceList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select" :type="type"></technicalServiceList>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import topInfo from '@/layout/custom/topInfo.vue';
+  import technicalServiceList from '@/layout/technicalService/technicalServiceList.vue';
+  import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+  const { mapActions: tDigitalService } = createNamespacedHelpers('tDigitalService');
+
+  export default {
+    name: 'index',
+    props: {},
+    components: {
+      topInfo, //头部导航
+      technicalServiceList, //列表
+    },
+    data: () => ({
+      topTitle: '技术服务管理',
+      display: 'block',
+      tableData: [],
+      total: 0,
+      type:'3',
+    }),
+    created() {
+      this.select({type:this.type});
+    },
+    computed: {},
+    methods: {
+      ...tDigitalService(['create', 'delete', 'update', 'fetch', 'query']),
+      async select({ skip = 0, limit = 10,  ...info } = {}) {
+        const res = await this.query({ skip, limit, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `tableData`, res.data);
+          this.$set(this, `total`, res.total);
+        }
+      },
+      add() {
+        this.$router.push({ path: '/technicalService/detail' });
+      },
+      async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+        const res = await this.delete(id);
+        this.$checkRes(res, '删除成功', '删除失败');
+        this.select({ skip, limit, ...info });
+      },
+      async publish({ row ,skip = 0, limit = 10, ...info } = {}){
+        let res = await this.update({id:row.id,publish_state:1,publish_state_description:'已发布',publish_time:new Date().getTime()});
+        this.$checkRes(res, '发布成功', '发布失败');
+        this.select({ skip, limit, ...info });
+      },
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .top {
+    height: 50px;
+    margin: 0 0 10px 0;
+  }
+  .main {
+    min-height: 765px;
+    background: #ffffff;
+  }
+  .search {
+    width: 97%;
+    height: 35px;
+    margin: 20px;
+  }
+  .list {
+    padding: 0 20px;
+  }
+</style>

+ 49 - 59
src/views/zhidao/detail.vue

@@ -1,17 +1,12 @@
 <template>
   <div id="detail">
     <el-row>
-      <el-col :span="24" class="debt">
+      <el-col :span="24">
         <el-col :span="24" class="top">
-          <topInfo :topTitle="topTitle" :display="display"></topInfo>
+          <detailTopInfo :topTitle="topTitle" :display="display" @goBack="goBack"></detailTopInfo>
         </el-col>
         <el-col :span="24" class="main">
-          <el-col :span="24" class="back">
-            <detailTop @goBack="goBack"></detailTop>
-          </el-col>
-          <el-col :span="24" class="info">
-            <zhidaoForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm"></zhidaoForm>
-          </el-col>
+          <zhidaoForm :ruleForm="ruleForm" @submitForm="submitForm" @resetForm="resetForm"></zhidaoForm>
         </el-col>
       </el-col>
     </el-row>
@@ -19,26 +14,25 @@
 </template>
 
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
-import detailTop from '@/layout/common/detailTop.vue';
+import detailTopInfo from '@/layout/custom/detailTopInfo.vue';
 import zhidaoForm from '@/layout/zhidao/zhidaoForm.vue';
 import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: tGuidanceUnit } = createNamespacedHelpers('tGuidanceUnit');
 
 export default {
   name: 'detail',
   props: {},
   components: {
-    topInfo, //头部导航
-    detailTop, //头部返回
-    zhidaoForm, //添加其他用户
+    detailTopInfo, //头部导航
+    zhidaoForm,
   },
   data: () => ({
-    display: 'none',
-    topTitle: '新闻中心内容管理',
+    display: 'block',
+    topTitle: '指导单位管理',
     ruleForm: {},
   }),
   created() {
-    this.searchInfo();
+    this.select();
   },
   computed: {
     id() {
@@ -46,63 +40,59 @@ export default {
     },
   },
   methods: {
-    // ...otheruser(['query', 'fetch', 'update', 'create']),
-    // ...character({ charquery: 'query', charFetch: 'fetch' }),
-    async searchInfo() {
-      // if (this.id) {
-      //   const res = await this.fetch(this.id);
-      //   this.$set(this, `ruleForm`, res.data);
-      // }
+    ...tGuidanceUnit(['create', 'delete', 'update', 'fetch', 'query']),
+    // 返回
+    goBack() {
+      this.$router.go(-1);
+    },
+    async select() {
+      if (this.id) {
+        const res = await this.fetch(this.id);
+        this.$set(this, `ruleForm`, res.data);
+      }
     },
-
     // 提交
     async submitForm({ data }) {
-      // let res;
-      // if (this.id) {
-      //   res = await this.update(data);
-      //   if (res.errcode === 0) {
-      //     this.$message({
-      //       message: '信息修改成功',
-      //       type: 'success',
-      //     });
-      //   }
-      // } else {
-      //   res = await this.create(data);
-      //   if (res.errcode === 0) {
-      //     this.$message({
-      //       message: '信息创建成功',
-      //       type: 'success',
-      //     });
-      //   }
-      // }
-      // if (this.$checkRes(res)) this.resetForm();
-      // console.log(res.data);
+      if(!data.image){
+        this.$message.error('请上传图片');
+        return ;
+      }
+      let res;
+      if (this.id) {
+        res = await this.update(data);
+        if (res.errcode === 0) {
+          this.$message({
+            message: '信息修改成功',
+            type: 'success',
+          });
+        }
+      } else {
+        res = await this.create(data);
+        if (res.errcode === 0) {
+          this.$message({
+            message: '信息创建成功',
+            type: 'success',
+          });
+        }
+      }
+      if (this.$checkRes(res)) this.resetForm();
     },
     // 取消
     resetForm() {
-      this.$router.push({ path: '/news/index' });
-    },
-    // 返回
-    goBack() {
-      this.$router.go(-1);
+      this.$router.push({ path: '/zhidao/index' });
     },
   },
 };
 </script>
 
 <style lang="less" scoped>
-.debt {
-  padding: 20px;
-}
 .top {
-  border-bottom: 1px solid #ccc;
+  height: 50px;
+  margin: 0 0 10px 0;
 }
 .main {
-  border-radius: 10px;
-  margin: 20px 0 0 0;
-  box-shadow: 0 0 3px #666;
-}
-.main .back {
-  padding: 10px 0 10px 15px;
+  min-height: 765px;
+  background: #ffffff;
+  padding: 20px;
 }
 </style>

+ 41 - 40
src/views/zhidao/index.vue

@@ -1,75 +1,76 @@
 <template>
   <div id="index">
-    <el-col :span="24" class="debt">
+    <el-row>
       <el-col :span="24" class="top">
-        <topInfo :topTitle="topTitle" :display="display" @clickBtn="clickBtn"></topInfo>
-      </el-col>
-      <el-col :span="24" class="search">
-        <searchInfo></searchInfo>
+        <topInfo :topTitle="topTitle" :display="display" @add="add"></topInfo>
       </el-col>
       <el-col :span="24" class="main">
-        <zhidaoList :debtTable="debtTable" :total="total" @deleteRow="deleteRow" @clickRest="clickRest"></zhidaoList>
+        <el-col :span="24" class="list">
+          <zhidaoList :tableData="tableData" :total="total" @deleteRow="deleteRow" @select="select"></zhidaoList>
+        </el-col>
       </el-col>
-    </el-col>
+    </el-row>
   </div>
 </template>
-
 <script>
-import topInfo from '@/layout/common/topInfo.vue';
-import searchInfo from '@/layout/common/searchInfo.vue';
+import topInfo from '@/layout/custom/topInfo.vue';
 import zhidaoList from '@/layout/zhidao/zhidaoList.vue';
-// import { createNamespacedHelpers, mapGetters } from 'vuex';
+import { mapState, createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: tGuidanceUnit } = createNamespacedHelpers('tGuidanceUnit');
 
 export default {
   name: 'index',
   props: {},
   components: {
     topInfo, //头部导航
-    searchInfo, //搜素
-    zhidaoList, //其他用户列表
+    zhidaoList, //列表
   },
   data: () => ({
-    topTitle: '新闻中心内容管理',
+    topTitle: '指导单位管理',
     display: 'block',
-    debtTable: [
-      {
-        image: require('@/assets/logo.png'),
-        name: '指导单位1',
-        link: 'www.basidaudd.com',
-      },
-    ],
-    total: 1,
+    tableData: [],
+    total: 0,
   }),
   created() {
-    // this.searchInfo();
+    this.select();
   },
   computed: {},
   methods: {
-    // ...otheruser(['query', 'delete', 'update']),
-    // async searchInfo({ skip = 0, limit = 10, ...info } = {}) {
-    //   const res = await this.query({ skip, limit, ...info });
-    //   this.$set(this, `debtTable`, res.data);
-    //   this.$set(this, `total`, res.total);
-    // },
-    // 添加
-    clickBtn() {
+    ...tGuidanceUnit(['create', 'delete', 'update', 'fetch', 'query']),
+    async select({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `tableData`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    add() {
       this.$router.push({ path: '/zhidao/detail' });
     },
-    async clickRest() {},
-    async deleteRow(id) {
-      // const res = await this.delete(id);
-      // this.$checkRes(res, '删除成功', '删除失败');
-      // this.searchInfo();
+    async deleteRow({ id, skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.delete(id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.select({ skip, limit, ...info });
     },
   },
 };
 </script>
 
 <style lang="less" scoped>
-.debt {
-  padding: 20px;
-}
 .top {
-  border-bottom: 1px solid #ccc;
+  height: 50px;
+  margin: 0 0 10px 0;
+}
+.main {
+  min-height: 765px;
+  background: #ffffff;
+}
+.search {
+  width: 97%;
+  height: 35px;
+  margin: 20px;
+}
+.list {
+  padding: 0 20px;
 }
 </style>