rkljw 7 месяцев назад
Родитель
Сommit
8cf3f4a3b7

+ 16 - 0
src/api/public.js

@@ -29,4 +29,20 @@ export default {
   getCityList (parames) {
       return request.get("/public/getCityList",parames)
   },
+  //获取投诉列表
+  getComplaint(parames) {
+    return request.get("/public/getComplaint",parames)
+  },
+  //获取投诉分类列表
+  getLetterType(parames) {
+    return request.get("/public/getLetterType",parames)
+  },
+  //更新投诉举报信息
+  upComplaint(parames) {
+    return request.get("/public/upComplaint",parames)
+  },
+  //下载文件
+  downloadFile(parames) {
+    return request.get("/public/downloadFile",parames)
+  },
 }

+ 21 - 0
src/router/index.js

@@ -159,6 +159,27 @@ const routes = [{
                 component: () =>
                     import ('@views/chat/index.vue')
             } ,
+            {
+                meta: {
+                    action: "complaintList",
+                    title: '投诉列表'
+                },
+                path: 'complaintList',
+                name: 'complaintList',
+                component: () =>
+                    import ('@views/complaint/index.vue')
+            } ,
+            {
+                meta: {
+                    action: "complaintCategory",
+                    title: '投诉分类'
+                },
+                path: 'complaintCategory',
+                name: 'complaintCategory',
+                component: () =>
+                    import ('@views/complaintCategory/index.vue')
+            } ,
+
            
         ]
     },

+ 6 - 24
src/utils/config.js

