caichengyu 9 tháng trước cách đây
mục cha
commit
c12231c24b
39 tập tin đã thay đổi với 2721 bổ sung270 xóa
  1. 2 2
      .env.development
  2. 0 0
      dist_backup/css/chunk-elementUI~59f3426a.3c76807c.css
  3. 1 1
      public/robots.txt
  4. 44 0
      src/api/XfSysBussiness.js
  5. 21 3
      src/api/XfWebApi.js
  6. 1 1
      src/assets/css/index.scss
  7. BIN
      src/assets/images/Close@2x.png
  8. BIN
      src/assets/images/dds.png
  9. BIN
      src/assets/images/idcardF.png
  10. BIN
      src/assets/images/ksrl.png
  11. BIN
      src/assets/images/person.png
  12. BIN
      src/assets/images/tkbank.png
  13. BIN
      src/assets/images/zlps.png
  14. 156 0
      src/components/BaseDialog.vue
  15. 95 90
      src/components/membership/index.vue
  16. 408 0
      src/components/membership/indexold.vue
  17. 104 2
      src/components/nav-tab/index.vue
  18. 65 1
      src/components/search/index.vue
  19. 51 3
      src/components/tinymce/index.vue
  20. 21 1
      src/components/top-header/index.vue
  21. 22 20
      src/components/userInfo/index.vue
  22. 5 0
      src/router/index.js
  23. 25 5
      src/store/index.js
  24. 90 0
      src/utils/methods.js
  25. 1 1
      src/utils/request.js
  26. 510 0
      src/views/System/certSet/list/index.vue
  27. 272 0
      src/views/System/certSet/list/operation.vue
  28. 18 18
      src/views/System/contentSet/article/index.vue
  29. 18 1
      src/views/System/contentSet/article/operation.vue
  30. 15 1
      src/views/System/contentSet/homeSet/index.vue
  31. 18 4
      src/views/System/contentSet/homeSet/operation.vue
  32. 27 3
      src/views/System/contentSet/websiteMenu/index.vue
  33. 10 2
      src/views/System/contentSet/websiteMenu/operation.vue
  34. 214 102
      src/views/System/vip/list/index.vue
  35. 478 0
      src/views/certsearch/index.vue
  36. 7 7
      src/views/home/index.vue
  37. 21 1
      src/views/info/index.vue
  38. 1 1
      src/views/searchKey/index.vue
  39. BIN
      学员信息.xlsx

+ 2 - 2
.env.development

@@ -5,8 +5,8 @@ VUE_APP_TITLE =广州市建设工程保险风险管理协会
 ENV = 'development'
 
 # 开发环境
-VUE_APP_BASE_API = 'http://192.168.1.121:8032/'
-VUE_APP_IMG_API = 'http://192.168.1.121:8032'
+VUE_APP_BASE_API = 'http://192.168.1.121:8033/'
+VUE_APP_IMG_API = 'http://192.168.1.121:8033'
 # 开发环境-h5端地址
 VUE_APP_JUMP = 'http://192.168.1.20:8082'
 

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist_backup/css/chunk-elementUI~59f3426a.3c76807c.css


+ 1 - 1
public/robots.txt

@@ -1,2 +1,2 @@
 User-agent: *
-Disallow: /
+Allow: /

+ 44 - 0
src/api/XfSysBussiness.js

@@ -320,4 +320,48 @@ export default {
             tokenName
         })
     },
+    //证书列表
+    XfSysBussinessGetCertList(data) {
+        return request({
+            url: '/api/XfSysBussiness/GetCertList',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+     //删除证书
+     XfSysBussinessDelCerts(data) {
+        return request({
+            url: '/api/XfSysBussiness/DelCerts',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+    //证书详细
+    XfSysBussinessGetCertModel(data) {
+        return request({
+            url: '/api/XfSysBussiness/GetCertModel',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+    //删除证书
+    XfSysBussinessEditCertInfo(data) {
+       return request({
+           url: '/api/XfSysBussiness/EditCertInfo',
+           method: 'post',
+           data: data,
+           tokenName
+       })
+   },
+   XfSysBussinessDownCerts(data) {
+    return request({
+        url: '/api/XfSysBussiness/DownCerts',
+        method: 'get',
+        params: data,
+        tokenName
+    })
+},
 }

+ 21 - 3
src/api/XfWebApi.js

@@ -53,7 +53,7 @@ export default {
             url: '/api/XfWebApi/GetNewsList',
             method: 'get',
             params: data,
-            noToken: true
+            tokenName
         })
     },
     //新闻详情
@@ -71,7 +71,7 @@ export default {
             url: '/api/XfWebApi/GetNewPositionList',
             method: 'get',
             params: data,
-            noToken: true
+            tokenName
         })
     },
     //获取首页广告轮播Banner列表
@@ -152,7 +152,7 @@ export default {
             url: '/api/XfWebApi/GetNewsReList',
             method: 'get',
             params: data,
-            noToken: true
+            tokenName
         })
     },
     //历史访问量
@@ -201,4 +201,22 @@ export default {
             tokenName
         })
     },
