liming 5 years ago
parent
commit
5e0d9aa140
53 changed files with 6676 additions and 787 deletions
  1. 54 0
      src/layout/custom/detailTopInfo.vue
  2. 55 0
      src/layout/custom/topInfo.vue
  3. 112 0
      src/layout/custom/uploadImage.vue
  4. 210 0
      src/layout/digitalService/digitalServiceForm.vue
  5. 241 0
      src/layout/digitalService/digitalServiceList.vue
  6. 210 0
      src/layout/financialService/financialServiceForm.vue
  7. 241 0
      src/layout/financialService/financialServiceList.vue
  8. 20 6
      src/layout/layout-part/menus.vue
  9. 210 0
      src/layout/legalService/legalServiceForm.vue
  10. 241 0
      src/layout/legalService/legalServiceList.vue
  11. 210 0
      src/layout/marketService/marketServiceForm.vue
  12. 241 0
      src/layout/marketService/marketServiceList.vue
  13. 206 78
      src/layout/news/newsForm.vue
  14. 241 64
      src/layout/news/newsList.vue
  15. 198 85
      src/layout/specialist/zhuanjiaForm.vue
  16. 222 59
      src/layout/specialist/zhuanjiaList.vue
  17. 213 0
      src/layout/tInformationDelivery/tInformationDeliveryForm.vue
  18. 247 0
      src/layout/tInformationDelivery/tInformationDeliveryList.vue
  19. 210 0
      src/layout/tPolicyInterpretation/tPolicyInterpretationForm.vue
  20. 246 0
      src/layout/tPolicyInterpretation/tPolicyInterpretationList.vue
  21. 210 0
      src/layout/technicalService/technicalServiceForm.vue
  22. 241 0
      src/layout/technicalService/technicalServiceList.vue
  23. 151 34
      src/layout/zhidao/zhidaoForm.vue
  24. 208 63
      src/layout/zhidao/zhidaoList.vue
  25. 63 1
      src/router/index.js
  26. 14 0
      src/store/index.js
  27. 38 0
      src/store/tDeclarationApproval.js
  28. 38 0
      src/store/tDigitalService.js
  29. 38 0
      src/store/tFinancingExpert.js
  30. 38 0
      src/store/tGuidanceUnit.js
  31. 38 0
      src/store/tInformationDelivery.js
  32. 38 0
      src/store/tNewsCenter.js
  33. 38 0
      src/store/tPolicyInterpretation.js
  34. 102 0
      src/views/digitalService/detail.vue
  35. 82 0
      src/views/digitalService/index.vue
  36. 102 0
      src/views/financialService/detail.vue
  37. 82 0
      src/views/financialService/index.vue
  38. 102 0
      src/views/legalService/detail.vue
  39. 82 0
      src/views/legalService/index.vue
  40. 102 0
      src/views/marketService/detail.vue
  41. 82 0
      src/views/marketService/index.vue
  42. 79 86
      src/views/news/detail.vue
  43. 65 64
      src/views/news/index.vue
  44. 76 86
      src/views/specialist/detail.vue
  45. 65 62
      src/views/specialist/index.vue
  46. 117 0
      src/views/tInformationDelivery/detail.vue
  47. 83 0
      src/views/tInformationDelivery/index.vue
  48. 117 0
      src/views/tPolicyInterpretation/detail.vue
  49. 83 0
      src/views/tPolicyInterpretation/index.vue
  50. 102 0
      src/views/technicalService/detail.vue
  51. 82 0
      src/views/technicalService/index.vue
  52. 49 59
      src/views/zhidao/detail.vue
  53. 41 40
      src/views/zhidao/index.vue

+ 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>

+ 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>

+ 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>

+ 63 - 1
src/router/index.js

@@ -122,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'),
@@ -131,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',

+ 14 - 0
src/store/index.js

@@ -9,6 +9,13 @@ 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';
@@ -27,6 +34,13 @@ export default new Vuex.Store({
     menurole,
     region,
     profession,
+    tDeclarationApproval,
+    tDigitalService,
+    tFinancingExpert,
+    tGuidanceUnit,
+    tInformationDelivery,
+    tNewsCenter,
+    tPolicyInterpretation,
     login,
     dictionary,
   },

+ 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,
+};

+ 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>

+ 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>

+ 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>