@@ -6,39 +6,21 @@ export let appKey
 console.log('判断接口地址',process.env.NODE_ENV, process.env)
 if (process.env.NODE_ENV) {
     if (process.env.VUE_APP_FLAG == 'development') {
-<<<<<<< HEAD
-        reqSmbUrl = 'http://192.168.1.102:9501'
-        appKey = 'cpj2xarlcmmpn'
-       
-    } else if (process.env.VUE_APP_FLAG == 'test') {
-        reqSmbUrl = 'http://192.168.1.102:9501'
-        appKey = 'cpj2xarlcmmpn'
-       
-    } else if (process.env.VUE_APP_FLAG == 'uat') {
-        reqSmbUrl = 'http://192.168.1.102:9501'
-        appKey = 'pkfcgjstp8zy8'
-        
-    } else if (process.env.VUE_APP_FLAG == 'testsec') {
-        reqSmbUrl = 'http://192.168.1.102:9501'
-=======
-        reqSmbUrl = 'http://192.168.1.193:9501'
-        websocketUrl = 'ws://192.168.1.193:9506'
+
+        reqSmbUrl = 'http://192.168.1.111:9501'
         appKey = 'cpj2xarlcmmpn'
        
     } else if (process.env.VUE_APP_FLAG == 'test') {
-        reqSmbUrl = 'http://192.168.1.193:9501'
-        websocketUrl = 'ws://192.168.1.193:9506'
+        reqSmbUrl = 'http://192.168.1.111:9501'
         appKey = 'cpj2xarlcmmpn'
        
     } else if (process.env.VUE_APP_FLAG == 'uat') {
-        reqSmbUrl = 'http://192.168.1.193:9501'
-        websocketUrl = 'ws://192.168.1.193:9506'
+        reqSmbUrl = 'http://192.168.1.111:9501'
         appKey = 'pkfcgjstp8zy8'
         
     } else if (process.env.VUE_APP_FLAG == 'testsec') {
-        reqSmbUrl = 'http://192.168.1.193:9501'
-        websocketUrl = 'ws://192.168.1.193:9506'
->>>>>>> 2260fe8b50d15849a1178fe770c9b1bba517afb6
+        reqSmbUrl = 'http://192.168.1.111:9501'
+
         appKey = 'cpj2xarlcmmpn'
         
     } else if (process.env.VUE_APP_FLAG == 'prod') {

+ 394 - 0
src/views/complaint/components/edit.vue

@@ -0,0 +1,394 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="标题:"
+      >
+      {{ form.title }}
+      </el-form-item>
+      <el-form-item label="性质:"  prop="nature">
+            <el-select v-model="form.nature" clearable  placeholder="请选择" @change="ChangeNature">
+              <el-option
+                v-for="item in NatureList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="进度:" prop="nature_level">
+            <el-select v-model="form.nature_level" clearable  placeholder="请选择">
+              <el-option
+                v-for="item in NatureLevelList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="类型:" prop="type">
+            <el-select v-model="form.type" clearable  placeholder="请选择" @change="ChangeType">
+              <el-option
+                v-for="item in LetterTypeList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="类型说明:" prop="type_level">
+            <el-select v-model="form.type_level" clearable  placeholder="请选择">
+              <el-option
+                v-for="item in LetterTypeLeveList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+      <el-form-item
+          label="详细说明:"
+      >
+      {{ form.describe }}
+      </el-form-item>
+      <el-form-item
+          label="判决书:"
+      >
+        <el-button v-if="form.judgment!=null" type="primary"   size="mini" round @click="download(form.judgment,'判决书')">下载</el-button>
+      </el-form-item>
+      <el-form-item
+          label="录音录像:"
+      >
+        <el-button v-if="form.audio_and_video!=null" type="primary"   size="mini" round @click="download(form.audio_and_video,'录音录像')">下载</el-button>
+      </el-form-item>
+      <el-form-item
+          label="合同:"
+      >
+         <el-button v-if="form.contract!=null" type="primary"   size="mini" round @click="download(form.contract,'合同')">下载</el-button>
+      </el-form-item>
+      <el-form-item
+          label="资质:"
+      >
+       <el-button v-if="form.qualifications!=null" type="primary"   size="mini" round @click="download(form.qualifications,'资质')">下载</el-button>
+      </el-form-item>
+      <el-form-item
+          label="涉案标的额:"
+      >
+      {{ form.money }}
+      </el-form-item>
+      <el-form-item
+          label="姓名:"
+      >
+      {{ form.name }}
+      </el-form-item>
+      <el-form-item
+          label="身份证号:"
+      >
+      {{ form.id_card }}
+      </el-form-item>
+      <el-form-item
+          label="你最想:"
+      >
+      {{ form.like_remark }}
+      </el-form-item>
+     
+      <!---1通过,2待审核,3待发 4,拒绝 5删除-->
+      <el-form-item
+          label="状态:"
+          prop="status"
+      >
+      <el-radio-group v-model="form.status">
+          <el-radio
+           v-for="item in this.StatusList"   
+           :key = "item.id"
+           :label="item.id">{{ item.type_name }}</el-radio>
+      </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          label="备注信息:"
+      >
+        <el-input v-model="form.reason"  maxlength="50" placeholder="备注信息"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <div style="text-align: center">
+          <el-button type="primary" @click="onSubmit" :disabled="Isdisabled" :loading="isloading">保存</el-button>
+          <el-button style="color: #5075FC " @click="closeDlg">取消</el-button>
+        </div>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+import Editor from "../../../components/editor/Editor";
+export default {
+  components: {
+        Editor
+    },
+  props: {
+    ArticleDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+  },
+  data() {
+    return {
+      NatureLevelList:[],//;性质进度
+      LetterTypeList:[],//类型列表
+      LetterTypeLeveList:[],//类型说明列表
+      NatureList:[], //性质列表
+      StatusList:[], //状态列表
+      form: {
+ 
+      },
+ 
+      Isdisabled: false,
+      rules: {
+        status: [
+          { required: true, message: '请选择状态' },
+        ],
+        nature: [
+          { required: true, message: '请选择性质' },
+        ],
+        nature_level: [
+          { required: true, message: '请选择进度' },
+        ],
+        type_level: [
+          { required: true, message: '请选择类型说明' },
+        ],
+        type: [
+          { required: true, message: '请选择类型' },
+        ]
+      },
+      tagInput: '',
+      tags: [],
+      value:''
+    }
+  },
+  mounted() {
+    if(this.ArticleDataForm) {
+      this.form = Object.assign({} , this.ArticleDataForm)
+    }
+
+    this.getStatusList();
+    this.getNatureList();
+    this.getTypeList();
+  },
+  methods: {
+    ChangeNature(){
+      let _t = this;
+      
+      _t.NatureList.forEach(item => {
+          if(item.id==_t.form.nature){
+            if(item.children){
+              _t.NatureLevelList = item.children
+            }else{
+              _t.NatureLevelList = []
+             
+            }
+             _t.form.nature_level =''
+           
+          }
+        });
+        console.log( _t.form.nature_level)
+        console.log(_t.NatureLevelList)
+      },
+      ChangeType(){
+      let _t = this;
+      
+      _t.LetterTypeList.forEach(item => {
+          if(item.id==_t.form.type){
+            if(item.children){
+              _t.LetterTypeLeveList = item.children
+            }else{
+              _t.LetterTypeLeveList = []
+             
+            }
+             _t.form.type_level =''
+           
+          }
+        });
+
+      },
+    getNatureList:function(){
+        let _t = this;
+        let parames = {
+            'type':1,
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getLetterType(parames).then(res=>{
+              
+                if(res.code==200){
+                  if(res.data.length==0){
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                    _t.NatureList = res.data;
+                    _t.NatureList.forEach(item => {
+                  if(item.id==_t.form.nature){
+                     _t.NatureLevelList = item.children
+                    }
+                  });
+                  console.log(_t.NatureList);
+                 
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      getTypeList:function(){
+        let _t = this;
+        let parames = {
+            'type':2,
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getLetterType(parames).then(res=>{
+                if(res.code==200){
+                  if(res.data.length==0){
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                  _t.LetterTypeList = res.data;
+                  console.log("fuck",_t.form.type,_t.LetterTypeList)
+
+                  _t.LetterTypeList.forEach(item => {
+                      console.log("测试:",item.id,_t.form.type)
+                    if(item.id == _t.form.type){
+                      _t.LetterTypeLeveList = item.children
+                      }
+                  });
+                    console.log("打印数据:",_t.LetterTypeLeveList,_t.form.type_level)
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+    handelIncrease(step) {
+          console.log("step====:",step)
+          this.form.content = step
+    },
+    closeDlg() {
+      console.log("edit提交")
+      this.$emit('closeDlg',1)
+    },
+    onSubmit() {
+      let that = this
+      
+      that.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.form.tag = that.tags
+          this.$emit('ArticleSubmitClick', this.form)
+        }
+      })
+    },
+    getStatusList:function(){
+        let _t = this;
+        let parames = {
+            'type':10,
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getLetterType(parames).then(res=>{
+                if(res.code==200){
+                  if(res.data.length==0){
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                  _t.StatusList = res.data;
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      download(file,fileName=''){
+        let _t = this;
+        let parames = {
+            'files':file,
+            'fileName':fileName
+        }
+
+        this.$api.publicApi.downloadFile(parames).then(res=>{
+                if(res.code==200){
+                  this.$message.success('下载中......')
+                  window.location.href = res.data.fileUrl
+                }else{
+                    this.$message.error('下载失败')
+                }
+            })
+      }
+
+  }
+}
+</script>
+<style>
+.el-cascader-node>.el-radio{
+  margin-top:25px;
+}
+</style>
+
+<style lang="less" scoped>
+
+.uploadImg {
+  width: 110px;
+  height: 100px;
+  border: 1px solid #F8F8F8;
+  border-radius: 4px;
+  cursor:pointer;
+  position: absolute;
+  top: 0;
+}
+.inputIcon {
+  width: 110px;
+  height: 100px;
+  position: relative;
+  opacity: 0;
+}
+.uploadImg_warp {
+  width: 100%;
+  height: 100%;
+  display:flex ;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+.uploadImg_img {
+  height: 32px;
+}
+.footerBotton {
+  text-align: center;
+}
+.avatar-uploader {
+  width: 110px;
+  height: 110px;
+  border: 1px solid #F8F8F8;
+  border-radius: 4px;
+  position: relative;
+}
+.el-icon-plus {
+  width: 110px;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%,-50%);
+}
+.el-icon-plus-icon {
+  display: block;
+  margin-bottom: 15px;
+}
+.el-icon-plus-up {
+  color: #222222;
+  font-size: 12px;
+  line-height: 17px;
+  font-weight: 400;
+}
+/deep/ .el-radio {
+  line-height: 40px;
+}
+</style>
+
+

+ 400 - 0
src/views/complaint/index.vue

@@ -0,0 +1,400 @@
+<template>
+    <div class="main-content__div">
+      <div class="table-box__div" v-cloak v-loading="loadingFlag">
+        <el-form  class="demo-form-inline">
+          <el-form-item label="性质">
+            <el-select v-model="natureID" clearable  placeholder="请选择" @change="ChangeNature">
+              <el-option
+                v-for="item in NatureList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="进度">
+            <el-select v-model="natureLevelID" clearable  placeholder="请选择">
+              <el-option
+                v-for="item in NatureLevelList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="类型">
+            <el-select v-model="letterTypeID" clearable  placeholder="请选择" @change="ChangeType">
+              <el-option
+                v-for="item in LetterTypeList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="类型说明">
+            <el-select v-model="typeLevelID" clearable  placeholder="请选择">
+              <el-option
+                v-for="item in LetterTypeLevelList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="状态">
+            <el-select v-model="statusID" clearable  placeholder="请选择">
+              <el-option
+                v-for="item in StatusList"
+                :key="item.id"
+                :label="item.type_name"
+                :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+           <!-- 搜索按钮 -->
+           <el-form-item>
+            <el-button type="primary" size="small" @click="searchFrom()">搜索</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <!-- 列表 -->
+      <div class="table-box__div" v-cloak v-loading="loadingFlag">
+      
+        <el-table
+          size="mini"
+          :data="tableData"
+          :empty-text="tableDataLoadingText"
+          style="width: 100%;font-size: 15px;"
+          :header-cell-style="{background:'#FAFAFA'}"
+        >
+          <el-table-column label="编号" width="100" prop="id"></el-table-column>
+          <el-table-column label="标题" prop="title" width="250"></el-table-column>
+          <el-table-column label="性质" prop="nature_name" width="100"></el-table-column>
+          <el-table-column label="进度" prop="nature_level_name" width="100"></el-table-column>
+          <el-table-column label="类型" prop="type_name" width="100"></el-table-column>
+          <el-table-column label="类型说明" prop="type_level_name" width="100"></el-table-column>  
+          <el-table-column label="判决书"  width="80">
+            <template  v-slot="scope">
+              <div v-if="scope.row.judgment">有</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="录音录像" prop="audio_and_video" width="100">
+            <template v-slot="scope">
+                <div v-if="scope.row.audio_and_video">有</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="合同" prop="contract" width="50">
+            <template v-slot="scope">
+              <div v-if="scope.row.contract">有</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="资质" prop="qualifications" width="50">
+            <template v-slot="scope">
+              <div v-if="scope.row.qualifications">有</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="涉案标的额" prop="money" width="150"></el-table-column>
+          <el-table-column label="姓名" prop="name" width="100"></el-table-column>
+          <el-table-column label="电话" prop="mobile" width="120"></el-table-column>
+          <el-table-column label="状态" prop="status_name" width="100"></el-table-column>
+          <el-table-column label="创建时间" prop="created_at" width="200"></el-table-column>
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="150">
+                  <template v-slot="scope">
+                    <div style="display: flex;flex-direction: row;justify-content: center;align-items: center;">
+                      <!-- <span class="btn"  @click="updateClick(scope.row, scope.$index)">详情</span> -->
+                      <span class="btn"  @click="updateClick(scope.row, scope.$index)">编辑</span>
+                    </div>
+                  </template>
+                </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <div class="block" v-show="pagination" style="margin-top: 10px;float: right;">
+          <el-pagination
+            background
+            @current-change="handleCurrentChange"
+            :current-page="currentPage"
+            :page-size="pageSize"
+            layout="total, prev, pager, next, jumper"
+            :total="parseInt(tableCount)">
+          </el-pagination>
+        </div>
+      </div>
+    </div>
+  <Dialog title="温馨提示" content="您确认要删除该资讯吗?"
+          @close="DialogShow = false"
+          @submitSureClick="submitSureClickDel"
+          @DialogFalse="DialogShow = false"
+          :innerVisible="DialogShow">
+  </Dialog>
+  <DialogSlot
+      title="编辑"
+      @close="ArticleDialogShow = false"
+      @DialogClose="ArticleDialogShow = false"
+      :innerVisible="ArticleDialogShow"
+      @colesClick="ArticleDialogShow  = false"
+  >
+    <editFrom
+        @colesClick="ArticleDialogShow = false"
+        :ArticleDataForm="ArticleDataForm"
+         :isloading="isloading"
+        @ArticleSubmitClick="ArticleSubmitClick"
+        @closeDlg="closeDlg"
+        >
+    </editFrom>
+  </DialogSlot>
+  </template>
+  <script>
+  import Dialog from "../../components/dialog";
+  import editFrom from "./components/edit";
+  import DialogSlot from "../../components/DialogSlot";
+  export default {
+    components: {
+      Dialog,
+      editFrom,
+      DialogSlot
+    },
+    data() {
+      return {
+        statusID:'',
+        letterTypeID:'',
+        typeLevelID:'',
+        natureLevelID:'',
+        natureID:'',
+        NatureLevelList:[],//;性质进度
+        LetterTypeList:[],//类型列表
+        LetterTypeLevelList:[],
+        NatureList:[], //性质列表
+        StatusList:[], //状态列表
+        //  分类列表数据
+        tableData: [],
+        //  加载中数据提示
+        tableDataLoadingText:"拼命加载中······",
+        //  是否显示分页
+        pagination:false,
+        //  每页显示的条数
+        pageSize:10,
+        //  当前页
+        currentPage:1,
+        //  分类列表数据总条数
+        tableCount:0,
+  
+        loadingFlag: false,
+        isShowSource: false, // 是否显示来源列
+        id:0,
+        DialogShow: false, //控制删除弹窗
+        ArticleDataForm: {},
+        ArticleTableData: [],
+        isloading:false, //提交按钮状态
+        ArticleDialogShow: false, // 控制保存弹窗
+        pid:0,
+        keyword:''
+      }
+    },
+    mounted() {
+     
+    },
+    methods: {
+      ChangeNature(){
+        this.NatureList.forEach(item => {
+          if(item.id==this.natureID){
+            this.NatureLevelList = item.children
+          }
+        });
+        this.natureLevelID = ''
+      },
+      ChangeType(){
+        this.LetterTypeList.forEach(item => {
+          if(item.id==this.letterTypeID){
+            this.LetterTypeLevelList = item.children
+          }
+        });
+        this.typeLevelID = ''
+      },
+      // 获取投诉列表信息
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'nature':this.natureID,
+            'nature_level':this.natureLevelID,
+            'type':this.letterTypeID,
+            'status':this.statusID,
+           
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getComplaint(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  if(res.data.rows.length==0){
+                    _t.tableData = [];
+                    _t.tableCount = 0;
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                    _t.tableData = res.data.rows;
+                    _t.tableCount = res.data.count;
+                     //总条数大于每页显示的条数时显示分页
+                    if( _t.tableCount > _t.pageSize ){
+                     _t.pagination = true;
+                    }
+                    if( _t.tableData.length==0 ){
+                     _t.tableDataLoadingText = "暂无数据";
+                    }
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      getNatureList:function(){
+        let _t = this;
+        let parames = {
+            'type':1,
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getLetterType(parames).then(res=>{
+              
+                if(res.code==200){
+                  if(res.data.length==0){
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                    _t.NatureList = res.data;
+
+                    console.log(_t.NatureList);
+                 
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      getTypeList:function(){
+        let _t = this;
+        let parames = {
+            'type':2,
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getLetterType(parames).then(res=>{
+                if(res.code==200){
+                  if(res.data.length==0){
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                  _t.LetterTypeList = res.data;
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      getStatusList:function(){
+        let _t = this;
+        let parames = {
+            'type':10,
+        }
+        console.log("参数:",parames)
+        this.$api.publicApi.getLetterType(parames).then(res=>{
+                if(res.code==200){
+                  if(res.data.length==0){
+                    this.$message.error("还没有数据")
+                    return
+                  }
+                  _t.StatusList = res.data;
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      // 点击翻页
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getList();
+      },
+      // 查看下一级
+      nextClick( id ){
+        let _t = this;
+        _t.id = id
+        _t.currentPage = 1
+        _t.pageSize = 10
+       this.getList()
+      },
+      addClick(){
+        this.ArticleDataForm = {}
+        this.ArticleDialogShow = true
+      },
+      //更新分类
+      updateClick(row,index){
+        console.log(row)
+        this.ArticleDataForm = row
+        this.rowIndex = index
+        this.ArticleDialogShow = true
+      },
+      // ArticleDialogShow(){
+      //   this.isloading = false
+      // },
+      closeDlg(val){
+          this.ArticleDialogShow = false
+          this.isloading = false
+      },
+      ArticleSubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        parames.is_admin = 1
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.publicApi.upComplaint(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                     this.getList()
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.ArticleDialogShow = false
+                this.isloading = false
+            })
+        }else{
+          this.$api.news.addArticle(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                    this.getList()
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.ArticleDialogShow = false
+                this.isloading = false
+            })
+        }
+       
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      },
+
+
+    },
+    created() {
+        this.pid = this.$route.params.Id;
+        this.getList();
+        this.getNatureList();
+        this.getTypeList();
+        this.getStatusList();
+    }
+  }
+  </script>
+  
+  <style >
+  .demo-form-inline{
+      display: flex;
+  }
+  .demo-form-inline .el-form-item{
+    margin: 0 20px;
+  }
+  </style>

+ 126 - 0
src/views/complaintCategory/components/edit.vue

@@ -0,0 +1,126 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="分类名称:"
+          prop="name"
+      >
+        <el-input v-model="form.name"  maxlength="50" placeholder="请输入分类名称"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="父级名称:"
+          prop="pid"
+      >
+      <el-cascader
+      v-model="form.pid"
+      :options="Categorylist"
+      :props="{
+                checkStrictly: true,
+                value:'id',
+                label:'name',
+                children:'children',
+              }" 
+      clearable></el-cascader>
+    </el-form-item>
+
+      <el-form-item label="排序:" prop="sort">
+        <el-input v-model.number="form.sort"  placeholder="输入排序" ></el-input>
+      </el-form-item>
+      <el-form-item label="seo-标题:" prop="seo_title">
+        <el-input v-model="form.seo_title" maxlength="50" placeholder="输入标题" ></el-input>
+      </el-form-item>
+      <el-form-item label="seo-关键字:" prop="seo_keywords">
+        <el-input  type="textarea" v-model="form.seo_keywords"  maxlength="30"
+        show-word-limit  placeholder="输入关键字" ></el-input>
+      </el-form-item>
+      <el-form-item label="seo-描述:" prop="seo_description">
+        <el-input  type="textarea" v-model="form.seo_description" maxlength="80"
+        show-word-limit  placeholder="输入描述" ></el-input>
+      </el-form-item>
+      <el-form-item>
+        <div style="text-align: center">
+          <el-button type="primary" @click="onSubmit" :disabled="Isdisabled" :loading="isloading">保存</el-button>
+          <el-button style="color: #5075FC " @click="closeDlg">取消</el-button>
+        </div>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    CategoryDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+  },
+  data() {
+    return {
+      form: {
+        name: '',
+        pid:"",
+        icon:"",
+        sort:"",
+        is_links:"",
+        hidden:"",
+        pid:[0]
+      },
+      Categorylist: [],
+      Isdisabled: false,
+      rules: {
+        label: [
+          { required: true, message: '分类名称必填' },
+        ],
+        sort: [
+          { pattern: /^[0-9]\d*$/, message: '排序值格式错误' },
+        ]
+      }
+    }
+  },
+  mounted() {
+    if(this.CategoryDataForm) {
+      this.form = Object.assign({} , this.CategoryDataForm)
+    }
+    this.getRecursionCategory()
+  },
+  methods: {
+    closeDlg() {
+      console.log("edit提交")
+      this.$emit('closeDlg',1)
+    },
+    onSubmit() {
+      let that = this
+      that.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.$emit('CategorySubmitClick', this.form)
+        }
+      })
+    },
+    getRecursionCategory(){
+      let _t= this
+      let parames = {}
+      this.$api.news.categoryList(parames).then(res=>{
+                if(res.code==200){
+          
+                  _t.Categorylist = res.data
+                }else{
+                    this.$message.error("查询失败")
+                }
+            })
+    },
+    
+  }
+}
+</script>
+<style>
+.el-cascader-node>.el-radio{
+  margin-top:25px;
+}
+</style>

+ 272 - 0
src/views/complaintCategory/index.vue

@@ -0,0 +1,272 @@
+<template>
+    <div class="main-content__div">
+      <div class="table-box__div" v-cloak v-loading="loadingFlag">
+        <el-form  class="demo-form-inline">
+          <el-form-item label="分类名称">
+            <el-input
+              placeholder="分类名称"
+              v-model="keyword"
+              style="width:150px;"
+              size="small"
+              >
+            </el-input>
+          </el-form-item>
+          
+          <!-- 搜索按钮 -->
+          <el-form-item>
+            <el-button type="primary" size="small" @click="searchFrom()">搜索</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <!-- 列表 -->
+      <div class="table-box__div" v-cloak v-loading="loadingFlag">
+        <!-- 查询表单 -->
+        <el-form :inline="true" class="demo-form-inline">
+          <el-form-item>
+            <el-button type="primary" size="small" @click="addClick">添加分类</el-button>
+          </el-form-item>
+        
+        </el-form>
+        <el-table
+          size="mini"
+          :data="tableData"
+          :empty-text="tableDataLoadingText"
+          style="width: 100%;font-size: 15px;"
+          :header-cell-style="{background:'#FAFAFA'}"
+        >
+          <el-table-column label="编号" width="150" prop="id"></el-table-column>
+          <el-table-column label="分类名称" prop="name" width="250"></el-table-column>
+          <el-table-column label="排序" prop="sort" width="200"></el-table-column>
+          <el-table-column label="创建时间" prop="created_at" width="200"></el-table-column>
+          <el-table-column label="更新时间" prop="updated_at" width="200"></el-table-column>
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="200">
+                  <template v-slot="scope">
+                    <div style="display: flex;flex-direction: row;justify-content: center;align-items: center;">
+                      <span class="btn "  @click="nextClick(scope.row.id)">查看下级</span>
+                      <span class="btn"  @click="updateClick(scope.row, scope.$index)">编辑</span>
+                      <span class="btn"  @click="deleteAuthority(scope.row,scope.$index)">删除</span>
+                    </div>
+                  </template>
+                </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <div class="block" v-show="pagination" style="margin-top: 10px;float: right;">
+          <el-pagination
+            background
+            @current-change="handleCurrentChange"
+            :current-page="currentPage"
+            :page-size="pageSize"
+            layout="total, prev, pager, next, jumper"
+            :total="parseInt(tableCount)">
+          </el-pagination>
+        </div>
+      </div>
+    </div>
+  <Dialog title="温馨提示" content="您确认要删除该分类吗?"
+          @close="DialogShow = false"
+          @submitSureClick="submitSureClickDel"
+          @DialogFalse="DialogShow = false"
+          :innerVisible="DialogShow">
+  </Dialog>
+  <DialogSlot
+      title="添加/编辑"
+      @close="CategoryDialogShow = false"
+      @DialogClose="CategoryDialogShow = false"
+      :innerVisible="CategoryDialogShow"
+      @colesClick="CategoryDialogShow  = false"
+  >
+    <editFrom
+        @colesClick="CategoryDialogShow = false"
+        :CategoryDataForm="CategoryDataForm"
+         :isloading="isloading"
+        @CategorySubmitClick="CategorySubmitClick"
+        @closeDlg="closeDlg"
+        >
+    </editFrom>
+  </DialogSlot>
+  </template>
+  <script>
+  import Dialog from "../../components/dialog";
+  import editFrom from "./components/edit";
+  import DialogSlot from "../../components/DialogSlot";
+  export default {
+    components: {
+      Dialog,
+      editFrom,
+      DialogSlot
+    },
+    data() {
+      return {
+        value:"1",
+        //  分类列表数据
+        tableData: [],
+        //  加载中数据提示
+        tableDataLoadingText:"拼命加载中······",
+        //  是否显示分页
+        pagination:false,
+        //  每页显示的条数
+        pageSize:10,
+        //  当前页
+        currentPage:1,
+        //  分类列表数据总条数
+        tableCount:0,
+  
+        loadingFlag: false,
+        isShowSource: false, // 是否显示来源列
+        id:0,
+        DialogShow: false, //控制删除弹窗
+        CategoryId:'',
+        CategoryRowIndex:'',
+        CategoryDataForm: {},
+        CategoryTableData: [],
+        isloading:false, //提交按钮状态
+        CategoryDialogShow: false, // 控制保存弹窗
+        pid:0,
+        keyword:''
+      }
+    },
+    mounted() {
+     
+    },
+    methods: {
+      // 获取分类信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'pid':this.id,
+            'keyWord':this.keyword
+        }
+        console.log("参数:",parames)
+        this.$api.news.getCategoryList(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  if(res.data.rows.length==0){
+                    this.$message.error("没有下级了,休息一下吧!!!")
+                    return
+                  }
+                    _t.tableData = res.data.rows;
+                    _t.tableCount = res.data.count;
+                     //总条数大于每页显示的条数时显示分页
+                    if( _t.tableCount > _t.pageSize ){
+                     _t.pagination = true;
+                    }
+                    if( _t.tableData.length==0 ){
+                     _t.tableDataLoadingText = "暂无数据";
+                    }
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+      },
+      // 点击翻页
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getList();
+      },
+      // 查看下一级
+      nextClick( id ){
+        let _t = this;
+        _t.id = id
+        _t.currentPage = 1
+        _t.pageSize = 10
+       this.getList()
+      },
+      addClick(){
+        this.CategoryDataForm = {}
+        this.CategoryDialogShow = true
+      },
+      //更新分类
+      updateClick(row,index){
+        console.log(row)
+        this.CategoryDataForm = row
+        this.rowIndex = index
+        this.CategoryDialogShow = true
+      },
+      // CategoryDialogShow(){
+      //   this.isloading = false
+      // },
+      closeDlg(val){
+          this.CategoryDialogShow = false
+          this.isloading = false
+      },
+      CategorySubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.news.updateCategory(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                     location.reload();
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.CategoryDialogShow = false
+                this.isloading = false
+            })
+        }else{
+          this.$api.news.addCategory(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                     location.reload();
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.CategoryDialogShow = false
+                this.isloading = false
+            })
+        }
+       
+      },
+      //删除分类
+      deleteAuthority(row, index) {
+        this.CategoryId = row.id
+        this.CategoryRowIndex = index
+        this.DialogShow = true
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      },
+      submitSureClickDel(row,index){
+        let _t = this
+        let parames = {
+          'id':this.CategoryId
+        }
+        this.$api.news.delCategory(parames).then(res=>{
+          if(res.code==200){
+            this.DialogShow = false
+            _t.tableData.splice(index, 1);
+            // row.splice(index, 1);
+            this.getList()
+          }else{
+            this.$message.error(res.message)
+          }
+        })
+      }
+
+    },
+    created() {
+        this.pid = this.$route.params.Id;
+        this.getList();
+    }
+  }
+  </script>
+  
+  <style >
+  .demo-form-inline{
+      display: flex;
+  }
+  .demo-form-inline .el-form-item{
+    margin: 0 20px;
+  }
+  </style>

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

@@ -82,7 +82,7 @@
         // 注意:为了简单起见,这里没有直接实现这个逻辑  
 
         this.$api.pub.verifyCode().then(res=>{
-            this.imgUrl = res
+            this.imgUrl = res.data
         })
       }  
     },

+ 10 - 3
src/views/member/components/addEdit.vue

@@ -7,7 +7,8 @@
         >
           <el-radio-group v-model="type_id" >
                 <el-radio :label="1">个人会员</el-radio>
-                <el-radio :label="2">政务会员</el-radio>
+                <el-radio :label="2">政务会员</el-radio>  
+                <el-radio :label="4">调研员</el-radio>
                 <!-- <el-radio :label="3">企业会员</el-radio> -->
          </el-radio-group>
         </el-form-item>
@@ -16,7 +17,8 @@
         </Personal>
          <GovernmentAffairs     v-if="type_id==2 && !this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick"     @closeDlg="closeDlg"   >
         </GovernmentAffairs>
-
+        <Researcher     v-if="type_id==4 && !this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick" @closeDlg="closeDlg">
+        </Researcher>
         <!--修改-->
         <PersonalEdit     v-if="type_id==1 && this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick" @closeDlg="closeDlg">
         </PersonalEdit>
@@ -32,8 +34,11 @@
     // import Enterprise from "./enterprise";
     import GovernmentAffairs from "./governmentAffairs";
     import Personal from "./personal";
+    import Researcher from "./researcher";
+    
     import GovernmentAffairsEdit from "./governmentAffairsEdit";
     import PersonalEdit from "./personalEdit";
+    import ResearcherEdit from "./researcherEdit";
   export default {
     props: {
       memberDataForm: {
@@ -54,11 +59,13 @@
         Personal,
         GovernmentAffairsEdit,
         PersonalEdit,
+        Researcher,
+        ResearcherEdit
     },
     data() {
       let self = this
       return {
-        type_id:1
+        type_id:"4"
       }
     },
     mounted() {

+ 417 - 0
src/views/member/components/researcher.vue

@@ -0,0 +1,417 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="会员登录名:"
+          prop="user_name"
+      >
+        <el-input v-model="form.user_name"  placeholder="请输入会员登录名"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="调研员编号:"
+          prop="number"
+      >
+        <el-input v-model="form.number"  placeholder="请输入调研员编号"></el-input>
+      </el-form-item>
+      <el-form-item  prop="image_url"  >
+          <template v-slot:label >
+            <span  style="display: inline-block">用户头像:</span>
+            <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="建议大小:100px*100px  支持格式:jpg、gif、png"
+                placement="top"
+            >
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+            <span  style="display: inline-block">: </span>
+          </template>
+          <input
+              type="file"
+              class="inputIcon"
+              ref="upfile"
+              required
+              @change="beforeAvatarUpload"
+          />
+          <div class="uploadImg" @click="uploadSildeShowClick">
+              <div v-if="!form.avatar" class="uploadImg_warp">
+                <div class="uploadImg_img"><img src="@/assets/default_avatar.png"></div>
+                <span>点击上传</span>
+              </div>
+            <div v-else style="width: 100%; height: 100%;"><img :src="avatarUrl" style="width: 100%;height: 100%;"></div>
+          </div>
+        </el-form-item>
+
+      <el-form-item
+          label="昵称:"
+          prop="nickname"
+      >
+        <el-input v-model="form.nickname"  placeholder="请输入昵称"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="登录密码:"
+          prop="password"
+      >
+        <el-input v-model="form.password"  placeholder="请输入登录密码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="重复输入密码:"
+          prop="confirm_password"
+      >
+        <el-input v-model="form.confirm_password"  placeholder="重复输入密码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="真实名称:"
+          prop="real_name"
+      >
+        <el-input v-model="form.real_name"  placeholder="请输入真实名称"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="性别:"
+          prop="gender"
+      >
+        <el-radio-group v-model.number="form.gender" >
+          <el-radio :label="1">男</el-radio>
+          <el-radio :label="2">女</el-radio>
+         </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          label="状态:"
+          prop="status"
+      >
+        <el-radio-group v-model.number="form.status" >
+                <el-radio :label="0">待审核</el-radio>
+                <el-radio :label="1">正常</el-radio>
+                <el-radio :label="2">冻结</el-radio>
+         </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          label="手机号码 :"
+          prop="mobile"
+      >
+        <el-input v-model="form.mobile"  placeholder="请输入手机号码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="邮箱 :"
+          prop="email"
+      >
+        <el-input v-model="form.email"  placeholder="请输入邮箱"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="身份证号码 :"
+          prop="id_card"
+      >
+        <el-input v-model="form.id_card"  placeholder="请输入身份证号码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="会员等级:"
+          prop="level_id"
+      >
+      <el-select v-model="form.level_id" placeholder="请选择">
+        <el-option
+          v-for="item in levelList"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id">
+        </el-option>
+    </el-select>
+    </el-form-item>
+    <el-form-item
+          label="选择城市:"
+          prop="city_id"
+      >
+      <el-cascader
+          :key="cascaderKey"
+          v-model="form.city_id"
+          placeholder="选择您要绑定的城市"
+          :props="cityData"
+          filterable
+          clearable
+        ></el-cascader>
+
+    </el-form-item>
+
+      <el-form-item>
+        <div style="text-align: center">
+          <el-button type="primary" @click="onSubmit" :disabled="Isdisabled" :loading="isloading">保存</el-button>
+          <el-button style="color: #5075FC " @click="closeDlg">取消</el-button>
+        </div>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    memberDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: false
+    }
+  },
+  data() {
+    let self = this
+    return {
+      levelList:[],
+      cityData: {
+        checkStrictly: true,
+        lazy: true,
+        async lazyLoad (node, resolve) {
+          const { level, data } = node;  // 取出当前层级和选择数据
+          if (data && data.children && data.children.length !== 0) { // 提前加载数据切换后再点击回数据重复
+            return resolve(node)
+          }
+          console.log(level)
+          let parentId = level == 0 ? 0 : data.value
+          let parames = {
+            'pid':parentId
+          }
+          let res = await self.$api.publicApi.cityList(parames)
+          if (res.data) {
+            const nodes = res.data.map(item => ({
+              value: item.id,
+              label: item.name,
+              leaf: level >= 3,
+              children: []
+            }))
+            resolve(nodes)
+          }
+        }
+      },
+      form: {
+        avatar:'',
+        user_name:'',//用户名
+        nickname:'',//昵称
+        password:'',//密码
+        confirm_password:'',//重复密码
+        real_name:'',//真实姓名
+        gender:0,//性别
+        status:1,//状态
+        mobile:'',//手机号码
+        email:'',//邮箱
+        id_card:'',//身份证号码
+        level_id:1,//会员等级
+        city_id:[],//城市
+        number:''
+      },
+      cascaderKey:0,
+      avatarUrl:'',
+      menulist: [],
+      Isdisabled: false,
+      rules: {
+        user_name: [
+          { required: true, message: '用户名称必填' },
+          { validator: this.checkName, trigger: "blur" }
+        ],
+        number: [
+          { required: true, message: '调研员编号必填' },
+        ],
+        password: [
+          { required: true, message: '密码必填' },
+          { min: 6, max: 30, message: '长度在 6 到 30 个字符', trigger: 'blur' },
+        ],
+        confirm_password: [
+          { required: true, message: '重复密码必填' },
+          { validator: this.confirmPassword, trigger: "blur" }
+        ],
+        level_id: [
+          { required: true, message: '会员等级必填' }
+        ],
+        email:[
+           { message: '邮箱格式错误', type: 'email' },
+        ],
+        mobile:[
+          { required: true, message: '手机号码必填' },
+          {pattern: /^1[356789]\d{9}$/,message:'您输入的手机号格式有误'}
+        ]
+       
+      }
+    }
+  },
+  mounted() {
+    console.log("看看:",this.memberDataForm)
+    if(this.memberDataForm) {
+      this.form = Object.assign({} , this.memberDataForm)
+      // this.form.column_arr_id =  this.DataForm.column_arr_id
+    }
+
+    this.getLevelList()
+  },
+  methods: {
+    checkName(rule, value, callback) {
+      let _t= this
+      let parames = {
+          user_name:value
+      }
+      _t.$api.user.verifyUserInfo(parames).then(res=>{
+          if(res.code==200){
+            callback(new Error('用户名已存在'))
+          }
+          callback()
+      })
+    },
+    confirmPassword(rule, value, callback) {
+          if(value!=this.form.password){
+            callback(new Error('两次密码不一致'))
+          }
+          callback()
+    },
+    closeDlg() {
+      // this.isloading = false
+      console.log("关闭提交")
+      this.$emit('closeDlg',1)
+    },
+    onSubmit() {
+      console.log("==============")
+      let that = this
+      that.$refs['form'].validate((valid) => {
+        if (valid) {
+          console.log("测试:",this.form)
+          this.$emit('SubmitClick', this.form)
+        }
+      })
+    },
+    getLevelList(){
+      let _t= this
+      let parames = {}
+     this.$api.publicApi.getUserLevelList(parames).then(res=>{
+                if(res.code==200){
+                   console.log(res.data)
+                  _t.levelList = res.data
+                }else{
+                    this.$message.error("查询失败")
+                }
+            })
+    },
+    uploadSildeShowClick() {
+      this.$refs.upfile.value = ''
+      this.$refs.upfile.click()
+    },
+    beforeAvatarUpload(e) {
+      let than = this
+      let files = e.target.files[0]
+      let suffixName = files.name.substring(files.name.lastIndexOf('.') + 1);   /* 得到文件后缀名 */
+      if (suffixName !== 'jpg' && suffixName !== 'png' && suffixName !== 'jpeg' && suffixName !== 'gif' ) {
+        this.$message.warning("上传文件只能是 jpg、png、jpeg、gif 格式!");
+        // this.ishowFile = true
+        return;
+      }
+      this.verificationPicFile(files, () => this.fileAdd(files))
+    },
+    fileAdd(files) {
+      let formData = new FormData();
+      // 组装post提交的数据
+      formData.append("file", files);
+      this.$api.publicApi.uploadFile(formData).then( res => {
+        console.log(res)
+        if( res.code == '200') {
+          this.$message({
+            type: 'success',
+            message: '上传成功'
+          })
+          this.avatarUrl =  res.data.imgUrl
+          this.form.avatar = res.data.imgUrl
+        }else{
+          this.$message({
+            type: 'error',
+            message: '上传失败'
+          })
+        }
+      })
+    },
+    verificationPicFile(file, callback) {
+      const that = this
+      //读取图片数据
+      var filePic = file;
+      var reader = new FileReader();
+      reader.onload = function (e) {
+        var data = e.target.result;
+        //加载图片获取图片真实宽度和高度
+        var image = new Image();
+        image.onload=function(){
+          var width = image.width;
+          var height = image.height;
+          if (width >= 100 && height >= 100){
+            callback()
+          } else {
+            // that.ishowFile = true
+            that.from.avatar = ''
+            that.$message.error('上传图片建议200*200px!')
+          }
+        };
+        image.src= data;
+      };
+      reader.readAsDataURL(filePic);
+    }
+  }
+}
+</script>
+<style>
+.el-cascader-node>.el-radio{
+  margin-top:25px;
+}
+</style>
+
+<style lang="less" scoped>
+
+.uploadImg {
+  width: 110px;
+  height: 100px;
+  border: 1px solid #F8F8F8;
+  border-radius: 4px;
+  cursor:pointer;
+  position: absolute;
+  top: 0;
+}
+.inputIcon {
+  width: 110px;
+  height: 100px;
+  position: relative;
+  opacity: 0;
+}
+.uploadImg_warp {
+  width: 100%;
+  height: 100%;
+  display:flex ;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+.uploadImg_img {
+  height: 32px;
+}
+.footerBotton {
+  text-align: center;
+}
+.avatar-uploader {
+  width: 110px;
+  height: 110px;
+  border: 1px solid #F8F8F8;
+  border-radius: 4px;
+  position: relative;
+}
+.el-icon-plus {
+  width: 110px;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%,-50%);
+}
+.el-icon-plus-icon {
+  display: block;
+  margin-bottom: 15px;
+}
+.el-icon-plus-up {
+  color: #222222;
+  font-size: 12px;
+  line-height: 17px;
+  font-weight: 400;
+}
+/deep/ .el-radio {
+  line-height: 40px;
+}
+</style>
+

+ 445 - 0
src/views/member/components/researcherEdit.vue

@@ -0,0 +1,445 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="会员登录名:"
+          prop="user_name"
+      >
+        <el-input v-model="form.user_name"  placeholder="请输入会员登录名"></el-input>
+      </el-form-item>
+
+      <el-form-item  prop="image_url"  >
+          <template v-slot:label >
+            <span  style="display: inline-block">用户头像:</span>
+            <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="建议大小:100px*100px  支持格式:jpg、gif、png"
+                placement="top"
+            >
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+            <span  style="display: inline-block">: </span>
+          </template>
+          <input
+              type="file"
+              class="inputIcon"
+              ref="upfile"
+              required
+              @change="beforeAvatarUpload"
+          />
+          <div class="uploadImg" @click="uploadSildeShowClick">
+              <div v-if="!form.avatar" class="uploadImg_warp">
+                <div class="uploadImg_img"><img src="@/assets/default_avatar.png"></div>
+                <span>点击上传</span>
+              </div>
+            <div v-else style="width: 100%; height: 100%;"><img :src="avatarUrl" style="width: 100%;height: 100%;"></div>
+          </div>
+        </el-form-item>
+
+      <el-form-item
+          label="昵称:"
+          prop="nickname"
+      >
+        <el-input v-model="form.nickname"  placeholder="请输入昵称"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="登录密码:"
+          prop="password"
+      >
+          <template v-slot:label >
+            <span  style="display: inline-block">登录密码:</span>
+            <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="密码不修改不需要输入密码"
+                placement="top"
+            >
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+            <span  style="display: inline-block">: </span>
+          </template>
+        <el-input v-model="form.password"  placeholder="密码不修改不需要输入密码"></el-input>
+      </el-form-item>
+      <el-form-item
+          prop="confirm_password"
+      >
+      <template v-slot:label >
+            <span  style="display: inline-block">重复密码:</span>
+            <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="密码不修改不需要输入密码"
+                placement="top"
+            >
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+            <span  style="display: inline-block">: </span>
+          </template>
+        <el-input v-model="form.confirm_password"  placeholder="密码不修改不需要输入密码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="真实名称:"
+          prop="real_name"
+      >
+        <el-input v-model="form.real_name"  placeholder="请输入真实名称"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="性别:"
+          prop="gender"
+      >
+        <el-radio-group v-model.number="form.gender" >
+          <el-radio :label="1">男</el-radio>
+          <el-radio :label="2">女</el-radio>
+         </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          label="状态:"
+          prop="status"
+      >
+        <el-radio-group v-model.number="form.status" >
+                <el-radio :label="0">待审核</el-radio>
+                <el-radio :label="1">正常</el-radio>
+                <el-radio :label="2">冻结</el-radio>
+         </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          label="手机号码 :"
+          prop="mobile"
+      >
+        <el-input v-model.number="form.mobile"  placeholder="请输入手机号码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="邮箱 :"
+          prop="email"
+      >
+        <el-input v-model="form.email"  placeholder="请输入邮箱"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="身份证号码 :"
+          prop="id_card"
+      >
+        <el-input v-model="form.id_card"  placeholder="请输入身份证号码"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="会员等级:"
+          prop="level_id"
+      >
+      <el-select v-model="form.level_id" placeholder="请选择">
+        <el-option
+          v-for="item in levelList"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id">
+        </el-option>
+    </el-select>
+    </el-form-item>
+    <el-form-item
+          label="选择城市:"
+          prop="city_id"
+      >
+      <el-cascader
+          :key="cascaderKey"
+          v-model="form.city_id"
+          placeholder="选择您要绑定的城市"
+          :props="cityData"
+          filterable
+          clearable
+        ></el-cascader>
+
+    </el-form-item>
+
+      <el-form-item>
+        <div style="text-align: center">
+          <el-button type="primary" @click="onSubmit" :disabled="Isdisabled" :loading="isloading">保存</el-button>
+          <el-button style="color: #5075FC " @click="closeDlg">取消</el-button>
+        </div>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    memberDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: false
+    }
+  },
+  data() {
+    let self = this
+    return {
+      levelList:[],
+      cityData: {
+        checkStrictly: true,
+        lazy: true,
+        async lazyLoad (node, resolve) {
+          const { level, data } = node;  // 取出当前层级和选择数据
+          if (data && data.children && data.children.length !== 0) { // 提前加载数据切换后再点击回数据重复
+            return resolve(node)
+          }
+          console.log(level)
+          let parentId = level == 0 ? 0 : data.value
+          let parames = {
+            'pid':parentId
+          }
+          let res = await self.$api.publicApi.cityList(parames)
+          if (res.data) {
+            const nodes = res.data.map(item => ({
+              value: item.id,
+              label: item.name,
+              leaf: level >= 3,
+              children: []
+            }))
+            resolve(nodes)
+          }
+        }
+      },
+      form: {
+        avatar:'',
+        user_name:'',//用户名
+        nickname:'',//昵称
+        password:'',//密码
+        confirm_password:'',//重复密码
+        real_name:'',//真实姓名
+        gender:0,//性别
+        status:1,//状态
+        mobile:'',//手机号码
+        email:'',//邮箱
+        id_card:'',//身份证号码
+        level_id:1,//会员等级
+        city_id:[],//城市
+      },
+      cascaderKey:0,
+      avatarUrl:'',
+      menulist: [],
+      Isdisabled: false,
+      rules: {
+        user_name: [
+          { required: true, message: '用户名称必填' },
+          { validator: this.checkName, trigger: "blur" }
+        ],
+        password: [
+          { min: 6, max: 30, message: '长度在 6 到 30 个字符', trigger: 'blur' },
+        ],
+        confirm_password: [
+          { validator: this.confirmPassword, trigger: "blur" }
+        ],
+        level_id: [
+          { required: true, message: '会员等级必填' }
+        ],
+        email:[
+           { message: '邮箱格式错误', type: 'email' },
+        ],
+        mobile:[
+          { required: true, message: '手机号码必填' },
+          {pattern: /^1[356789]\d{9}$/,message:'您输入的手机号格式有误'}
+        ]
+       
+      }
+    }
+  },
+  mounted() {
+    console.log("看看:",this.memberDataForm)
+    if(this.memberDataForm) {
+      this.form = Object.assign({} , this.memberDataForm)
+      this.form.password = "" //密码置空
+      console.log("头像:",this.form.avatar)
+      this.avatarUrl =  this.form.avatar
+    }
+
+    this.getLevelList()
+  },
+  methods: {
+    checkName(rule, value, callback) {
+      let _t= this
+      let parames = {
+          user_name:value,
+          id:_t.memberDataForm.id
+      }
+      _t.$api.user.verifyUserInfo(parames).then(res=>{
+          if(res.code==200){
+            callback(new Error('用户名已存在'))
+          }
+          callback()
+      })
+    },
+    confirmPassword(rule, value, callback) {
+         if(value){
+            if(value!=this.form.password){
+                callback(new Error('两次密码不一致'))
+            }
+          }
+          callback()
+    },
+    closeDlg() {
+      // this.isloading = false
+      console.log("edit提交")
+      this.$emit('closeDlg',1)
+    },
+    onSubmit() {
+      let that = this
+      if(that.form.password){
+          console.log("##########",that.form)
+          if(that.form.confirm_password){
+            if(that.form.password!=that.form.confirm_password){
+               that.$message.error("两次密码不一致")
+               return
+             }
+          }else{
+            that.$message.error("确认密码不能为空")
+            return
+          }
+         
+      }
+      that.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.$emit('SubmitClick', this.form)
+        }
+      })
+    },
+    getLevelList(){
+      let _t= this
+      let parames = {}
+      this.$api.publicApi.getUserLevelList(parames).then(res=>{
+                if(res.code==200){
+                   console.log(res.data)
+                  _t.levelList = res.data
+                }else{
+                    this.$message.error("查询失败")
+                }
+            })
+    },
+    uploadSildeShowClick() {
+      this.$refs.upfile.value = ''
+      this.$refs.upfile.click()
+    },
+    beforeAvatarUpload(e) {
+      let than = this
+      let files = e.target.files[0]
+      let suffixName = files.name.substring(files.name.lastIndexOf('.') + 1);   /* 得到文件后缀名 */
+      if (suffixName !== 'jpg' && suffixName !== 'png' && suffixName !== 'jpeg' && suffixName !== 'gif' ) {
+        this.$message.warning("上传文件只能是 jpg、png、jpeg、gif 格式!");
+        // this.ishowFile = true
+        return;
+      }
+      this.verificationPicFile(files, () => this.fileAdd(files))
+    },
+    fileAdd(files) {
+      let formData = new FormData();
+      // 组装post提交的数据
+      formData.append("file", files);
+      this.$api.publicApi.uploadFile(formData).then( res => {
+        console.log(res)
+        if( res.code == '200') {
+          this.$message({
+            type: 'success',
+            message: '上传成功'
+          })
+          this.avatarUrl =  res.data.imgUrl
+          this.form.avatar = res.data.imgUrl
+        }else{
+          this.$message({
+            type: 'error',
+            message: '上传失败'
+          })
+        }
+      })
+    },
+    verificationPicFile(file, callback) {
+      const that = this
+      //读取图片数据
+      var filePic = file;
+      var reader = new FileReader();
+      reader.onload = function (e) {
+        var data = e.target.result;
+        //加载图片获取图片真实宽度和高度
+        var image = new Image();
+        image.onload=function(){
+          var width = image.width;
+          var height = image.height;
+          if (width >= 100 && height >= 100){
+            callback()
+          } else {
+            // that.ishowFile = true
+            that.from.avatar = ''
+            that.$message.error('上传图片建议200*200px!')
+          }
+        };
+        image.src= data;
+      };
+      reader.readAsDataURL(filePic);
+    }
+  }
+}
+</script>
+<style>
+.el-cascader-node>.el-radio{
+  margin-top:25px;
+}
+</style>
+
+<style lang="less" scoped>
+
+.uploadImg {
+  width: 110px;
+  height: 100px;
+  border: 1px solid #F8F8F8;
+  border-radius: 4px;
+  cursor:pointer;
+  position: absolute;
+  top: 0;
+}
+.inputIcon {
+  width: 110px;
+  height: 100px;
+  position: relative;
+  opacity: 0;
+}
+.uploadImg_warp {
+  width: 100%;
+  height: 100%;
+  display:flex ;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+.uploadImg_img {
+  height: 32px;
+}
+.footerBotton {
+  text-align: center;
+}
+.avatar-uploader {
+  width: 110px;
+  height: 110px;
+  border: 1px solid #F8F8F8;
+  border-radius: 4px;
+  position: relative;
+}
+.el-icon-plus {
+  width: 110px;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%,-50%);
+}
+.el-icon-plus-icon {
+  display: block;
+  margin-bottom: 15px;
+}
+.el-icon-plus-up {
+  color: #222222;
+  font-size: 12px;
+  line-height: 17px;
+  font-weight: 400;
+}
+/deep/ .el-radio {
+  line-height: 40px;
+}
+</style>
+