+     //证书列表
+     XfWebApiGetCertList(data) {
+        return request({
+            url: '/api/XfWebApi/GetCertList',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+    //下载证书
+    XfWebApiDownCert(data) {
+       return request({
+           url: '/api/XfWebApi/DownCert',
+           method: 'get',
+           params: data,
+           tokenName
+       })
+   },
 }

+ 1 - 1
src/assets/css/index.scss

@@ -118,7 +118,7 @@ b,
 em,
 span,
 small {
-  font-weight: normal;
+  // font-weight: normal;
   font-style: normal;
 }
 

BIN
src/assets/images/Close@2x.png


BIN
src/assets/images/dds.png


BIN
src/assets/images/idcardF.png


BIN
src/assets/images/ksrl.png


BIN
src/assets/images/person.png


BIN
src/assets/images/tkbank.png


BIN
src/assets/images/zlps.png


+ 156 - 0
src/components/BaseDialog.vue

@@ -0,0 +1,156 @@
+<template>
+  <el-dialog
+    :visible.sync="visible"
+    :width="width"
+    :show-close="false"
+    :close-on-click-modal="false"
+    :append-to-body="appendToBody"
+    @closed="close"
+    :fullscreen="fullscreen"
+  >
+    <div slot="title" class="hearders">
+      <div class="leftTitle">{{ title }}</div>
+      <div class="rightBoxs">
+        <i
+          class="el-icon-full-screen full_style"
+          @click="fullscreen = !fullscreen"
+        ></i>
+        <!-- <img
+          src="@/assets/images/Close@2x.png"
+          alt=""
+          @click="visible = false"
+        /> -->
+      </div>
+    </div>
+    <slot></slot>
+    <div slot="footer" class="dialog-footer" v-if="isShowFooter">
+      <el-button :loading="disabledBtn" @click="visible = false">{{
+        cancelName
+      }}</el-button>
+      <el-button :loading="disabledBtn" type="primary" @click="confirmBtn">{{
+        confirmName
+      }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: "BaseDialog",
+  props: {
+    title: {
+      type: String,
+      default: "",
+    },
+    isShow: {
+      type: Boolean,
+      default: false,
+    },
+    width: {
+      type: String,
+      default: "600px",
+    },
+    cancelName: {
+      type: String,
+      default: "取 消",
+    },
+    confirmName: {
+      type: String,
+      default: "确 定",
+    },
+    isShowFooter: {
+      type: Boolean,
+      default: true,
+    },
+    appendToBody: {
+      type: Boolean,
+      default: false,
+    },
+    disabledBtn: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      fullscreen: false,
+    };
+  },
+  methods: {
+    confirmBtn() {
+      this.$emit("submit", "123");
+    },
+    close() {
+      this.$emit("close");
+    },
+  },
+  computed: {
+    visible: {
+      get() {
+        return this.isShow;
+      },
+      set(val) {
+        this.$emit("update:isShow", false);
+      },
+    },
+  },
+
+  watch: {
+    visible(val) {
+      // 在此做显示与隐藏的交互
+      if (val === false) {
+        this.fullscreen = false;
+        // 重置操作
+      } else {
+        // 展示时操作
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+</style>

+ 95 - 90
src/components/membership/index.vue

@@ -2,7 +2,7 @@
   <div id="">
     <el-dialog
       :close-on-click-modal="false"
-      title="入会申请"
+      :title="ruleForm.MemberId>0?'修改会员信息':'添加会员'"
       :append-to-body="true"
       :visible.sync="dialogVisible"
       width="1000px"
@@ -144,107 +144,111 @@ export default {
       loading: false,
       dialogVisible: false,
       ruleList: [
-        {
-          label: "单位归类",
-          prop: "CompanyType",
-          scope: "select1",
-        },
-        {
-          label: "申报职务",
-          prop: "ApplyPost",
-        },
-        {
-          label: "档案编号",
-          prop: "FilesNumber",
-        },
-        {
-          label: "会员级别",
-          prop: "MemberLevel",
-          scope: "select2",
-        },
+        // {
+        //   label: "单位归类",
+        //   prop: "CompanyType",
+        //   scope: "select1",
+        // },
+        // {
+        //   label: "申报职务",
+        //   prop: "ApplyPost",
+        // },
+        // {
+        //   label: "档案编号",
+        //   prop: "FilesNumber",
+        // },
         {
           label: "单位名称",
           prop: "MemberName",
         },
         {
-          label: "社会统一信用代码",
-          prop: "SerialNumber",
+          label: "协会任职",
+          prop: "MemberLevel",
+          scope: "select2",
         },
+        // {
+        //   label: "社会统一信用代码",
+        //   prop: "SerialNumber",
+        // },
         {
           label: "单位性质",
           prop: "CompanyMent",
         },
         {
-          label: "单位地址",
-          prop: "CompanyAddress",
-        },
-        {
-          label: "邮编",
-          prop: "PostCode",
+          label: "主营业务",
+          prop: "Mainbusiness",
         },
+        // {
+        //   label: "单位地址",
+        //   prop: "CompanyAddress",
+        // },
+        // {
+        //   label: "邮编",
+        //   prop: "PostCode",
+        // },
         {
           label: "单位注册地",
           prop: "RegAddress",
         },
+        // {
+        //   label: "企业成立时间",
+        //   prop: "CompSetUpDate",
+        //   scope: "date",
+        // },
+        // {
+        //   label: "单位员工数",
+        //   prop: "CompanyNumber",
+        //   scope: "number",
+        // },
+        // {
+        //   label: "注册资金",
+        //   prop: "RegisteredCapital",
+        // },
+        // {
+        //   label: "年营业额",
+        //   prop: "YearTurnover",
+        // },
+        // {
+        //   label: "法人代表",
+        //   prop: "LegalPerson",
+        // },
+        // {
+        //   label: "入会代表",
+        //   prop: "Operator",
+        // },
+        // {
+        //   label: "入会代表是否法人",
+        //   prop: "OperIsLegal",
+        //   scope: "options",
+        //   options: [
+        //     { label: "是", value: true },
+        //     { label: "否", value: false },
+        //   ],
+        // },
+        // {
+        //   label: "单位职务",
+        //   prop: "CompanyPost",
+        // },
+        // {
+        //   label: "单位总机",
+        //   prop: "Switchboard",
+        // },
         {
-          label: "企业成立时间",
-          prop: "CompSetUpDate",
-          scope: "date",
-        },
-        {
-          label: "单位员工数",
-          prop: "CompanyNumber",
-          scope: "number",
-        },
-        {
-          label: "注册资金",
-          prop: "RegisteredCapital",
-        },
-        {
-          label: "年营业额",
-          prop: "YearTurnover",
-        },
-        {
-          label: "法人代表",
-          prop: "LegalPerson",
-        },
-        {
-          label: "入会代表",
-          prop: "Operator",
-        },
-        {
-          label: "入会代表是否法人",
-          prop: "OperIsLegal",
-          scope: "options",
-          options: [
-            { label: "是", value: true },
-            { label: "否", value: false },
-          ],
-        },
-        {
-          label: "单位职务",
-          prop: "CompanyPost",
-        },
-        {
-          label: "单位总机",
-          prop: "Switchboard",
-        },
-        {
-          label: "联系人电话",
-          prop: "OperatorPhone",
-        },
-        {
-          label: "日常工作联络人",
+          label: "联络人姓名",
           prop: "DailyOperator",
         },
         {
-          label: "电子邮箱",
-          prop: "Email",
-        },
-        {
-          label: "报名表齐全情况",
-          prop: "ApplyAllDes",
+          label: "联系人联系电话",
+          prop: "OperatorPhone",
         },
+        // {
+        //   label: "电子邮箱",
+        //   prop: "Email",
+        // },
+        // {
+        //   label: "报名表齐全情况",
+        //   prop: "ApplyAllDes",
+        // },
         {
           label: "备注",
           prop: "Remarks",
@@ -257,12 +261,12 @@ export default {
           label: "密码",
           prop: "Pwd",
         },
-        {
-          label: "资料上传",
-          prop: "FilePath",
-          scope: "file",
-          span: 24,
-        },
+        // {
+        //   label: "资料上传",
+        //   prop: "FilePath",
+        //   scope: "file",
+        //   span: 24,
+        // },
       ],
       ruleForm: { CompanyTypeName: "", MemberLevel: "" },
       rules: {
@@ -305,8 +309,8 @@ export default {
       if (file === undefined) {
         return;
       }
-      if (file.size > 50 * 1024 * 1024) {
-        self.$message.error("文件不得大于50MB");
+      if (file.size > 10 * 1024 * 1024) {
+        self.$message.error("文件不得大于10MB");
         return;
       }
       // var type = e.target.value.toLowerCase().split(".").splice(-1);
@@ -342,6 +346,7 @@ export default {
           this.ruleForm = e;
         }
       } else {
+        this.backTai = name === "backTai";
         this.ruleForm = { CompanyTypeName: "", MemberLevel: "" };
       }
       this.dialogVisible = true;
@@ -370,7 +375,7 @@ export default {
             this.$api
               .XfWebApiApplyMember(this.ruleForm)
               .then((res) => {
-                this.$message.success("提交申请成功");
+                this.$message.success("提交成功");
                 this.close();
                 if (this.$route.query.Newpwd) {
                   let path = this.$route.path;

+ 408 - 0
src/components/membership/indexold.vue

@@ -0,0 +1,408 @@
+<template>
+    <div id="">
+      <el-dialog
+        :close-on-click-modal="false"
+        title="入会申请"
+        :append-to-body="true"
+        :visible.sync="dialogVisible"
+        width="1000px"
+      >
+        <el-form
+          :model="ruleForm"
+          :rules="rules"
+          ref="ruleForm"
+          label-width="140px"
+          class="demo-ruleForm"
+        >
+          <el-row>
+            <el-col
+              v-for="(item, index) in ruleList"
+              :key="index"
+              :span="item.span ? item.span : 12"
+              ><el-form-item :label="item.label" :prop="item.prop">
+                <el-select
+                  clearable
+                  v-if="item.scope === 'select1'"
+                  v-model="ruleForm[item.prop]"
+                  placeholder="请选择单位归类"
+                >
+                  <el-option
+                    v-for="items in options1"
+                    :key="items.value"
+                    :label="items.text"
+                    :value="items.value"
+                  >
+                  </el-option>
+                </el-select>
+                <el-select
+                  clearable
+                  v-else-if="item.scope === 'select2'"
+                  v-model="ruleForm[item.prop]"
+                  placeholder="请选择会员级别"
+                >
+                  <el-option
+                    v-for="items in options2"
+                    :key="items.value"
+                    :label="items.text"
+                    :value="items.value"
+                  >
+                  </el-option>
+                </el-select>
+                <el-radio-group
+                  v-model="ruleForm[item.prop]"
+                  v-else-if="item.scope === 'options'"
+                >
+                  <el-radio
+                    v-for="(items, indexs) in item.options"
+                    :key="indexs"
+                    :label="items.value"
+                    >{{ items.label }}</el-radio
+                  >
+                </el-radio-group>
+  
+                <el-date-picker
+                  v-else-if="item.scope === 'date'"
+                  v-model="ruleForm[item.prop]"
+                  type="date"
+                  placeholder="选择日期"
+                >
+                </el-date-picker>
+                <el-input-number
+                  :precision="0"
+                  :min="0"
+                  :max="999999"
+                  :controls="false"
+                  v-else-if="item.scope === 'number'"
+                  clearable
+                  v-model.trim="ruleForm[item.prop]"
+                ></el-input-number>
+                <div v-else-if="item.scope === 'file'" style="display: flex">
+                  <a
+                    v-if="ruleForm[item.prop]"
+                    :href="$methods.splitImgHost(ruleForm.FilePath)"
+                    target="_blank"
+                    class="file_style"
+                    >已上传(点击可查看下载)</a
+                  >
+                  <label for="uploads" style="vertical-align: text-bottom"
+                    ><span class="btn">{{
+                      ruleForm[item.prop] ? "更换文件" : "上传文件"
+                    }}</span></label
+                  >
+                  <span style="margin-left: 20px; color: red"
+                    >(支持所有办公文件格式,多个文件请使用压缩包格式上传)</span
+                  >
+                  <input
+                    type="file"
+                    id="uploads"
+                    style="display: none"
+                    @change="uploadImg"
+                  />
+                </div>
+                <el-input
+                  v-else
+                  clearable
+                  v-model.trim="ruleForm[item.prop]"
+                ></el-input> </el-form-item
+            ></el-col>
+          </el-row>
+        </el-form>
+        <p
+          style="text-align: center; color: red"
+          v-if="this.ruleForm.ProcessItemName"
+        >
+          驳回原因:{{ this.ruleForm.ProcessItemName }}
+        </p>
+        <span slot="footer" class="dialog-footer">
+          <el-button size="small" @click="close">取 消</el-button>
+          <el-button
+            size="small"
+            type="primary"
+            @click="submit('ruleForm')"
+            :loading="loading"
+            >确 定</el-button
+          >
+        </span>
+      </el-dialog>
+    </div>
+  </template>
+  
+  <script>
+  export default {
+    data() {
+      var validatorphone = (rule, value, callback) => {
+        var reg = /^1(3|4|5|6|7|8|9)\d{9}$/;
+        if (!value) {
+          return callback(new Error("请输入手机号码"));
+        } else if (!reg.test(value)) {
+          return callback(new Error("请输入正确手机号码"));
+        } else {
+          callback();
+        }
+      };
+      return {
+        loading: false,
+        dialogVisible: false,
+        ruleList: [
+          {
+            label: "单位归类",
+            prop: "CompanyType",
+            scope: "select1",
+          },
+          {
+            label: "申报职务",
+            prop: "ApplyPost",
+          },
+          {
+            label: "档案编号",
+            prop: "FilesNumber",
+          },
+          {
+            label: "会员级别",
+            prop: "MemberLevel",
+            scope: "select2",
+          },
+          {
+            label: "单位名称",
+            prop: "MemberName",
+          },
+          {
+            label: "社会统一信用代码",
+            prop: "SerialNumber",
+          },
+          {
+            label: "单位性质",
+            prop: "CompanyMent",
+          },
+          {
+            label: "单位地址",
+            prop: "CompanyAddress",
+          },
+          {
+            label: "邮编",
+            prop: "PostCode",
+          },
+          {
+            label: "单位注册地",
+            prop: "RegAddress",
+          },
+          {
+            label: "企业成立时间",
+            prop: "CompSetUpDate",
+            scope: "date",
+          },
+          {
+            label: "单位员工数",
+            prop: "CompanyNumber",
+            scope: "number",
+          },
+          {
+            label: "注册资金",
+            prop: "RegisteredCapital",
+          },
+          {
+            label: "年营业额",
+            prop: "YearTurnover",
+          },
+          {
+            label: "法人代表",
+            prop: "LegalPerson",
+          },
+          {
+            label: "入会代表",
+            prop: "Operator",
+          },
+          {
+            label: "入会代表是否法人",
+            prop: "OperIsLegal",
+            scope: "options",
+            options: [
+              { label: "是", value: true },
+              { label: "否", value: false },
+            ],
+          },
+          {
+            label: "单位职务",
+            prop: "CompanyPost",
+          },
+          {
+            label: "单位总机",
+            prop: "Switchboard",
+          },
+          {
+            label: "联系人电话",
+            prop: "OperatorPhone",
+          },
+          {
+            label: "日常工作联络人",
+            prop: "DailyOperator",
+          },
+          {
+            label: "电子邮箱",
+            prop: "Email",
+          },
+          {
+            label: "报名表齐全情况",
+            prop: "ApplyAllDes",
+          },
+          {
+            label: "备注",
+            prop: "Remarks",
+          },
+          {
+            label: "账号",
+            prop: "Account",
+          },
+          {
+            label: "密码",
+            prop: "Pwd",
+          },
+          {
+            label: "资料上传",
+            prop: "FilePath",
+            scope: "file",
+            span: 24,
+          },
+        ],
+        ruleForm: { CompanyTypeName: "", MemberLevel: "" },
+        rules: {
+          CompanyTypeName: [
+            { required: true, message: "请选择单位归类", trigger: "change" },
+          ],
+          MemberLevel: [
+            { required: true, message: "请选择会员等级", trigger: "change" },
+          ],
+          LegalPerson: [
+            { required: true, message: "请输入负责人", trigger: "blur" },
+          ],
+          Account: [{ required: true, message: "请输入账号", trigger: "blur" }],
+          OperatorPhone: [
+            { required: true, validator: validatorphone, trigger: "blur" },
+          ],
+          Pwd: [{ required: true, message: "请输入密码", trigger: "blur" }],
+          MemberName: [
+            { required: true, message: "请输入公司名称", trigger: "blur" },
+          ],
+          Email: [{ required: true, message: "请输入邮箱", trigger: "blur" }],
+        },
+        options1: [], //单位归类
+        options2: [], //会员等级
+        backTai: false, //是否来自后台
+      };
+    },
+    created() {
+      this.$api.XfWebApiGetTypeList({ type: 1 }).then((res) => {
+        this.options1 = res.Data;
+      });
+      this.$api.XfWebApiGetTypeList({ type: 2 }).then((res) => {
+        this.options2 = res.Data;
+      });
+    },
+    methods: {
+      uploadImg(e) {
+        var self = this;
+        var file = e.target.files[0];
+        if (file === undefined) {
+          return;
+        }
+        if (file.size > 50 * 1024 * 1024) {
+          self.$message.error("文件不得大于50MB");
+          return;
+        }
+        // var type = e.target.value.toLowerCase().split(".").splice(-1);
+        // if (
+        //   type[0] != "jpg" &&
+        //   type[0] != "pdf" &&
+        //   type[0] != "png" &&
+        //   type[0] != "jpeg"
+        // ) {
+        //   self.$message.error("上传格式需为:.jpg/.png/.jpeg/.pdf");
+        //   e.target.value = "";
+        //   return;
+        // }
+        let formDatas = new FormData();
+        formDatas.append("file", file);
+        this.$api
+          .XfWebApiUploadFile(formDatas)
+          .then((res) => {
+            this.$set(this.ruleForm, "FilePath", res.Data);
+          })
+          .finally(() => {
+            e.target.value = "";
+          });
+      },
+      showInit(e, name) {
+        if (e) {
+          if (name === "backTai") {
+            this.$api.XfSysBussinessGetMemberModel(e).then((res) => {
+              this.ruleForm = res.Data;
+              this.backTai = true;
+            });
+          } else {
+            this.ruleForm = e;
+          }
+        } else {
+          this.ruleForm = { CompanyTypeName: "", MemberLevel: "" };
+        }
+        this.dialogVisible = true;
+      },
+      close() {
+        this.$refs["ruleForm"].resetFields();
+        this.loading = false;
+        this.dialogVisible = false;
+        this.backTai = false;
+      },
+      submit(formName) {
+        this.$refs[formName].validate(async (valid) => {
+          if (valid) {
+            this.loading = true;
+            if (this.backTai) {
+              this.$api
+                .XfSysBussinessEditMemberInfo(this.ruleForm)
+                .then((res) => {
+                  this.close();
+                  this.$parent.search();
+                })
+                .finally(() => {
+                  this.loading = false;
+                });
+            } else {
+              this.$api
+                .XfWebApiApplyMember(this.ruleForm)
+                .then((res) => {
+                  this.$message.success("提交申请成功");
+                  this.close();
+                  if (this.$route.query.Newpwd) {
+                    let path = this.$route.path;
+                    this.$router.replace(path);
+                  }
+                })
+                .finally(() => {
+                  this.loading = false;
+                });
+            }
+          } else {
+            console.log("error submit!!");
+            return false;
+          }
+        });
+      },
+    },
+  };
+  </script>
+  
+  <style lang="scss" scoped>
+  ::v-deep .el-dialog {
+    margin-top: 3vh !important;
+  }
+  .file_style {
+    margin-right: 14px;
+    color: blue;
+    cursor: pointer;
+  }
+  .btn {
+    cursor: pointer;
+    color: rgb(0, 102, 255);
+  }
+  </style>
+  

+ 104 - 2
src/components/nav-tab/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div id="nav">
-    <ul class="nav_ul">
+    <!-- <ul class="nav_ul">
       <li
         class="nav_li"
         v-for="(item, index) in $store.state.asyncRouter"
@@ -10,7 +10,90 @@
       >
         {{ item.Name }}
       </li>
-    </ul>
+    </ul> -->
+     <!--导航栏-->
+        <el-menu
+          :default-active="activeIndex"
+          class="el-menu-demo nav_ul"
+          mode="horizontal"
+          @select="handleSelect"
+          background-color="#0065c6"
+          text-color="#fff"
+          active-text-color="#fff"
+          router
+        >
+          <template v-for="(item, index) in $store.state.asyncRouter">
+            <el-menu-item class="nav_li"
+              v-if="!item.ChildList || item.ChildList.length <= 0"
+              :index="
+                item.CurValue === 'home'
+                  ? 'home'
+                  : item.WebUrl
+                  ? null
+                  : `menuList?ParentId=${item.ParentId}&MenuId=${item.MenuId}`
+              "
+              ><a
+                v-if="item.WebUrl && item.MenuId !== 1"
+                :href="item.WebUrl"
+                target="_blank"
+                style="color: #fff; display: block"
+                >{{ item.Name }}</a
+              ><span v-else>{{ item.Name }}</span></el-menu-item
+            >
+            <el-submenu  class="nav_li"
+              v-else
+              :index="`menuList?ParentId=${item.ParentId}&MenuId=${item.MenuId}`"
+            >
+              <template slot="title" class="nav_li">{{ item.Name }}</template>
+              <template v-for="(items, indexs) in item.ChildList">
+                <el-menu-item
+                  v-if="items.Type === 2"
+                  :key="indexs"
+                  :index="
+                    items.WebUrl
+                      ? null
+                      : `menuList?ParentId=${items.ParentId}&MenuId=${items.MenuId}`
+                  "
+                  ><a
+                    v-if="items.WebUrl"
+                    :href="items.WebUrl"
+                    target="_blank"
+                    style="color: #fff; display: block"
+                    >{{ items.Name }}</a
+                  ><span v-else>{{ items.Name }}</span></el-menu-item
+                ><el-submenu class="el-submenu__title11"
+                  v-else
+                  :index="`menuList?ParentId=${items.ParentId}&MenuId=${items.MenuId}`"
+                >
+                  <template slot="title">{{ items.Name }}</template>
+                  <template v-for="(itemsxt, indexsxt) in items.ChildList">
+                    <el-menu-item
+                      :index="
+                        itemsxt.WebUrl
+                          ? null
+                          : `menuList?ParentId=${itemsxt.ParentId}&MenuId=${itemsxt.MenuId}`
+                      "
+                      ><a
+                        v-if="itemsxt.WebUrl"
+                        :href="itemsxt.WebUrl"
+                        target="_blank"
+                        style="color: #fff; display: block"
+                        >{{ itemsxt.Name }}</a
+                      ><span v-else>{{ itemsxt.Name }}</span></el-menu-item
+                    >
+                  </template>
+                </el-submenu>
+              </template>
+            </el-submenu>
+          </template>
+        </el-menu>
+        <!-- <div>
+          <el-button size="medium" v-if="$store.state.token" @click="userInfo"
+            >个人中心</el-button
+          >
+          <el-button size="medium"  v-else @click="login">登录</el-button>
+        </div> -->
+      
   </div>
 </template>
 
@@ -66,7 +149,22 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+::v-deep .el-submenu > .el-submenu__title {
+  font-size: 18px;
+  height: 50px !important;
+  line-height: 50px !important;
+}
+.el-menu--horizontal > .el-menu-item {
+  font-size: 18px;
+  height: 50px !important;
+  line-height: 50px !important;
+}
+
 #nav {
+  .el-submenu__title {
+  /* 您想要添加或修改的样式属性 */
+  color: red; /* 示例:更改标题颜色 */
+}
   z-index: 1;
   width: 1200px;
   height: 50px;
@@ -84,6 +182,10 @@ export default {
       &:hover {
         background-color: rgb(38, 134, 227);
       }
+      span{
+        font-size: 18px;
+      font-weight: bold;
+      }
       cursor: pointer;
       user-select: none;
       font-size: 18px;

+ 65 - 1
src/components/search/index.vue

@@ -72,6 +72,21 @@
             :value="items.value"
           ></el-option>
         </el-select>
+        <el-select
+          clearable
+          :size="$store.state.defaultSize"
+          v-else-if="item.scope === 'IsMemberRead'"
+          v-model="formData[item.prop]"
+          :placeholder="item.placeholder"
+          @change="IsMemberReadchange"
+        >
+          <el-option
+            v-for="(items, indexs) in item.options"
+            :key="indexs"
+            :label="items.label"
+            :value="items.value"
+          ></el-option>
+        </el-select>
         <el-cascader
           :size="$store.state.defaultSize"
           v-else-if="item.scope === 'MenuList'"
@@ -101,6 +116,19 @@
           align="right"
         >
         </el-date-picker>
+        <el-date-picker
+          v-else-if="item.scope === 'date'"
+          clearable
+          :size="$store.state.defaultSize"
+          v-model="formData[item.prop]"
+          type="date"
+          :picker-options="pickerOptionsDate"
+          format="yyyy 年 MM 月 dd 日"
+          value-format="yyyy-MM-dd"
+          placeholder="选择日期"
+          align="right"
+        >
+        </el-date-picker>
         <el-input
           clearable
           :size="$store.state.defaultSize"
@@ -119,7 +147,7 @@
         <el-button
           :size="$store.state.defaultSize"
           type="primary"
-          @click="onSubmit('init')"
+          @click="init('init')"
           >重置</el-button
         >
       </el-form-item>
@@ -177,6 +205,31 @@ export default {
           },
         ],
       },
+      pickerOptionsDate: {
+          disabledDate(time) {
+            return time.getTime() > Date.now();
+          },
+          shortcuts: [{
+            text: '今天',
+            onClick(picker) {
+              picker.$emit('pick', new Date());
+            }
+          }, {
+            text: '昨天',
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit('pick', date);
+            }
+          }, {
+            text: '一周前',
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit('pick', date);
+            }
+          }]
+        },
     };
   },
   computed: {
@@ -192,6 +245,17 @@ export default {
     onSubmit(e) {
       this.$emit("onSubmit", e);
     },
+    init(e) {
+      this.$emit("init", e);
+    },
+    IsMemberReadchange(e){
+      if(e){
+        this.$store.commit('Set_isMemberRead2');
+      }
+      else{
+         this.$store.commit('Set_isMemberRead1');
+      }
+    }
   },
 };
 </script>

+ 51 - 3
src/components/tinymce/index.vue

@@ -75,7 +75,8 @@ export default {
         auto_focus: true,
         toolbar_mode: "wrap",
         paste_data_images: true, //图片是否可粘贴
-        file_picker_types: "file",
+        media_live_embeds: true,
+        file_picker_types: "file media",
         file_picker_callback: function (cb, value, meta) {
           // Provide file and text for the link dialog
           if (meta.filetype == "file") {
@@ -105,10 +106,10 @@ export default {
                 type[0] != "pdf" &&
                 type[0] != "rar" &&
                 type[0] != "zip" &&
-                type[0] != "txt"
+                type[0] != "txt" 
               ) {
                 self.$message.error(
-                  "上传格式需为:.docx/.doc/.xlsx/.xls/.pptx/.ppt./pdf./rar./zip./txt"
+                  "上传格式需为:.docx/.doc/.xlsx/.xls/.pptx/.ppt/.pdf/.rar/.zip/.txt"
                 );
                 return;
               }
@@ -131,6 +132,53 @@ export default {
             };
             input.click();
           }
+          else if (meta.filetype == 'media'){
+                    //创建一个隐藏的type=file的文件选择input
+                    let input = document.createElement('input');
+                    input.setAttribute('type', 'file');
+                    input.setAttribute(
+              "accept",
+              "mp3/mp4"
+            );
+            input.onchange = function () {
+              var file = this.files[0];
+              if (file === undefined) {
+                return;
+              }
+              if (file.size > 300 * 1024 * 1024) {
+                self.$message.error("文件不得大于300M");
+                return;
+              }
+              var type = file.name.toLowerCase().split(".").splice(-1);
+              if (
+                type[0] != "mp3" &&
+                type[0] != "mp4"
+              ) {
+                self.$message.error(
+                  "上传格式需为:.mp3/.mp4"
+                );
+                return;
+              }
+              let formDatas = new FormData();
+              formDatas.append("file", file);
+              self.$api[self.imgUrl](formDatas)
+                .then((res) => {
+                  if (res.Code !== 200) {
+                    self.message.error("上传失败");
+                    return;
+                  } else {
+                    cb(BASE_IMG_URL + res.Data, { type: "my file" });
+                    self.message.success("上传成功");
+                  }
+                })
+                .catch((err) => {
+                  self.message.error("上传失败");
+                  return;
+                });
+            };
+                    //触发点击
+                    input.click();
+                  }
         },
         images_upload_handler: function (blobInfo, succFun, failFun) {
           var file = blobInfo.blob();

+ 21 - 1
src/components/top-header/index.vue

@@ -3,6 +3,18 @@
     <div class="top_s">
       <div class="left">{{ time }}</div>
       <div class="right">
+        <!-- <div class="li" @click="certsel">
+          <img src="@/assets/images/zlps.png" alt="" /><span>证书查询</span>
+        </div> -->
+        <!-- <div class="li li_img">
+          <img src="@/assets/images/person.png" alt="" /><span v-if="$store.state.token" class="links"
+            ><span @click="userInfo" title="点击查看基本信息"> {{ $store.state.userInfo.Account
+            }}</span><span style="margin-left: 10px" class="links" @click="outLogin"
+              >退出</span
+            ></span
+          ><span v-else @click="login" class="links">会员入口</span
+          >
+        </div> -->
         <div class="li" @click="suggestion">
           <img src="@/assets/images/info.png" alt="" /><span>建议留言</span>
         </div>
@@ -123,6 +135,15 @@ export default {
     joinVip() {
       this.$refs.membership.showInit();
     },
+    certsel(){
+      this.$router.push({
+        path: "certsearch",
+        query: {
+          
+        },
+      });
+      return;
+    },
     //网站建议
     suggestion() {
       this.$refs.suggestion.showInit();
@@ -305,7 +326,6 @@ export default {
   }
 }
 .links {
-  color: #0f4dc6;
   cursor: pointer;
   user-select: none;
 }

+ 22 - 20
src/components/userInfo/index.vue

@@ -13,7 +13,7 @@
             :model="ruleForm"
             :rules="rules"
             ref="ruleForm"
-            label-width="100px"
+            label-width="130px"
             class="demo-ruleForm"
           >
             <el-form-item label="登录账号" prop="Account">
@@ -26,19 +26,23 @@
                 readonly
                 v-model.trim="ruleForm.MemberName"
               ></el-input> </el-form-item
-            ><el-form-item label="负责人" prop="LegalPerson">
+            ><el-form-item label="单位性质" prop="CompanyMent">
+              <el-input
+                v-model.trim="ruleForm.CompanyMent"
+              ></el-input> </el-form-item
+            ><el-form-item label="主营业务" prop="Mainbusiness">
               <el-input
-                v-model.trim="ruleForm.LegalPerson"
+                v-model.trim="ruleForm.Mainbusiness"
               ></el-input> </el-form-item
-            ><el-form-item label="手机号" prop="Mobile">
+            ><el-form-item label="单位注册地" prop="RegAddress">
               <el-input
-                v-model.trim="ruleForm.Mobile"
+                v-model.trim="ruleForm.RegAddress"
               ></el-input> </el-form-item
-            ><el-form-item label="入会代表" prop="Operator">
+            ><el-form-item label="联络人姓名" prop="DailyOperator">
               <el-input
-                v-model.trim="ruleForm.Operator"
+                v-model.trim="ruleForm.DailyOperator"
               ></el-input> </el-form-item
-            ><el-form-item label="联系电话" prop="OperatorPhone">
+            ><el-form-item label="联系人联系电话" prop="OperatorPhone">
               <el-input
                 v-model.trim="ruleForm.OperatorPhone"
               ></el-input> </el-form-item
@@ -115,9 +119,10 @@ export default {
       ruleForm: {
         Account: "",
         MemberName: "",
-        LegalPerson: "",
-        Mobile: "",
-        Operator: "",
+        CompanyMent: "",
+        Mainbusiness: "",
+        RegAddress: "",
+        DailyOperator: "",
         OperatorPhone: "",
       },
       passForm: {
@@ -126,12 +131,8 @@ export default {
         againNewpwd: "",
       },
       rules: {
-        LegalPerson: [
-          { required: true, message: "请输入负责人", trigger: "blur" },
-        ],
-        Mobile: [{ required: true, message: "请输入手机号", trigger: "blur" }],
-        Operator: [
-          { required: true, message: "请输入入会代表", trigger: "blur" },
+        DailyOperator: [
+          { required: true, message: "请输入联络人", trigger: "blur" },
         ],
         OperatorPhone: [
           { required: true, message: "请输入联系电话", trigger: "blur" },
@@ -154,9 +155,10 @@ export default {
         this.ruleForm = {
           Account: this.$store.state.userInfo.Account,
           MemberName: this.$store.state.userInfo.MemberName,
-          LegalPerson: this.$store.state.userInfo.LegalPerson,
-          Mobile: this.$store.state.userInfo.Mobile,
-          Operator: this.$store.state.userInfo.Operator,
+          CompanyMent: this.$store.state.userInfo.CompanyMent,
+          Mainbusiness: this.$store.state.userInfo.Mainbusiness,
+          RegAddress: this.$store.state.userInfo.RegAddress,
+          DailyOperator: this.$store.state.userInfo.DailyOperator,
           OperatorPhone: this.$store.state.userInfo.OperatorPhone,
         };
         this.passForm = {

+ 5 - 0
src/router/index.js

@@ -47,6 +47,11 @@ const routes = [
         component: () => import('@/views/contribute/index'),
         meta: { title: '投稿中心', icon: '', affix: true }
       },
+      {
+        path: 'certsearch',
+        component: () => import('@/views/certsearch/index'),
+        meta: { title: '证书查询', icon: '', affix: true }
+      },
     ]
   },
   // {

+ 25 - 5
src/store/index.js

@@ -21,7 +21,9 @@ export default new Vuex.Store({
     token: localStorage.getItem('token') || null,
     userInfo: {},
     roleList: null,//角色列表
-    MenuList: null,//栏目列表
+    parentid: -2,//栏目列表 游客
+    MenuList1: null,//栏目列表 游客
+    MenuList2: null,//栏目列表 会员
     TypeList: null,//分类列表
     CompanyType: null,//单位归类
     MemberLevel: null,//会员级别
@@ -75,13 +77,24 @@ export default new Vuex.Store({
       return state.roleList
     },
     MenuList: (state) => {
-      if (!state.MenuList) {
-        api.XfSysBussinessGetMenuList({ pageindex: 1, pagesize: 999 })
+      if(state.parentid==-2){
+        if (!state.MenuList2) {
+          api.XfSysBussinessGetMenuList({ pageindex: 1, pagesize: 999,parentid:state.parentid })
+            .then((res) => {
+              state.MenuList2 = res.Data || [];
+            });
+        }
+        return state.MenuList2
+      }
+      else{
+      if (!state.MenuList1) {
+        api.XfSysBussinessGetMenuList({ pageindex: 1, pagesize: 999,parentid:state.parentid })
           .then((res) => {
-            state.MenuList = res.Data || [];
+            state.MenuList1 = res.Data || [];
           });
       }
-      return state.MenuList
+      return state.MenuList1
+    }
     },
     TypeList: (state) => {
       if (!state.TypeList) {
@@ -116,6 +129,13 @@ export default new Vuex.Store({
       localStorage.removeItem('token')
     },
     // ------------后台----------------
+    Set_isMemberRead2(state) {
+      state.parentid=-2;
+      console.log("parentid",state.parentid)
+    },
+    Set_isMemberRead1(state) {
+      state.parentid=-1;
+    },
     SET_NavStatus: (state) => {
       state.navStatus = !state.navStatus
     },

+ 90 - 0
src/utils/methods.js

@@ -188,4 +188,94 @@ export default {
             (item) => !res.has(item[uniId]) && res.set(item[uniId], 1)
         );
     },
+    exportData(msg, status = true) {
+		if (!msg) {
+			this.$message.warning("导出地址获取错误,请联系开发人员处理")
+			return
+		}
+		
+		var baseUrl =BASE_IMG_URL + '/'
+		
+		let url =
+			baseUrl + msg;
+		let link = document.createElement("a");
+		let fileName = "导入模板" + ".xlsx";
+		document.body.appendChild(link);
+		link.href = url;
+		link.download = fileName;
+		link.click();
+		link.remove();
+	},
+    downloadPicBase (msg) {
+        var baseUrl =BASE_IMG_URL 
+		
+		let imgsrc =
+			baseUrl + msg;
+        var image = new Image()
+            // 解决跨域canvas污染问题
+            image.setAttribute('crossOrigin', 'anonymous')
+            image.onload = function () {
+                let canvas = document.createElement('canvas')
+                canvas.width = image.width
+                canvas.height = image.height
+                let context = canvas.getContext('2d')
+                context.drawImage(image, 0, 0, image.width, image.height)
+                let url = canvas.toDataURL('image/png') // 得到图片的base64编码数据
+                let a = document.createElement('a')
+                a.download = 'download'
+                a.href = url
+                a.click()
+            }
+        image.src = imgsrc
+    },
+   //base64转blob
+   base64ToBlob(code) {
+    const parts = code.split(';base64,');
+    const contentType = parts[0].split(':')[1];
+    const raw = window.atob(parts[1]);
+    const rawLength = raw.length;
+    const uInt8Array = new Uint8Array(rawLength);
+    for (let i = 0; i < rawLength; ++i) {
+      uInt8Array[i] = raw.charCodeAt(i);
+    }
+    return new Blob([uInt8Array], { type: contentType });
+  },
+
+//下载
+downloadbase64(fileName, content) {
+    const blob = this.base64ToBlob(content); // new Blob([content]);
+    if (window.navigator.msSaveOrOpenBlob) {
+      navigator.msSaveBlob(blob, fileName);
+    } else {
+      const link = document.createElement('a');
+      link.href = window.URL.createObjectURL(blob);
+      link.download = fileName;
+
+      //此写法兼容可火狐浏览器
+      document.body.appendChild(link);
+      const evt = document.createEvent("MouseEvents");
+      evt.initEvent("click", false, false);
+      link.dispatchEvent(evt);
+      document.body.removeChild(link);
+    }
+  },
+
+    downloadPic (msg) {
+        var baseUrl =BASE_IMG_URL 
+		
+		let imgsrc =
+			baseUrl + msg;
+        let x = new XMLHttpRequest()
+        x.open('GET', imgsrc, true)
+        x.responseType = 'blob'
+        x.onload = function () {
+            let url = window.URL.createObjectURL(x.response)
+            let a = document.createElement('a')
+            a.href = url
+            a.download = 'download';
+            a.click()
+        }
+        x.send()
+    }
+    
 }

+ 1 - 1
src/utils/request.js

@@ -13,7 +13,7 @@ const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: BASE_URL,
   // 超时
-  timeout: 60000
+  timeout: 1800000
 })
 var Messages = Message
 // request拦截器

+ 510 - 0
src/views/System/certSet/list/index.vue

@@ -0,0 +1,510 @@
+<template>
+  <div id="article" v-loading="loading">
+    <Search
+      ref="search"
+      :formList="formList"
+      :formData="formData"
+      @onSubmit="search"
+    ></Search>
+    <div style="text-align: right; margin-bottom: 10px">
+      <el-button :size="$store.state.defaultSize" @click="downcerts" type="primary"
+        >批量下载证书</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="centerDialogVisible = true" type="primary"
+        >导入证书信息</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="centerDialogVisible2 = true" type="primary"
+        >导入学员照片</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="add" type="primary"
+        >新增</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="delPL" type="primary"
+        >批量删除</el-button
+      >
+    </div>
+    <Table
+      ref="table"
+      :tableData="tableData"
+      :tableList="tableList"
+      :rowKey="'_certId'"
+      :check="true"
+      @selectionChange="selectionChange"
+    >
+    <template slot="_studentImg" slot-scope="props">
+      <el-image
+                v-if="props.scope.row._studentImg"
+                style="width: 70px; height: 100px"
+                :src="$methods.splitImgHost(props.scope.row._studentImg)"
+                :preview-src-list="[$methods.splitImgHost(props.scope.row._studentImg)]"
+              >
+              </el-image>
+      </template>
+      <template #right="scope"
+        ><el-button @click="edit(scope.row)" type="text" size="small"
+          >修改</el-button
+        >
+        <el-button @click="del(scope.row)" type="text" size="small"
+          >删除</el-button
+        >
+      </template>
+    </Table>
+    <Pagination
+      :pageindex="formData.pageindex"
+      :pagesize="formData.pagesize"
+      :total="total"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    ></Pagination>
+    <Operation ref="operation"></Operation>
+    <Operation-sh ref="operationsh"></Operation-sh>
+    <!-- <pl-update-box :dialogVisible.sync="plUpdateBox" /> -->
+    <el-dialog
+  title="批量导入证书信息(excel文件)"
+  :visible.sync="centerDialogVisible"
+  width="30%" top="500"
+  center>
+  <div class="updateBox">
+        <div class="first">导入excel文件:</div>
+        <div class="second">
+          <label class="labels" for="update1"
+            ><i class="el-icon-upload" style="color: #007aff"></i
+            ><span>选择并导入证书excel</span></label
+          >
+          <input
+            type="file"
+            id="update1"
+            style="display: none"
+            @change="updateFile"
+          />
+          <span @click="down">下载导入excel模板</span>
+        </div>
+      </div>
+    <!-- <div>导入结果:成功{{ successnum }}条,失败{{ errornum }}条</div>
+  <el-table :data="gridData">
+    <el-table-column property="date" label="姓名" width="150"></el-table-column>
+    <el-table-column property="name" label="身份证" width="200"></el-table-column>
+    <el-table-column property="address" label="单位名称"></el-table-column>
+  </el-table>-->
+</el-dialog> 
+<el-dialog
+  title="批量导入学员照片(zip压缩包)"
+  :visible.sync="centerDialogVisible2"
+  width="30%" top="500"
+  center>
+  <div class="updateBox">
+        <div class="first">导入zip文件:</div>
+        <div class="second">
+          <label class="labels" for="update2"
+            ><i class="el-icon-upload" style="color: #007aff"></i
+            ><span>选择并导入照片zip</span></label
+          >
+          <input
+            type="file"
+            id="update2"
+            style="display: none"
+            @change="updateFile2"
+          />
+          <span @click="down2">下载导入zip模板</span>
+        </div>
+      </div>
+    <!-- <div>导入结果:成功{{ successnum }}条,失败{{ errornum }}条</div>
+  <el-table :data="gridData">
+    <el-table-column property="date" label="姓名" width="150"></el-table-column>
+    <el-table-column property="name" label="身份证" width="200"></el-table-column>
+    <el-table-column property="address" label="单位名称"></el-table-column>
+  </el-table>-->
+</el-dialog> 
+  </div>
+</template>
+
+<script>
+import Search from "@/components/search/index.vue";
+import Table from "@/components/table/index.vue";
+import Pagination from "@/components/pagination/index.vue";
+import Operation from "./operation.vue";
+export default {
+  components: { Search, Operation, Table, Pagination },
+  data() {
+    return {
+      formList: [
+        {
+          label: "考试结果:",
+          prop: "ExamStatus",
+          scope: "options",
+          options: [
+            {
+              label: "合格",
+              value: 1,
+            },
+            {
+              label: "不合格",
+              value: 2,
+            },
+            {
+              label: "缺考",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "状态:",
+          prop: "Status",
+          scope: "options",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "官网隐藏",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "证件头像:",
+          prop: "StudentImg",
+          scope: "options",
+          options: [
+            {
+              label: "已上传",
+              value: "1",
+            },
+            {
+              label: "未上传",
+              value: "0",
+            },
+          ],
+        },
+        {
+          label: "考试时间:",
+          prop: "ExamTime",
+          scope: "date",
+        },
+        {
+          label: "关键字:",
+          prop: "KeyVal",
+          placeholder:"姓名/身份证/证书编号"
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+      tableData: [],
+      tableList: [
+        {
+          label: "姓名",
+          prop: "_name",
+        },
+        {
+          label: "身份证号",
+          prop: "_idNum",
+        },
+        {
+          label: "单位名称",
+          prop: "_company",
+        },
+        {
+          label: "考试时间",
+          prop: "_examTime",
+        },
+        {
+          label: "成绩",
+          prop: "_score",
+        },
+        {
+          label: "考试结果",
+          prop: "examStatusName",
+        },
+        {
+          label: "证书编号",
+          prop: "_certNum",
+        },
+        {
+          label: "发证时间",
+          prop: "_issueDate",
+        },
+        {
+          label: "学员照片",
+          prop: "_studentImg",
+          scope: "slot",
+          slotName: "_studentImg",
+        },
+        {
+          label: "备注",
+          prop: "_remarks",
+        },
+       
+      ],
+      total: 0,
+      routerTableData: [],
+      checkbox: [], //当前选中
+      centerDialogVisible: false,
+      centerDialogVisible2: false,
+      fullscreenLoading: false,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    selectionChange(e) {
+      this.checkbox = e;
+    },
+    search(e) {
+      if (e === "search") {
+        this.formData.pageindex = 1;
+      }
+      if (e === "init") {
+        this.formData = { pageindex: 1, pagesize: 10 };
+        this.clearCheck();
+      }
+      this.$api.XfSysBussinessGetCertList(this.formData).then((res) => {
+        this.tableData = res.Data.List || [];
+        this.total = res.Data.TotalCount;
+        this.tableData.forEach(item=>{
+          if(item._examTime){
+            item._examTime= item._examTime.replace("T"," ").substr(0,16);
+          }
+          if(item._issueDate){
+            item._issueDate= item._issueDate.substr(0,10);
+          }
+         item.statusName= item._status==-1?"已删除":item._status==0?"官网隐藏":"正常";
+         item.examStatusName= item._examStatus==0?"缺考":item._examStatus==1?"合格":"不合格";
+        })
+      });
+    },
+    add() {
+      this.$refs.operation.showInit();
+    },
+    edit(item) {
+      this.$api
+        .XfSysBussinessGetCertModel({ id: item._certId })
+        .then((res) => {
+          if(res.Data._examTime){
+            res.Data._examTime= res.Data._examTime.replace("T"," ").substr(0,16);
+          }
+          if(res.Data._issueDate){
+            res.Data._issueDate= res.Data._issueDate.substr(0,10);
+          }
+          this.$refs.operation.showInit(res.Data);
+        });
+    },
+    clearCheck() {
+      this.checkbox = [];
+      this.$refs.table.$refs.table.clearSelection();
+    },
+    delPL() {
+      if (this.checkbox.length > 0) {
+        this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            let array = this.checkbox.map((item) => {
+              return item._certId;
+            });
+            this.$api.XfSysBussinessDelCerts({ idarr: array }).then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$message.error("请勾选需要删除的数据");
+        return;
+      }
+    },
+    del(item) {
+      this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .XfSysBussinessDelCerts({ idarr: [item._certId] })
+            .then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    downcerts(){
+      var postdata=this.formData;
+      var tips="确定生成当前查询条件下考试合格的学员证书吗?";
+      if (this.checkbox.length > 0) {
+        let array = this.checkbox.map((item) => {
+              return item._certId;
+            });
+        postdata={ ids: array.join() };
+        tips="确定生成当前选中考试合格学员的证书吗?";
+      } else {
+        if(!this.tableData||this.tableData.length==0){
+        this.$message.error("当前无数据,请先查询显示是否有可下载的数据");
+        return;
+        }
+      }
+      this.$confirm(tips, "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            const loading = this.$loading({
+          lock: true,
+          text: '证书生成中...',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        });
+            this.$api.XfSysBussinessDownCerts(postdata).then((res) => {
+              loading.close();
+              this.$message({
+                type: "success",
+                message: res.Message,
+              });
+              this.$methods.exportData(res.Data,false)
+              this.clearCheck();
+            });
+          })
+          .catch(() => {
+            loading.close();
+            this.$message({
+              type: "info",
+              message: "已取消下载",
+            });
+          });
+    },
+    handleCurrentChange(e) {
+      this.formData.pageindex = e;
+      this.search();
+    },
+    handleSizeChange(e) {
+      this.formData.pageindex = 1;
+      this.formData.pagesize = e;
+      this.search();
+    },
+    updateFile(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) return;
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      let typeList = ["xlsx"];
+      if (!typeList.includes(type[0])) {
+        self.$message.error("上传格式需为:.xlsx");
+        e.target.value = "";
+        return;
+      }
+      if (file.size > 10 * 1024 * 1024) {
+        self.$message.error("文件不得大于10MB");
+        return;
+      }
+      let formData = new FormData();
+      formData.append("file", file); //存储在oss的文件路径
+      formData.append("pathname", "cert");
+      formData.append("busnessname", "certexcel"); 
+      this.$api
+        .XfSysBussinessUploadFile(formData)
+        .then((res) => {
+          this.$message.success("上传成功")
+          this.search(2)
+          this.centerDialogVisible = false
+        }).finally(()=>{
+          e.target.value = "";
+        })
+    },
+    updateFile2(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) return;
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      let typeList = ["zip"];
+      if (!typeList.includes(type[0])) {
+        self.$message.error("上传格式需为:.zip");
+        e.target.value = "";
+        return;
+      }
+      if (file.size > 100 * 1024 * 1024) {
+        self.$message.error("文件不得大于100MB");
+        return;
+      }
+      let formData = new FormData();
+      formData.append("file", file); //存储在oss的文件路径
+      formData.append("pathname", "cert");
+      formData.append("busnessname", "certzip"); 
+      this.$api
+        .XfSysBussinessUploadFile(formData)
+        .then((res) => {
+          this.$message.success("上传成功")
+          this.search(2)
+          this.centerDialogVisible2 = false
+        }).finally(()=>{
+          e.target.value = "";
+        })
+    },
+    down() {
+      this.$methods.exportData('TempUploadFile/certmodel.xlsx',false)
+    },
+    down2() {
+      this.$methods.exportData('TempUploadFile/zip文件示例:人员照片和证书文件打包上传.zip',false)
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.updateBox {
+  display: flex;
+  & > .first {
+    width: 150px;
+    text-align: end;
+    height: 32px;
+    line-height: 32px;
+  }
+  & > .second {
+    flex: 0.9;
+    display: flex;
+    flex-direction: column;
+    & > .labels {
+      font-weight: 400;
+      width: 100%;
+      height: 32px;
+      line-height: 32px;
+      border-radius: 8px;
+      border: 1px solid #007aff;
+      text-align: center;
+      user-select: none;
+      cursor: pointer;
+      color: #aaa;
+      background-color: rgb(221, 238, 255);
+    }
+    & > span {
+      cursor: pointer;
+      user-select: none;
+      color: #007aff;
+      margin-top: 10px;
+      display: inline-block;
+      text-decoration: underline;
+    }
+  }
+}
+</style>

+ 272 - 0
src/views/System/certSet/list/operation.vue

@@ -0,0 +1,272 @@
+<template>
+  <div id="">
+    <el-dialog
+      :close-on-click-modal="false"
+      title="操作证书"
+      :visible.sync="dialogVisible"
+      width="1000px"
+    >
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="姓名" prop="_name">
+              <el-input v-model.trim="ruleForm._name"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="身份证号" prop="_idNum">
+              <el-input v-model.trim="ruleForm._idNum"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24" v-if="true">
+            <el-form-item label="照片上传" prop="_studentImg">
+              <el-image
+                v-if="ruleForm._studentImg"
+                style="width: 112px; height: 70px"
+                :src="$methods.splitImgHost(ruleForm._studentImg)"
+                :preview-src-list="[$methods.splitImgHost(ruleForm._studentImg)]"
+              >
+              </el-image>
+              <label for="uploads" style="vertical-align: text-bottom"
+                ><span class="btn">{{
+                  ruleForm._studentImg ? "更换照片" : "上传照片"
+                }}</span></label
+              >
+              <input
+                type="file"
+                id="uploads"
+                style="display: none"
+                @change="uploadImg"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="单位名称" prop="_company">
+              <el-input v-model.trim="ruleForm._company"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="考试成绩" prop="_score">
+              <el-input v-model.trim="ruleForm._score" type="number"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="考试是否通过" prop="_examStatus">
+              <el-radio-group v-model="ruleForm._examStatus">
+                <el-radio :label="1">是</el-radio>
+                <el-radio :label="2">否</el-radio>
+                <el-radio :label="0">缺考</el-radio>
+              </el-radio-group></el-form-item
+            >
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="考试时间" prop="_examTime">
+              <el-date-picker
+                v-model="ruleForm._examTime"
+                type="datetime"
+                placeholder="选择考试时间"
+                format="yyyy-MM-dd HH:mm"
+                value-format="yyyy-MM-dd HH:mm"
+              >
+              </el-date-picker
+            ></el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="证书编号" prop="_certNum">
+              <el-input v-model.trim="ruleForm._certNum"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="发证时间" prop="_issueDate">
+              <el-date-picker
+                v-model="ruleForm._issueDate"
+                type="datetime"
+                placeholder="选择发证时间"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd"
+              >
+              </el-date-picker
+            ></el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="数据状态" prop="_status">
+              <el-radio-group v-model="ruleForm._status">
+                <el-radio :label="1">正常</el-radio>
+                <el-radio :label="0">隐藏</el-radio>
+              </el-radio-group></el-form-item
+            >
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="_remarks">
+              <el-input v-model.trim="ruleForm._remarks"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close">取 消</el-button>
+        <el-button
+          size="small"
+          type="primary"
+          @click="submit('ruleForm')"
+          :loading="loading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+// import Editor from "@/components/Editor";
+import Editor from "@/components/tinymce";
+export default {
+  components: { Editor },
+  data() {
+    return {
+      dialogVisible: false,
+      ruleForm: {
+        _certNum: "",
+        _status: 1,
+        _name: "",
+        _effectiveDate: "",
+        _examTime: "",
+        _certId: 0,
+        _idNum: "",
+        _examStatus: 1,
+        _company: "",
+        _createTime: "",
+        _mobile: "",
+        _score:"" ,
+        _remarks: "",
+        _effectiveYear: "",
+        _issueDate: "",
+      },
+      rules: {
+        Name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
+        IdNum: [{ required: true, message: "请输入姓名", trigger: "blur" },
+        { pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '身份证号码格式不正确', trigger: 'blur'}],
+        // ImageUrl: [
+        //   { required: true, message: "请上传图片", trigger: "change" },
+        // ],
+        MenuId: [
+          {
+            required: true,
+            message: "请选择所属菜单",
+            trigger: ["blur", "change"],
+          },
+        ],
+      },
+      loading: false,
+    };
+  },
+  methods: {
+    showInit(e, id) {
+      if (e) {
+        this.$nextTick(() => {
+          this.ruleForm = e;
+        });
+      } else {
+        this.ruleForm = {
+          _certNum: "",
+        _status: 1,
+        _name: "",
+        _effectiveDate: "",
+        _examTime: "",
+        _certId: 0,
+        _idNum: "",
+        _examStatus: 1,
+        _company: "",
+        _createTime: "",
+        _mobile: "",
+        _score:"" ,
+        _remarks: "",
+        _effectiveYear: "",
+        _issueDate: "",
+        };
+      }
+      this.dialogVisible = true;
+    },
+    uploadImg(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) {
+        return;
+      }
+      if (file.size > 10 * 1024 * 1024) {
+        self.$message.error("图片不得大于10MB");
+        return;
+      }
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      if (type[0] != "jpg" && type[0] != "png" && type[0] != "jpeg") {
+        self.$message.error("上传格式需为:.jpg/.png/.jpeg");
+        e.target.value = "";
+        return;
+      }
+      let formDatas = new FormData();
+      formDatas.append("file", file);
+      formDatas.append("pathname", "cert");
+      this.$api
+        .XfSysBussinessUploadFile(formDatas)
+        .then((res) => {
+          this.$set(this.ruleForm, "_studentImg", res.Data);
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    close() {
+      this.loading = false;
+      this.$refs["ruleForm"].resetFields();
+      this.dialogVisible = false;
+    },
+    submit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          this.$api.XfSysBussinessEditCertInfo(this.ruleForm).then((res) => {
+            this.$message.success("操作成功");
+            this.close();
+            this.$parent.search();
+          });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btn {
+  display: inline-block;
+  line-height: 1;
+  white-space: nowrap;
+  cursor: pointer;
+  border: 1px solid #dcdfe6;
+  -webkit-appearance: none;
+  text-align: center;
+  box-sizing: border-box;
+  outline: none;
+  margin: 0;
+  margin-left: 14px;
+  transition: 0.1s;
+  font-weight: 500;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  padding: 8px 16px;
+  font-size: 14px;
+  border-radius: 4px;
+  color: #fff;
+  background-color: #409eff;
+  border-color: #409eff;
+}
+</style>

+ 18 - 18
src/views/System/contentSet/article/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div id="article">
+  <div id="article1">
     <Search
       ref="search"
       :formList="formList"
@@ -66,6 +66,21 @@ export default {
   data() {
     return {
       formList: [
+        {
+          label: "仅会员可见:",
+          prop: "IsMemberRead",
+          scope: "IsMemberRead",
+          options: [
+            {
+              label: "是",
+              value: true,
+            },
+            {
+              label: "否",
+              value: false,
+            },
+          ],
+        },
         {
           label: "菜单:",
           prop: "MenuId",
@@ -87,21 +102,6 @@ export default {
           ],
         },
         // {
-        //   label: "会员可见:",
-        //   prop: "IsMemberRead",
-        //   scope: "options",
-        //   options: [
-        //     {
-        //       label: "是",
-        //       value: true,
-        //     },
-        //     {
-        //       label: "否",
-        //       value: false,
-        //     },
-        //   ],
-        // },
-        // {
         //   label: "投稿类型:",
         //   prop: "Type",
         //   scope: "options",
@@ -144,7 +144,7 @@ export default {
           prop: "Title",
         },
       ],
-      formData: { pageindex: 1, pagesize: 10 },
+      formData: { pageindex: 1, pagesize: 10,IsMemberRead:this.$store.state.parentid==-2?true:false },
       tableData: [],
       tableList: [
         {
@@ -229,7 +229,7 @@ export default {
         this.formData.pageindex = 1;
       }
       if (e === "init") {
-        this.formData = { pageindex: 1, pagesize: 10 };
+        this.formData = { pageindex: 1, pagesize: 10,IsMemberRead:this.$store.state.parentid==-2?true:false };
         this.clearCheck();
       }
       this.$api.XfSysBussinessGetNewsList(this.formData).then((res) => {

+ 18 - 1
src/views/System/contentSet/article/operation.vue

@@ -14,12 +14,21 @@
         class="demo-ruleForm"
       >
         <el-row>
+          <el-col :span="12">
+            <el-form-item label="仅会员可见" prop="IsMemberRead">
+              <el-radio-group v-model="ruleForm.IsMemberRead"
+              @change="getmenulist">
+                <el-radio :label="true">是</el-radio>
+                <el-radio :label="false">否</el-radio>
+              </el-radio-group></el-form-item
+            >
+          </el-col>
           <el-col :span="24">
             <el-form-item label="所属菜单" prop="MenuId">
               <el-cascader
                 v-model="ruleForm.MenuId"
                 placeholder="选择目录"
-                :options="$parent.routerTableData"
+                :options="routerTableData"
                 :props="{
                   value: 'MenuId',
                   label: 'Name',
@@ -156,6 +165,7 @@ export default {
         ],
       },
       loading: false,
+      routerTableData:[],
     };
   },
   methods: {
@@ -175,6 +185,7 @@ export default {
           CreateTime: "",
         };
       }
+      this.getmenulist()
       this.dialogVisible = true;
     },
     uploadImg(e) {
@@ -224,6 +235,12 @@ export default {
         }
       });
     },
+    getmenulist(){
+      this.ruleForm.MenuId=null;
+      this.$api.XfSysBussinessGetMenuList({parentid:this.ruleForm.IsMemberRead?-2:-1}).then((res) => {
+      this.routerTableData = res.Data || [];
+    });
+    },
   },
 };
 </script>

+ 15 - 1
src/views/System/contentSet/homeSet/index.vue

@@ -63,7 +63,21 @@ export default {
   components: { Search, Operation, Table, Pagination },
   data() {
     return {
-      formList: [
+      formList: [ {
+          label: "仅会员可见:",
+          prop: "IsMemberRead",
+          scope: "IsMemberRead",
+          options: [
+            {
+              label: "是",
+              value: true,
+            },
+            {
+              label: "否",
+              value: false,
+            },
+          ],
+        },
         {
           label: "分类:",
           prop: "Seat",

+ 18 - 4
src/views/System/contentSet/homeSet/operation.vue

@@ -83,7 +83,7 @@
 import Search from "@/components/search/index.vue";
 import Table from "@/components/table/index.vue";
 import Pagination from "@/components/pagination/index.vue";
-import { mapGetters } from "vuex";
+import { mapGetters,mapState } from "vuex";
 export default {
   components: { Search, Table, Pagination },
   data() {
@@ -101,14 +101,28 @@ export default {
           },
         ],
       },
-      formList: [
+      formList: [ {
+          label: "仅会员可见:",
+          prop: "IsMemberRead",
+          scope: "IsMemberRead",
+          options: [
+            {
+              label: "是",
+              value: true,
+            },
+            {
+              label: "否",
+              value: false,
+            },
+          ],
+        },
         {
           label: "菜单:",
           prop: "MenuId",
           scope: "MenuList",
         },
       ],
-      formData: { pageindex: 1, pagesize: 10 },
+      formData: { pageindex: 1, pagesize: 10,IsMemberRead:this.$store.state.parentid==-2?true:false },
       tableData: [],
       tableList: [
         {
@@ -174,7 +188,7 @@ export default {
     },
     search(e) {
       if (e === "init") {
-        this.formData = { pageindex: 1, pagesize: 10 };
+        this.formData = { pageindex: 1, pagesize: 10,IsMemberRead:this.$store.state.parentid==-2?true:false };
         this.clearCheck();
       }
       this.$api.XfSysBussinessGetNewsList(this.formData).then((res) => {

+ 27 - 3
src/views/System/contentSet/websiteMenu/index.vue

@@ -1,5 +1,9 @@
 <template>
   <div id="websiteMenu">
+    <el-tabs v-model="activeName" @tab-click="tabchange">
+    <el-tab-pane label="游客菜单" name="first"></el-tab-pane>
+    <el-tab-pane label="会员菜单" name="second"></el-tab-pane>
+  </el-tabs>
     <div style="text-align: right; margin-bottom: 10px">
       <el-button :size="$store.state.defaultSize" @click="add" type="primary"
         >新增</el-button
@@ -66,6 +70,8 @@ export default {
   components: { Operation },
   data() {
     return {
+      parentid:-1,
+      activeName: 'first',
       tableData: [],
       tableList: [
         {
@@ -86,6 +92,10 @@ export default {
           label: "显示排序",
           prop: "SortNumber",
         },
+        {
+          label: "仅会员可见",
+          prop: "IsMenuRead",
+        },
         {
           label: "用途",
           prop: "ShowType",
@@ -141,8 +151,13 @@ export default {
           });
         });
     },
+    tabchange(tab, event) {
+        console.log(tab, event);
+        this.parentid=this.activeName=="first"?-1:-2;
+        this.search();
+      },
     search() {
-      this.$api.XfSysBussinessGetMenuList().then((res) => {
+      this.$api.XfSysBussinessGetMenuList({parentid:this.parentid}).then((res) => {
         if (res.Data && res.Data.length > 0) {
           res.Data.forEach((item) => {
             if (item.ChildList && item.ChildList.length > 0) {
@@ -156,7 +171,16 @@ export default {
       });
     },
     add() {
-      this.$refs.operation.showInit();
+      var data1 = {
+          ParentId: "",
+          Type: 1,
+          Name: "",
+          SortNumber: "",
+          ShowType: 1,
+          Status: 1,
+          IsMenuRead: this.parentid==-1?false:true,
+        };
+      this.$refs.operation.showInit(data1);
     },
     handleClick(item) {
       let copy = JSON.parse(JSON.stringify(item));
@@ -165,7 +189,7 @@ export default {
     },
     //新增子路由
     addChildren(id) {
-      this.$refs.operation.showInit("children", id);
+      this.$refs.operation.showInit("children", id,this.parentid==-1?false:true);
     },
   },
 };

+ 10 - 2
src/views/System/contentSet/websiteMenu/operation.vue

@@ -53,6 +53,14 @@
               ></el-input-number
             ></el-form-item>
           </el-col>
+          <!-- <el-col :span="12">
+            <el-form-item label="仅会员可见" prop="IsMenuRead">
+              <el-radio-group v-model="ruleForm.IsMenuRead">
+                <el-radio :label="True" disabled >是</el-radio>
+                <el-radio :label="False" disabled >否</el-radio>
+              </el-radio-group></el-form-item
+            >
+          </el-col> -->
           <el-col :span="12">
             <el-form-item label="用途" prop="ShowType">
               <el-radio-group v-model="ruleForm.ShowType">
@@ -124,14 +132,14 @@ export default {
     };
   },
   methods: {
-    showInit(e, id) {
+    showInit(e, id,isMenuRead) {
       if (e === "children") {
         this.ruleForm = {
           ParentId: id,
           Status: 1,
           Type: 1,
           ShowType: 1,
-          IsMenuRead: false,
+          IsMenuRead: isMenuRead,
         };
       } else if (e) {
         this.ruleForm = e;

+ 214 - 102
src/views/System/vip/list/index.vue

@@ -6,6 +6,14 @@
       :formData="formData"
       @onSubmit="search"
     ></Search>
+    <div style="text-align: right; margin-bottom: 10px">
+    <el-button :size="$store.state.defaultSize" @click="centerDialogVisible = true" type="primary"
+        >导入会员信息</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="add" type="primary"
+        >新增</el-button
+      >
+    </div>
     <Table
       :loading="loading"
       :tableData="tableData"
@@ -41,6 +49,34 @@
       @handleSizeChange="handleSizeChange"
       @handleCurrentChange="handleCurrentChange"
     ></Pagination>
+    <el-dialog
+  title="批量导入会员信息(excel文件)"
+  :visible.sync="centerDialogVisible"
+  width="30%" top="500"
+  center>
+  <div class="updateBox">
+        <div class="first">导入excel文件:</div>
+        <div class="second">
+          <label class="labels" for="update1"
+            ><i class="el-icon-upload" style="color: #007aff"></i
+            ><span>选择并导入会员excel</span></label
+          >
+          <input
+            type="file"
+            id="update1"
+            style="display: none"
+            @change="updateFile"
+          />
+          <span @click="down">下载导入excel模板</span>
+        </div>
+      </div>
+    <!-- <div>导入结果:成功{{ successnum }}条,失败{{ errornum }}条</div>
+  <el-table :data="gridData">
+    <el-table-column property="date" label="姓名" width="150"></el-table-column>
+    <el-table-column property="name" label="身份证" width="200"></el-table-column>
+    <el-table-column property="address" label="单位名称"></el-table-column>
+  </el-table>-->
+</el-dialog> 
     <membership ref="membership"></membership>
   </div>
 </template>
@@ -57,136 +93,140 @@ export default {
     return {
       formData: { pageindex: 1, pagesize: 10 },
       formList: [
-        {
-          label: "企业名称/联系人/单位名称:",
-          prop: "MemberName",
-        },
-        {
-          label: "申请时间:",
-          prop: "time",
-          scope: "dateTime",
-        },
-        {
-          label: "单位归类",
-          prop: "CompanyType",
-          scope: "CompanyType",
-        },
-        {
-          label: "申报职务",
-          prop: "ApplyPost",
-        },
-        {
-          label: "会员级别",
+        // {
+        //   label: "申请时间:",
+        //   prop: "time",
+        //   scope: "dateTime",
+        // },
+        // {
+        //   label: "单位归类",
+        //   prop: "CompanyType",
+        //   scope: "CompanyType",
+        // },
+        // {
+        //   label: "申报职务",
+        //   prop: "ApplyPost",
+        // },
+        {
+          label: "协会任职",
           prop: "MemberLevel",
           scope: "MemberLevel",
         },
         {
-          label: "报名表齐全情况",
-          prop: "ApplyAllDes",
+          label: "企业名称/联系人/主营业务/单位性质/单位注册地:",
+          prop: "MemberName",
         },
+        // {
+        //   label: "报名表齐全情况",
+        //   prop: "ApplyAllDes",
+        // },
       ],
       tableData: [],
       // 表单
       tableList: [
+        // {
+        //   label: "单位归类",
+        //   prop: "CompanyTypeName",
+        // },
+        // {
+        //   label: "申报职务",
+        //   prop: "ApplyPost",
+        // },
+        // {
+        //   label: "档案编号",
+        //   prop: "FilesNumber",
+        // },
         {
-          label: "单位归类",
-          prop: "CompanyTypeName",
-        },
-        {
-          label: "申报职务",
-          prop: "ApplyPost",
-        },
-        {
-          label: "档案编号",
-          prop: "FilesNumber",
+          label: "单位名称",
+          prop: "MemberName",
         },
         {
-          label: "会员级别",
+          label: "协会任职",
           prop: "MemberLevelName",
         },
+        // {
+        //   label: "社会统一信用代码",
+        //   prop: "SerialNumber",
+        // },
         {
-          label: "单位名称",
-          prop: "MemberName",
-        },
-        {
-          label: "社会统一信用代码",
-          prop: "SerialNumber",
+          label: "主营业务",
+          prop: "Mainbusiness",
         },
         {
           label: "单位性质",
           prop: "CompanyMent",
         },
-        {
-          label: "单位地址",
-          prop: "CompanyAddress",
-        },
-        {
-          label: "邮编",
-          prop: "PostCode",
-        },
+        // {
+        //   label: "单位地址",
+        //   prop: "CompanyAddress",
+        // },
+        // {
+        //   label: "邮编",
+        //   prop: "PostCode",
+        // },
         {
           label: "单位注册地",
           prop: "RegAddress",
         },
-        {
-          label: "企业成立时间",
-          prop: "CompSetUpDate",
-          scope: "date",
-        },
-        {
-          label: "单位员工数",
-          prop: "CompanyNumber",
-          scope: "number",
-        },
-        {
-          label: "注册资金",
-          prop: "RegisteredCapital",
-        },
-        {
-          label: "年营业额",
-          prop: "YearTurnover",
-        },
-        {
-          label: "法人代表",
-          prop: "LegalPerson",
-        },
-        {
-          label: "入会代表",
-          prop: "Operator",
-        },
-        {
-          label: "入会代表是否法人",
-          prop: "OperIsLegal",
-          scope: "options",
-          options: [
-            { label: "是", value: true },
-            { label: "否", value: false },
-          ],
-        },
-        {
-          label: "单位职务",
-          prop: "CompanyPost",
-        },
-        {
-          label: "单位总机",
-          prop: "Switchboard",
-        },
-        {
-          label: "联系人电话",
+        // {
+        //   label: "企业成立时间",
+        //   prop: "CompSetUpDate",
+        //   scope: "date",
+        // },
+        // {
+        //   label: "单位员工数",
+        //   prop: "CompanyNumber",
+        //   scope: "number",
+        // },
+        // {
+        //   label: "注册资金",
+        //   prop: "RegisteredCapital",
+        // },
+        // {
+        //   label: "年营业额",
+        //   prop: "YearTurnover",
+        // },
+        // {
+        //   label: "法人代表",
+        //   prop: "LegalPerson",
+        // },
+        // {
+        //   label: "入会代表",
+        //   prop: "Operator",
+        // },
+        // {
+        //   label: "入会代表是否法人",
+        //   prop: "OperIsLegal",
+        //   scope: "options",
+        //   options: [
+        //     { label: "是", value: true },
+        //     { label: "否", value: false },
+        //   ],
+        // },
+        // {
+        //   label: "单位职务",
+        //   prop: "CompanyPost",
+        // },
+        // {
+        //   label: "单位总机",
+        //   prop: "Switchboard",
+        // },
+        {
+          label: "联系人联系电话",
           prop: "OperatorPhone",
         },
         {
-          label: "日常工作联络人",
+          label: "联络人姓名",
           prop: "DailyOperator",
         },
-        {
-          label: "电子邮箱",
-          prop: "Email",
-        },
-        {
-          label: "报名表齐全情况",
-          prop: "ApplyAllDes",
-        },
+        // {
+        //   label: "电子邮箱",
+        //   prop: "Email",
+        // },
+        // {
+        //   label: "报名表齐全情况",
+        //   prop: "ApplyAllDes",
+        // },
         {
           label: "备注",
           prop: "Remarks",
@@ -212,6 +252,7 @@ export default {
       ],
       total: 0,
       loading: false,
+      centerDialogVisible:false,
     };
   },
   created() {
@@ -242,6 +283,9 @@ export default {
           this.loading = false;
         });
     },
+    add() {
+      this.$refs.membership.showInit(0, "backTai");
+    },
     edit(item) {
       this.$refs.membership.showInit(item.MemberId, "backTai");
     },
@@ -256,6 +300,38 @@ export default {
           this.search();
         });
     },
+    down() {
+      this.$methods.exportData('TempUploadFile/ImprtMember.xlsx',false)
+    },
+    updateFile(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) return;
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      let typeList = ["xlsx"];
+      if (!typeList.includes(type[0])) {
+        self.$message.error("上传格式需为:.xlsx");
+        e.target.value = "";
+        return;
+      }
+      if (file.size > 10 * 1024 * 1024) {
+        self.$message.error("文件不得大于10MB");
+        return;
+      }
+      let formData = new FormData();
+      formData.append("file", file); //存储在oss的文件路径
+      formData.append("pathname", "member");
+      formData.append("busnessname", "memberexcel"); 
+      this.$api
+        .XfSysBussinessUploadFile(formData)
+        .then((res) => {
+          this.$message.success("上传成功")
+          this.search()
+          this.centerDialogVisible = false
+        }).finally(()=>{
+          e.target.value = "";
+        })
+    },
     handleCurrentChange(e) {
       this.formData.pageindex = e;
       this.search();
@@ -269,4 +345,40 @@ export default {
 };
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.updateBox {
+  display: flex;
+  & > .first {
+    width: 150px;
+    text-align: end;
+    height: 32px;
+    line-height: 32px;
+  }
+  & > .second {
+    flex: 0.9;
+    display: flex;
+    flex-direction: column;
+    & > .labels {
+      font-weight: 400;
+      width: 100%;
+      height: 32px;
+      line-height: 32px;
+      border-radius: 8px;
+      border: 1px solid #007aff;
+      text-align: center;
+      user-select: none;
+      cursor: pointer;
+      color: #aaa;
+      background-color: rgb(221, 238, 255);
+    }
+    & > span {
+      cursor: pointer;
+      user-select: none;
+      color: #007aff;
+      margin-top: 10px;
+      display: inline-block;
+      text-decoration: underline;
+    }
+  }
+}
+</style>

+ 478 - 0
src/views/certsearch/index.vue

@@ -0,0 +1,478 @@
+<template>
+    <div id="" @keyup.enter="search">
+      <div v-if="beforesel" class="center_1200" style="height: 100%">
+        <el-main v-loading="loading" class="main_style" style="text-align: center;">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix" style="font-size:22px;font-weight: 600;">
+    <span>工程质量风险管理工程师培训<br />测评成绩查询</span>
+  </div>
+            <el-form label-position="right" label-width="100px"  :model="formData">
+  <el-form-item  v-for="(item, index) in formList" :label="item.label" :key="index">
+    <el-input
+          clearable
+          :size="$store.state.defaultSize"
+          v-model="formData[item.prop]"
+          :placeholder="item.placeholder"
+        ></el-input>
+  </el-form-item>
+  <div>
+    <el-button
+          :size="$store.state.defaultSize"
+          type="primary"
+          @click="search"
+          >查询</el-button
+        >
+        <el-button
+          :size="$store.state.defaultSize"
+          type="primary"
+          @click="init"
+          >重置</el-button
+        >
+  </div>
+</el-form>
+</el-card>
+        </el-main>
+      </div>
+      <div v-else class="center_1200" style="height: 100%">
+        <el-main v-loading="loading" class="main_style">
+            <Search
+      ref="search"
+      :formList="formList"
+      :formData="formData"
+      @onSubmit="search"
+      @init="init"
+    ></Search>
+    <!-- <span>注:输入查询方式:姓名+身份证,或姓名+证书编号</span> -->
+    <div  v-if="tableData.length > 0">
+      <el-table ref="table"
+      :row-key="_certId"
+      :size="$store.state.defaultSize"
+      :data="tableData"
+      v-loading="loading"
+      border
+      style="width: 100%"
+      @selection-change="selectionChange"
+      :span-method="objectSpanMethod">
+      <el-table-column align="center" type="index" label="序号"></el-table-column>
+      <template v-for="(item, index) in tableList">
+        <el-table-column
+        :key="index"
+          header-align="center"
+          :align="item.align ? item.align : 'center'"
+          :prop="item.prop"
+          :label="item.label"
+          :width="item.width || ''"
+          :show-overflow-tooltip="item.tooltipShow || false"
+          ><template slot-scope="scope"
+            ><div v-if="item.scope === 'options'">
+              <template v-for="(itemt, indext) in item.options">
+                <span v-if="itemt.value === scope.row[item.prop]" :key="indext">{{
+                  itemt.label
+                }}</span>
+              </template>
+            </div>
+            <div v-else-if="item.scope === 'image'">
+              <el-image
+                v-if="scope.row[item.prop]"
+                style="width: 100px"
+                :src="$methods.splitImgHost(scope.row[item.prop])"
+                :preview-src-list="[
+                  $methods.splitImgHost(scope.row[item.prop]),
+                ]"
+              >
+              </el-image>
+              <span></span>
+            </div>
+            <el-input-number
+              v-else-if="item.scope === 'input'"
+              style="width: 100%"
+              :precision="0"
+              :min="0"
+              :controls="false"
+              v-model="scope.row[item.prop]"
+              @change="changeSort($event, scope.row)"
+            ></el-input-number>
+            <div v-else-if="item.scope === 'slot'">
+              <slot :name="item.slotName" :scope="scope"></slot>
+            </div>
+            <span v-else-if="item.scope === 'time'">{{
+              $methods.onlyFormaHao(scope.row[item.prop])
+            }}</span>
+            <span v-else>{{ !scope.row[item.prop]?"-": scope.row[item.prop]}}</span></template
+          >
+        </el-table-column>
+      </template>
+      <el-table-column
+        fixed="right"
+        label="证书"
+        :width="rightWidth"
+        align="center"
+      >
+        <template slot-scope="scope">
+          <el-button @click="down(scope.row)" v-if="scope.row._examStatus==1" type="text" size="small"
+          >证书下载</el-button
+        >
+        </template>
+      </el-table-column>
+         </el-table>
+        <!-- <Table
+      ref="table"
+      :tableData="tableData"
+      :tableList="tableList"
+      :rowKey="'_certId'"
+      
+    >
+    <template slot="_studentImg" slot-scope="props">
+      <el-image
+                v-if="props.scope.row._studentImg"
+                style="width: 70px; height: 100px"
+                :src="$methods.splitImgHost(props.scope.row._studentImg)"
+                :preview-src-list="[$methods.splitImgHost(props.scope.row._studentImg)]"
+              >
+              </el-image>
+      </template>
+      <template #right="scope"
+        ><el-button @click="down(scope.row)" v-if="scope.row._examStatus==1" type="text" size="small"
+          >下载证书</el-button
+        >
+      </template>
+    </Table> -->
+    <Pagination
+      :pageindex="formData.pageindex"
+      :pagesize="formData.pagesize"
+      :total="total"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    ></Pagination>
+    </div>
+         
+          <el-empty v-else :image-size="200"></el-empty>
+          <el-pagination
+            v-if="notList.length > 0"
+            class="paginations"
+            @current-change="handleCurrentChange"
+            :current-page.sync="formData.pageindex"
+            :page-size="formData.pagesize"
+            layout="total, prev, pager, next"
+            :total="total"
+          >
+          </el-pagination>
+        </el-main>
+      
+      </div>
+    </div>
+  </template>
+  
+  <script>
+  import Search from "@/components/search/index.vue";
+  // import Table from "@/components/table/index.vue";
+  import Pagination from "@/components/pagination/index.vue";
+  export default {
+    components: { Search, Pagination },
+    data() {
+      return {
+        notList: [],
+        formList: [
+        {
+          label: "姓名:",
+          prop: "Name",
+          placeholder:"必填"
+        },
+        {
+          label: "身份证:",
+          prop: "IdNum",
+          placeholder:"与证书编号选填"
+        },
+        {
+          label: "证书编号:",
+          prop: "CertNum",
+          placeholder:"选填"
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+        total: 0,
+        loading: false,
+        tableData: [],
+      tableList: [
+        {
+          label: "姓名",
+          prop: "_name",
+        },
+        {
+          label: "身份证号",
+          prop: "_idNum",
+        },
+        {
+          label: "单位名称",
+          prop: "_company",
+        },
+        {
+          label: "考试时间",
+          prop: "_examTime",
+        },
+        // {
+        //   label: "成绩",
+        //   prop: "_score",
+        // },
+        {
+          label: "考试结果",
+          prop: "examStatusName",
+        },
+        {
+          label: "证书编号",
+          prop: "_certNum",
+        },
+        {
+          label: "发证时间",
+          prop: "_issueDate",
+        },
+        // {
+        //   label: "照片",
+        //   prop: "_studentImg",
+        //   scope: "image",
+        //   slotName: "_studentImg",
+        // },
+        {
+          label: "备注",
+          prop: "_remarks",
+        },
+       
+      ],
+      typeNameArr: [],
+            typeNamePos: 0,
+            storeArr: [],
+            storePos: 0,
+            feeArr: [],
+            feePos: 0,
+            beforesel:true,
+      };
+    },
+    watch: {
+      $route: {
+      handler: function (val, oldVal) {
+        if(val.query.Name){
+        this.formData.Name = val.query.Name;
+        }
+        if(val.query.CertNum){
+        this.formData.CertNum = val.query.CertNum;
+        }
+        if(val.query.Name&&val.query.CertNum){
+        this.search();}
+      },
+      // 深度观察监听
+      deep: true,
+      immediate: true,
+    },
+    },
+    methods: {
+      merageInit() {
+                // 在下文的时候会用到,对数据进行初始化是很有必要的
+                this.typeNameArr = [];
+                this.typeNamePos = 0;
+                this.storeArr = [];
+                this.storePos = 0;
+                this.feeArr = [];
+                this.feePos = 0;
+            },
+        merage() {
+            this.merageInit(); // 前文的初始化数据函数
+            let arys = JSON.parse(JSON.stringify(this.tableData));
+            console.log(arys)
+            for (let i = 0; i < arys.length; i += 1) {
+                if (i === 0) {
+                    // 第一行必须存在
+                    this.typeNameArr.push(1);
+                    this.typeNamePos = 0;
+                    this.storeArr.push(1);
+                    this.storePos = 0;
+                    this.feeArr.push(1);
+                    this.feePos = 0;
+                } else {
+                    // 判断当前元素与上一个元素是否相同,eg:this.typeNamePos 是 this.typeNameArr序号
+                    // 第一列 下面的是eslint的不限制语法
+                    // eslint-disable-next-line no-lonely-if
+                    if (arys[i]._name === arys[i - 1]._name) {
+                        this.typeNameArr[this.typeNamePos] += 1;
+                        this.typeNameArr.push(0);
+                    } else {
+                        this.typeNameArr.push(1);
+                        this.typeNamePos = i;
+                    }
+                    // 第二列
+                    if (
+                        arys[i]._idNum === arys[i - 1]._idNum &&
+                        arys[i]._name === arys[i - 1]._name
+                    ) {
+                        this.storeArr[this.storePos] += 1;
+                        this.storeArr.push(0);
+                    } else {
+                        this.storeArr.push(1);
+                        this.storePos = i;
+                    }
+                    // 第三列
+                    if (
+                        arys[i]._company === arys[i - 1]._company &&
+                        arys[i]._idNum === arys[i - 1]._idNum &&
+                        arys[i]._name === arys[i - 1]._name
+                    ) {
+                        this.feeArr[this.feePos] += 1;
+                        this.feeArr.push(0);
+                    } else {
+                        this.feeArr.push(1);
+                        this.feePos = i;
+                    }
+                }
+            }
+        },
+            objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+                if (columnIndex === 1) {
+                    // 第一列的合并方法
+                    const row1 = this.typeNameArr[rowIndex];
+                    const col1 = row1 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+                    return {
+                        rowspan: row1,
+                        colspan: col1,
+                    };
+                } else if (columnIndex === 2) {
+                    // 第二列的合并方法
+                    const row2 = this.storeArr[rowIndex];
+                    const col2 = row2 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+                    return {
+                        rowspan: row2,
+                        colspan: col2,
+                    };
+                } else if (columnIndex === 3) {
+                    // 第三列的合并方法
+                    const row3 = this.feeArr[rowIndex];
+                    const col3 = row3 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+                    return {
+                        rowspan: row3,
+                        colspan: col3,
+                    };
+                }
+            },
+            init(){
+             this.formData= { pageindex: 1, pagesize: 10 }
+            },
+      search() {
+        console.log("ss",this.formData)
+        if(!this.formData.Name){
+        this.$message({
+                type: "error",
+                message: "姓名不能为空!",
+              });
+              return;
+            }
+            if(!this.formData.IdNum&&!this.formData.CertNum){
+        this.$message({
+                type: "error",
+                message: "身份证和证书编号必须选填一个!",
+              });
+              return;
+            }
+            this.beforesel=false;
+        this.loading = true;
+        this.$api
+          .XfWebApiGetCertList(this.formData)
+          .then((res) => {
+            this.tableData = res.Data.List || [];
+        this.total = res.Data.TotalCount;
+        this.tableData.forEach(item=>{
+          if(item._examTime){
+            item._examTime= item._examTime.substr(0,10);
+          }
+          if(item._issueDate){
+            item._issueDate= item._issueDate.substr(0,10);
+          }
+         item.statusName= item._status==-1?"已删除":item._status==0?"官网隐藏":"正常";
+         item.examStatusName= item._examStatus==0?"-":item._examStatus==1?"合格":"不合格";
+        })
+        this.merage();
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      },
+      handleCurrentChange(e) {
+        this.formData.pageindex = e;
+        this.search();
+      },
+      //下载
+      down(row) {
+        if(this.loading){
+          this.$message({
+                type: "error",
+                message: "正在下载中,请稍后!",
+              });
+            return;
+            }
+        this.loading = true;
+        var pdata={IdNum:row._idNum,CertId:row._certId};
+        this.$api
+          .XfWebApiDownCert(pdata)
+          .then((res) => {
+            this.loading = false;
+            // console.log(res.Data,"sd")
+            this.downfile(res.Data);
+            // this.$methods.exportData(res.Data.Data,false)
+            // this.search();
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      },
+      downfile(path){
+        
+        this.$methods.downloadbase64(this.formData.Name+"证书.png",path);
+        // this.$methods.downloadPicBase(path);
+      },
+    },
+  };
+  </script>
+  
+  <style lang="scss" scoped>
+  .main_style {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+    & > ul {
+      flex: 1;
+    }
+  }
+  .li_list {
+    display: flex;
+    align-items: center;
+    height: 60px;
+    border-bottom: 1px dashed #ddd;
+    font-size: 16px;
+    color: #666;
+    cursor: pointer;
+    transition: all 0.3s;
+    &:hover {
+      color: #c9001f;
+    }
+    & > .title_li {
+      flex: 1;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
+    & > .time_li {
+      font-size: 14px;
+      word-spacing: 0px;
+    }
+  }
+  .paginations {
+    text-align: center;
+    margin: 20px;
+    height: 32px;
+    flex-shrink: 0;
+  }
+  .box-card {
+    width: 480px;
+    text-align: center;
+    margin-left:320px;
+  }
+  
+  </style>
+  

+ 7 - 7
src/views/home/index.vue

@@ -27,7 +27,7 @@
               alt=""
             />
             <h3>
-              <span>{{ item.Title }}</span
+              <span :title="item.Title">{{ item.Title }}</span
               ><span>{{ $methods.onlyFormaHao(item.CreateTime, false) }}</span>
             </h3>
           </el-carousel-item>
@@ -42,7 +42,7 @@
               :key="index"
               @click="jumpInfo(item)"
             >
-              <div class="tit">
+              <div class="tit" :title="item.Title">
                 {{ item.Title }}
               </div>
               <div class="time">
@@ -62,7 +62,7 @@
           </el-pagination>
         </div>
       </div>
-      <div style="text-align: center">
+      <!-- <div style="text-align: center">
         <el-button
           type="text"
           style="font-size: 24px"
@@ -73,7 +73,7 @@
           "
           >广州市住房和城乡建设局</el-button
         >
-      </div>
+      </div> -->
 
       <div class="tabs_box">
         <ul class="tabs_ul">
@@ -95,7 +95,7 @@
               :key="index"
               @click="jumpInfo(item)"
             >
-              <div class="tit">
+              <div class="tit" :title="item.Title">
                 {{ item.Title }}
               </div>
               <div class="time">
@@ -110,7 +110,7 @@
               :key="index"
               @click="jumpInfo(item)"
             >
-              <div class="tit">
+              <div class="tit" :title="item.Title">
                 {{ item.Title }}
               </div>
               <div class="time">
@@ -211,7 +211,7 @@ export default {
         { label: "政策要闻", value: "d1" },
         { label: "通知公告", value: "d2" },
         { label: "协会动态", value: "d3" },
-        { label: "行业报告", value: "d4" },
+        // { label: "行业报告", value: "d4" },
       ],
       apiList: {
         d0: [],

+ 21 - 1
src/views/info/index.vue

@@ -24,6 +24,10 @@
           style="white-space: pre-wrap; height: auto"
           v-html="infoData.NewContent"
         ></div>
+        <!-- <iframe  width="300" height="150" src="https://vd2.bdstatic.com/mda-qhqg3srt259va7kw/sc/cae_h264/1724585025596798358/mda-qhqg3srt259va7kw.mp4">
+          <video controls="controls" width="300" height="150" src="https://vd2.bdstatic.com/mda-qhqg3srt259va7kw/sc/cae_h264/1724585025596798358/mda-qhqg3srt259va7kw.mp4" type="video/mp4"></video>
+        </iframe> -->
+        
         <div class="last_next" v-if="last || next">
           <p v-if="last" @click="jumpInfo(last)">
             上一篇<span>{{ last.Title }}</span>
@@ -72,7 +76,7 @@ export default {
       last: null,
       next: null,
       config: {
-        url: window.location.href, // 网址,默认使用 window.location.href
+        url:'https://sj.gzjsfx.com'+ window.location.pathname+ window.location.search, // 网址,默认使用 window.location.href
         source: "", // 来源(QQ空间会用到), 默认读取head标签:<meta name="site" content="http://overtrue" />
         title: "", // 标题,默认读取 document.title 或者 <meta name="title" content="share.js" />
         description: "", // 描述, 默认读取head标签:<meta name="description" content="PHP弱类型的实现原理分析" />
@@ -108,6 +112,19 @@ export default {
       //获取侧边栏列表
       this.getList();
       console.log(window.location.href, "href");
+      // var vlist=document.querySelectorAll("video");
+      // for(var i =0;i<vlist;i++)
+      // {
+      //    var h1=vlist[i].height;
+      //    var w1=vlist[i].width;
+      
+      // }
+      // var iframe = document.createElement('iframe');
+      //       iframe['src'] = "https://vd2.bdstatic.com/mda-qhqg3srt259va7kw/sc/cae_h264/1724585025596798358/mda-qhqg3srt259va7kw.mp4";
+      //       iframe['width'] = 580;
+      //       iframe['height'] = 434;
+      //       document.body.appendChild(iframe);
+      //       return;
     },
     getHeaderTitleData() {
       this.$api
@@ -183,6 +200,7 @@ export default {
     margin: 0 auto;
     display: block;
   }
+  ::v-deep strong span{font-weight: bold !important;}
 }
 .dis_play {
   display: flex;
@@ -274,4 +292,6 @@ export default {
     }
   }
 }
+i, u, b, em, span, small{font-weight: unset !important;}
+.html_content > strong span{font-weight: bold !important;}
 </style>

+ 1 - 1
src/views/searchKey/index.vue

@@ -9,7 +9,7 @@
             :key="index"
             @click="jumpInfo(item)"
           >
-            <div class="title_li">{{ item.Title }}</div>
+            <div class="title_li" :title="item.Title">{{ item.Title }}</div>
             <div class="time_li">
               {{ $methods.onlyFormaHao(item.CreateTime) }}
             </div>

BIN
学员信息.xlsx


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác