rkljw 9 месяцев назад
Родитель
Сommit
ba5b8da0ab
52 измененных файлов с 7822 добавлено и 1678 удалено
  1. 1477 1460
      package-lock.json
  2. 7 0
      package.json
  3. 0 1
      public/index.html
  4. 8 0
      src/App.vue
  5. 36 0
      src/api/ad.js
  6. 10 4
      src/api/index.js
  7. 17 0
      src/api/link.js
  8. 45 0
      src/api/news.js
  9. 25 1
      src/api/public.js
  10. 25 4
      src/api/user.js
  11. 19 6
      src/api/website.js
  12. BIN
      src/assets/blank.png
  13. BIN
      src/assets/default_avatar.png
  14. 13 18
      src/axios/request.js
  15. 9 19
      src/components/PageHeader.vue
  16. 255 0
      src/components/editor/Editor.vue
  17. 1 3
      src/main.js
  18. 85 2
      src/router/index.js
  19. 0 24
      src/utils/filterParamsMixin.js
  20. 0 64
      src/utils/initIm.js
  21. 332 0
      src/views/ad/components/edit.vue
  22. 280 0
      src/views/ad/index.vue
  23. 389 0
      src/views/adPlace/components/edit.vue
  24. 278 0
      src/views/adPlace/index.vue
  25. 126 0
      src/views/category/components/edit.vue
  26. 272 0
      src/views/category/index.vue
  27. 148 0
      src/views/city/index.vue
  28. 84 0
      src/views/level/components/edit.vue
  29. 259 0
      src/views/level/index.vue
  30. 332 0
      src/views/link/components/edit.vue
  31. 280 0
      src/views/link/index.vue
  32. 3 1
      src/views/login/index.vue
  33. 101 0
      src/views/member/components/addEdit.vue
  34. 122 0
      src/views/member/components/enterprise.vue
  35. 421 0
      src/views/member/components/governmentAffairs.vue
  36. 459 0
      src/views/member/components/governmentAffairsEdit.vue
  37. 408 0
      src/views/member/components/personal.vue
  38. 445 0
      src/views/member/components/personalEdit.vue
  39. 282 0
      src/views/member/index.vue
  40. 3 3
      src/views/menu/components/edit.vue
  41. 3 3
      src/views/menu/index.vue
  42. 417 0
      src/views/news/components/edit.vue
  43. 280 0
      src/views/news/index.vue
  44. 3 3
      src/views/role/index.vue
  45. 1 2
      src/views/website/components/edit.vue
  46. 8 11
      src/views/website/index.vue
  47. 1 1
      src/views/websiteColumn/components/edit.vue
  48. 2 2
      src/views/websiteColumn/index.vue
  49. 15 18
      src/views/websiteRole/index.vue
  50. 8 8
      src/views/websiteRoleUser/components/edit.vue
  51. 27 19
      src/views/websiteRoleUser/index.vue
  52. 1 1
      vue.config.js

Разница между файлами не показана из-за своего большого размера
+ 1477 - 1460
package-lock.json


+ 7 - 0
package.json

@@ -13,20 +13,27 @@
   "dependencies": {
     "@element-plus/icons": "0.0.11",
     "@element-plus/icons-vue": "^0.2.4",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "^1.0.2",
     "axios": "^0.24.0",
     "can-autoplay": "^3.0.2",
     "element-plus": "^1.2.0-beta.3",
     "element-resize-detector": "^1.2.4",
+    "element-tiptap": "^2.2.1",
     "element-ui": "^2.15.10",
     "less": "^4.1.2",
     "lodash": "^4.17.21",
     "moment": "^2.29.2",
+    "quill": "^2.0.2",
+    "quill-image-drop-module": "^1.0.3",
+    "quill-image-resize-module": "^3.0.0",
     "sortablejs": "^1.15.0",
     "speak-tts": "^2.0.8",
     "unplugin-vue-components": "^0.17.2",
     "v-fit-columns": "^0.2.0",
     "vue": "^3.0.0",
     "vue-cli-plugin-style-resources-loader": "^0.1.5",
+    "vue-quill-editor": "^3.0.6",
     "vue-router": "^4.0.0-0",
     "vuedraggable": "^2.24.0",
     "vuex": "^4.0.0-0"

+ 0 - 1
public/index.html

@@ -5,7 +5,6 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <script src="https://cdn.ronghub.com/RongIMLib-4.4.7.prod.js"></script>
     <title><%= htmlWebpackPlugin.options.title %></title>
       <style>
           #app{

+ 8 - 0
src/App.vue

@@ -120,6 +120,14 @@ body {
   border-radius: 4px;
   box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.3);
 }
+.btn{
+  cursor:pointer;
+  background-color: #5379F9;
+  padding: 6px;
+  margin-right: 5px;
+  color: #fff;
+  border-radius:5px;
+}
 </style>
 <style lang="less" >
 .el-select__popper {

+ 36 - 0
src/api/ad.js

@@ -0,0 +1,36 @@
+import { request } from '@/axios/request'
+
+export default {
+  //广告列表
+  getAdList (parames) {
+    return request.get("/ad/getAdList",parames)
+  },
+  //创建广告
+  createAd (parames) {
+      return request.post("/ad/createAd",parames)
+  },
+  //更新广告
+  updateAd (parames) {
+    return request.post("/ad/updateAd",parames)
+  },
+  //删除广告
+  delAd (parames) {
+      return request.post("/ad/delAd",parames)
+  },
+  //广告位列表
+  getAdPlaceList (parames) {
+    return request.get("/ad/getAdPlaceList",parames)
+  },
+  //创建广告位
+  createAdPlace (parames) {
+      return request.post("/ad/createAdPlace",parames)
+  },
+  //更新广告位
+  updateAdPlace (parames) {
+    return request.post("/ad/updateAdPlace",parames)
+  },
+  //删除广告位
+  delAdPlace (parames) {
+      return request.post("/ad/delAdPlace",parames)
+  }
+}

+ 10 - 4
src/api/index.js

@@ -6,11 +6,17 @@ import pub from "@/api/pub"
 import authority from "@/api/authority"
 import website from "@/api/website"
 import publicApi from "@/api/public"
+import news from "@/api/news"
+import link from "@/api/link"
+import ad from "@/api/ad"
 export default {
-    user,
-    login,
-    pub,
+    user,//用户已
+    login, //登录
+    pub,//公共
     authority, //权限管理
     website, //站点管理
-    publicApi,
+    publicApi, //公共
+    news,// 资讯
+    link,//友情链接
+    ad,//广告位
 }

+ 17 - 0
src/api/link.js

@@ -0,0 +1,17 @@
+import { request } from '@/axios/request'
+
+export default {
+
+  getLinkList (parames) {
+    return request.get("/link/getLinkList",parames)
+  },
+  createLink (parames) {
+      return request.post("/link/createLink",parames)
+  },
+  updateLink (parames) {
+    return request.post("/link/updateLink",parames)
+  },
+  delLink (parames) {
+      return request.post("/link/delLink",parames)
+  }
+}

+ 45 - 0
src/api/news.js

@@ -0,0 +1,45 @@
+import {request} from '@/axios/request'
+
+export default {
+    //分类列表
+    getCategoryList(parames){
+        return request.get("/news/getCategoryList",parames)
+    },
+    //查询所有分类
+    categoryList(parames){
+        return request.get("/news/categoryList",parames)
+    },
+    //添加分类
+    addCategory(parames){
+        return request.post("/news/addCategory",parames)
+    },
+    //删除分类
+    delCategory(parames){
+        return request.post("/news/delCategory",parames)
+    },
+    //更新分类
+    updateCategory(parames){
+        return request.post("/news/updateCategory",parames)
+    },
+    //资讯列表
+    getArticleList(parames){
+        return request.get("/news/getArticleList",parames)
+    },
+    //添加资讯
+    addArticle(parames){
+        return request.post("/news/addArticle",parames)
+    },
+    //删除资讯
+    delArticle(parames){
+        return request.post("/news/delArticle",parames)
+    },
+    //更新自信
+    updateArticle(parames){
+        return request.post("/news/updateArticle",parames)
+    },
+    //获取资讯详情
+    getArticleInfo(parames){
+        return request.get("/news/getArticleInfo",parames)
+    },
+    
+}

+ 25 - 1
src/api/public.js

@@ -4,5 +4,29 @@ export default {
   // 地区列表
   cityList (parames) {
     return request.get("/public/getDistrictList",parames)
-  }
+  },
+  // 等级列表
+  getUserLevelList (parames) {
+    return request.get("/public/getUserLevelList",parames)
+  },
+  //添加会员等级
+  addUserLevel (parames) {
+      return request.post("/public/addUserLevel",parames)
+  },
+  //更新等级
+  updateUserLevel (parames) {
+    return request.post("/public/updateUserLevel",parames)
+  },
+  //删除等级
+  delUserLevel (parames) {
+      return request.post("/public/delUserLevel",parames)
+  },
+  //上传文件
+  uploadFile (parames) {
+    return request.post("/public/uploadFile",parames)
+  },
+  // 地区列表
+  getCityList (parames) {
+      return request.get("/public/getCityList",parames)
+  },
 }

+ 25 - 4
src/api/user.js

@@ -1,26 +1,47 @@
 import { request } from '../axios/request'
 export default {
-
+    //创建用户
+    createUser(parames){
+        return request.post("/user/createUser",parames)
+    },
     loginUserInfo (){
         return request.get("/user/getUserInfo")
     },
-
-
+    //获取用户列表
+    getUserList (parames){
+        return request.get("/user/getUserList",parames)
+    },
+    //更新用户
+    updateUser(parames){
+        return request.post("/user/updateUser",parames)
+    },
+    //删除用户
+    delUser(parames){
+        return request.post("/user/delUser",parames)
+    },
+    //验证用户
+    verifyUserInfo(parames){
+        return request.post("/user/verifyUserInfo",parames)
+    },
     /**
-     * 角色
+     * 角色列表
      */
     roleList(parames){
         return request.get("/user/roleList",parames)
     },
+    //添加角色
     addRole(parames){
         return request.get("/user/addRole",parames)
     },
+    //删除角色
     delRole(parames){
         return request.get("/user/delRole",parames)
     },
+    //更新角色
     updateRole(parames){
         return request.get("/user/updateRole",parames)
     },
+    //获取角色信息
     roleInfo(parames){
         return request.get("/user/roleInfo",parames)
     },

+ 19 - 6
src/api/website.js

@@ -40,15 +40,28 @@ export default {
     },
 
      //站点角色列表
-     getAdminWebsiteRoleList (parames){
-        return request.get("/website/getAdminWebsiteRoleList",parames)
+     getWebsiteRoleList (parames){
+        return request.get("/website/getWebsiteRoleList",parames)
     },
     //创建站点角色
-    createAdminWebsiteRoleUser(parames){
-        return request.post("/website/createAdminWebsiteRoleUser",parames)
+    createWebsiteRole(parames){
+        return request.post("/website/createWebsiteRole",parames)
     },
     //删除站点角色
-    delAdminWebsiteRoleUser(parames){
-        return request.post("/website/delAdminWebsiteRoleUser",parames)
+    delWebsiteRole(parames){
+        return request.post("/website/delWebsiteRole",parames)
+    },
+    
+     //站点角色用户列表
+     getWebsiteRoleUserList (parames){
+        return request.get("/website/getWebsiteRoleUserList",parames)
+    },
+    //创建站点角色用户
+    createWebsiteRoleUser(parames){
+        return request.post("/website/createWebsiteRoleUser",parames)
+    },
+    //删除站点角色用户
+    delWebsiteRoleUser(parames){
+        return request.post("/website/delWebsiteRoleUser",parames)
     },
 }

BIN
src/assets/blank.png


BIN
src/assets/default_avatar.png


+ 13 - 18
src/axios/request.js

@@ -1,9 +1,5 @@
 import axios from 'axios'
 import { reqXUrl } from '../utils/config'
-import router from '../router'
-import { ElMessage } from 'element-plus'
-import userUtil from '../api/user-util'
-import utils from  '@/static/js/utils'
 const instance = axios.create({
   baseURL: reqXUrl,
   timeout: 400000,
@@ -11,23 +7,21 @@ const instance = axios.create({
   }
 })
 
-let token = document.getCookie("token")
-
 instance.defaults.withCredentials=false
 // 添加请求拦截器
 instance.interceptors.request.use(function (config) {
+  let headers = {
+    'loginDevice': 'localhost:8099',
+    'Content-Type': 'application/json; charset=utf-8',
+    'X-Requested-With': 'XMLHttpRequest'
+  }
+
+  if(document.getCookie("token")){
+    Object.assign(headers, { "token": decodeURIComponent(document.getCookie("token")) })
+  }
  
-  // if(!token){
-  //     console.log("没有token,跳转到login")
-  //     window.location.href = "/login"
-  // }
   return Object.assign({}, config, {
-    headers: {
-      'loginDevice': 'localhost:8099',
-      'Content-Type': 'application/json; charset=utf-8',
-      'X-Requested-With': 'XMLHttpRequest',
-      'token':token
-    }
+    headers
   })
 }, function (error) {
   return Promise.reject(error)
@@ -37,13 +31,14 @@ instance.interceptors.request.use(function (config) {
  * 拦截响应response,并做一些错误处理
  */
 instance.interceptors.response.use((response) => {
+  console.log("************:::",response)
   let res = response.data
-  if (res.code == 30002) {
+  if (res.code == -1) {
     // ElMessage({
     //     message: res.msg,
     //     type: 'error'
     // })
-    window.location.href = "/login"
+    window.location.href = "/#/login"
     // router.push('/seller');
     return Promise.resolve(res)
   } else if ((res.code != undefined && res.code != 0) || (res.resultCode!=undefined && res.resultCode!=0)) {

+ 9 - 19
src/components/PageHeader.vue

@@ -9,10 +9,10 @@
       </div>
     </div>
     <div class="header-right">
-      <img class="user-ava" :src="user.admin_user_img ? user.admin_user_img : '/assets/seller/images/tx.png'" />
+      <img class="user-ava" :src="user.avatar ? user.avatar : '/assets/seller/images/tx.png'" />
       <span class="user-name">{{ user.nick_name }}</span>
       <div @click="logoutClick">
-        <a href="/seller/privilege.php?act=logout"><img :src="logoutIcon" /></a>
+        <a><img :src="logoutIcon" /></a>
       </div>
    
     </div>
@@ -21,7 +21,6 @@
 
 <script>
 import { mapState, mapGetters } from 'vuex'
-import {getTotalUnreadCount, im, initIm} from '@/utils/initIm'
 var popup
 export default {
   name: 'PageHeader',
@@ -56,15 +55,7 @@ export default {
     },
 
   },
-  created() {
-    let that = this
-    im.watch({
-      async message(event) {
-        let res = await getTotalUnreadCount();
-        that.unreadCount = res
-      }
-    })
-  },
+
   watch: {
     $route(to, from) {
       let { action } = to.meta
@@ -76,9 +67,6 @@ export default {
       let idx = this.getNavIdx(n, this.localUrl, action)
       console.log('查询出来的导航:', idx)
       this.onNav(idx)
-    },
-    user(){
-      initIm()
     }
   },
   mounted() {
@@ -103,11 +91,13 @@ export default {
   },
   methods: {
     logoutClick() {
-      popup.postMessage({ type: 'layOut' }, '/')
-    },
-    goChat() {
-      popup = window.open('/bs/#/chat')
+      document.setCookie("token",'',0)
+      this.$router.push("/login")
+      // popup.postMessage({ type: 'layOut' }, '/')
     },
+    // goChat() {
+    //   popup = window.open('/bs/#/chat')
+    // },
     onNav(idx) {
       this.$store.commit('navMenu/setNavIdx', idx)
     },

+ 255 - 0
src/components/editor/Editor.vue

@@ -0,0 +1,255 @@
+<template>
+  <div>
+      <!-- 图片上传组件辅助-->
+    <el-upload
+      class="avatar-uploader"
+      :action="serverUrl"
+      name="file"
+      :headers="header"
+      :show-file-list="false"
+      :on-success="uploadSuccess"
+      :on-error="uploadError"
+      :before-upload="beforeUpload">
+    </el-upload>
+
+      <quill-editor 
+      class="editor"
+      v-model="content"
+      ref="myQuillEditor" 
+      :options="editorOption" 
+      @blur="onEditorBlur($event)" @focus="onEditorFocus($event)"
+      @change="onEditorChange($event)">
+      </quill-editor>
+  </div>
+  
+</template>
+<script>
+// 工具栏配置
+const toolbarOptions = [
+["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
+["blockquote", "code-block"], // 引用  代码块
+[{ header: 1 }, { header: 2 }], // 1、2 级标题
+[{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
+[{ script: "sub" }, { script: "super" }], // 上标/下标
+[{ indent: "-1" }, { indent: "+1" }], // 缩进
+// [{'direction': 'rtl'}],                         // 文本方向
+[{ size: ["small", false, "large", "huge"] }], // 字体大小
+[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
+[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
+[{ font: [] }], // 字体种类
+[{ align: [] }], // 对齐方式
+["clean"], // 清除文本格式
+//["link", "image","video"] // 链接、图片、视频
+["link", "image"] // 链接、图片
+];
+
+import { quillEditor } from "vue-quill-editor/src";
+import "quill/dist/quill.core.css";
+import "quill/dist/quill.snow.css";
+import "quill/dist/quill.bubble.css";
+import { reqXUrl } from '../../utils/config';
+export default {
+props: {
+  ContentValue:{
+    type: String,
+    default:''
+  },
+  /*编辑器的内容*/
+  value: {
+    type: String
+  },
+  /*图片大小*/
+  maxSize: {
+    type: Number,
+    default: 4000 //kb
+  }
+},
+
+components: {
+  quillEditor
+},
+
+data() {
+  return {
+    content: this.value,
+    quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示
+    editorOption: {
+      placeholder: "",
+      theme: "snow", // or 'bubble'
+      placeholder: "资讯内容",
+      modules: {
+        toolbar: {
+          container: toolbarOptions,
+          // container: "#toolbar",
+          handlers: {
+            image: function(value) {
+              if (value) {
+                // 触发input框选择图片文件
+                document.querySelector(".avatar-uploader input").click();
+              } else {
+                this.quill.format("image", false);
+              }
+            },
+            // link: function(value) {
+            //   if (value) {
+            //     var href = prompt('请输入url');
+            //     this.quill.format("link", href);
+            //   } else {
+            //     this.quill.format("link", false);
+            //   }
+            // },
+          }
+        }
+      }
+    },
+    serverUrl: reqXUrl+"/public/uploadFile", // 这里写你要上传的图片服务器地址
+    header: {
+      token: document.getCookie("token")
+    } // 有的图片服务器要求请求头需要有token
+  };
+},
+watch: {
+  ContentValue (n, o) {
+    this.content = n
+    const editor = this.$refs.myQuillEditor.quill;
+     editor.root.innerHTML=n;
+
+    }
+  },
+  mounted(){
+
+
+},
+methods: {
+  onEditorBlur() {
+    //失去焦点事件
+    console.log("888888888:",this.content)
+  },
+  onEditorFocus() {
+    //获得焦点事件
+    this.$emit("input", this.content);
+  },
+  onEditorChange() {
+
+    const editor = this.$refs.myQuillEditor.quill;
+    const html = editor.root.innerHTML;
+    //内容改变事件
+    this.$emit("input", html);
+  },
+
+  // 富文本图片上传前
+  beforeUpload() {
+    // 显示loading动画
+    this.quillUpdateImg = true;
+  },
+  uploadSuccess(res, file) {
+    console.log(res);
+    console.log(file)
+    // res为图片服务器返回的数据
+    // 获取富文本组件实例
+    let quill = this.$refs.myQuillEditor.quill;
+    // 如果上传成功
+    if (res.code == 200) {
+      // 获取光标所在位置
+      let length = quill.getSelection().index;
+      // 插入图片  res.url为服务器返回的图片地址
+      quill.insertEmbed(length, "image", res.data.imgUrl);
+      // 调整光标到最后
+      quill.setSelection(length + 1);
+    } else {
+      this.$message.error("图片插入失败");
+    }
+    // loading动画消失
+    this.quillUpdateImg = false;
+  },
+  // 富文本图片上传失败
+  uploadError() {
+    // loading动画消失
+    this.quillUpdateImg = false;
+    this.$message.error("图片插入失败");
+  }
+}
+};
+</script> 
+
+<style>
+.editor {
+line-height: normal !important;
+width: 800px;
+margin: 0 auto;
+}
+.ql-container {
+height: 400px !important;
+}
+.ql-snow .ql-tooltip[data-mode=link]::before {
+content: "请输入链接地址:";
+}
+.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
+  border-right: 0px;
+  content: '保存';
+  padding-right: 0px;
+}
+
+.ql-snow .ql-tooltip[data-mode=video]::before {
+  content: "请输入视频地址:";
+}
+
+.ql-snow .ql-picker.ql-size .ql-picker-label::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item::before {
+content: '14px';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+content: '10px';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+content: '18px';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+content: '32px';
+}
+
+.ql-snow .ql-picker.ql-header .ql-picker-label::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item::before {
+content: '文本';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+content: '标题1';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+content: '标题2';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+content: '标题3';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+content: '标题4';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+content: '标题5';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+content: '标题6';
+}
+
+.ql-snow .ql-picker.ql-font .ql-picker-label::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item::before {
+content: '标准字体';
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+content: '衬线字体';
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+content: '等宽字体';
+}
+</style>

+ 1 - 3
src/main.js

@@ -8,8 +8,6 @@ import lodash from 'lodash'
 import * as ElementIcon from "@element-plus/icons-vue";
 import "element-plus/dist/index.css";
 
-// import 'element-ui/lib/theme-chalk/index.css'
-// import "./plugins/element.js";
 
 import "../theme/index.css";
 import api from "./api/index";
@@ -21,7 +19,7 @@ import useWidgets from './components'
 
 // 全局安装自定义组件
 // 初始化im
-import { im } from "@/utils/initIm";
+
 
 import Utils from "@/static/js/utils";
 

+ 85 - 2
src/router/index.js

@@ -50,9 +50,9 @@ const routes = [{
             {
                 meta: {
                     action: "websiteRoleUser",
-                    title: '站点角色'
+                    title: '站点角色用户'
                 },
-                path: 'websiteRoleUser/:Id',
+                path: 'websiteRoleUser/:websiteId/:roleId',
                 name: 'websiteRoleUser',
                 component: () =>
                     import ('@views/websiteRoleUser/index.vue')
@@ -66,7 +66,90 @@ const routes = [{
                 name: 'websiteColumn',
                 component: () =>
                     import ('@views/websiteColumn/index.vue')
+            },
+            {
+                meta: {
+                    action: "memberList",
+                    title: '会员列表'
+                },
+                path: 'memberList',
+                name: 'memberList',
+                component: () =>
+                    import ('@views/member/index.vue')
+            },
+            {
+                meta: {
+                    action: "levelList",
+                    title: '会员等级'
+                },
+                path: 'levelList',
+                name: 'levelList',
+                component: () =>
+                    import ('@views/level/index.vue')
+            },
+            {
+                meta: {
+                    action: "cityList",
+                    title: '会员等级'
+                },
+                path: 'cityList',
+                name: 'cityList',
+                component: () =>
+                    import ('@views/city/index.vue')
             }
+            ,
+            {
+                meta: {
+                    action: "newsList",
+                    title: '资讯列表'
+                },
+                path: 'newsList',
+                name: 'newsList',
+                component: () =>
+                    import ('@views/news/index.vue')
+            }
+            ,
+            {
+                meta: {
+                    action: "categoryList",
+                    title: '栏目列表'
+                },
+                path: 'categoryList',
+                name: 'categoryList',
+                component: () =>
+                    import ('@views/category/index.vue')
+            } ,
+            {
+                meta: {
+                    action: "linkList",
+                    title: '友情链接'
+                },
+                path: 'linkList',
+                name: 'linkList',
+                component: () =>
+                    import ('@views/link/index.vue')
+            },
+            {
+                meta: {
+                    action: "adPlaceList",
+                    title: '广告位'
+                },
+                path: 'adPlaceList',
+                name: 'adPlaceList',
+                component: () =>
+                    import ('@views/adPlace/index.vue')
+            } ,
+            {
+                meta: {
+                    action: "adList",
+                    title: '广告'
+                },
+                path: 'adList',
+                name: 'adList',
+                component: () =>
+                    import ('@views/ad/index.vue')
+            } ,
+           
            
         ]
     },

+ 0 - 24
src/utils/filterParamsMixin.js

@@ -1,24 +0,0 @@
-const myMixin = {
-		// 用来判断是否是从详细页过来的路径
-	beforeRouteEnter(to, from, next) {
-		console.log(3333)
-		//在路由加载进入之间,如果不是从当前详情页返回进入列表页的话,则将缓存中的pageNum和pageSize清除
-		const toFullPath = to.fullPath
-			.split('/')
-			.filter((v, i) => i < 3)
-			.join('')
-		const fromFullPath = from.fullPath
-			.split('/')
-			.filter((v, i) => i < 3)
-			.join('')
-		console.log(toFullPath)
-		console.log(fromFullPath)
-		if (toFullPath !== fromFullPath) {
-			// sessionStorage.pageNum = ''
-			// sessionStorage.pageSize = ''
-			store.dispatch('setChangeFilter', {})
-		}
-		next()
-	},
-  
-}

+ 0 - 64
src/utils/initIm.js

@@ -1,64 +0,0 @@
-import { appKey } from "./config";
-import "../static/js/utils"
-import store from "../store";
-console.log(appKey,'这里是appkey');
-export const im = RongIMLib.init({ appkey: appKey });
-var messageType = 'LC:TxtMsg'; // 自定义消息类型
-var isPersited = true; // 自定义消息存储属性
-var isCounted = true;  // 自定义消息计数属性
-im.registerMessageType(messageType, isPersited, isCounted);
-// 添加事件监听
-im.watch({
-  // 监听会话列表变更事件
-  conversation(event) {
-
-  },
-  // 监听消息通知
-  message(event) {
-    // 新接收到的消息内容
-    const message = event.message;
-  },
-  // 监听 IM 连接状态变化
-  status(event) {
-    console.log("connection status:", event.status);
-  },
-	// // 监听离线消息拉取完成
-	// pullFinished (a) {
-	// 	console.log(a,'拉取离线消息完成')
-	// },
-});
-let token = decodeURIComponent(document.getCookie("ry_token"))
-// let token = decodeURIComponent('AovCFVLmFnBFxEevG+FOVTmJIrWI6bXOZVci+HXchnPAqnu7l8bclA==@svhu.cn.rongnav.com;svhu.cn.rongcfg.com')
-function connectIm() {
-    console.log("连接融云")
-  return new Promise((resolve, reject) => {
-    im.connect({
-      token: token,
-    }).then(res=>{
-      console.log(res,'链接成功');
-      resolve(true);
-    }).catch(function (error) {
-      console.log("链接失败: ", error.code, error.msg);
-      reject();
-    });
-  });
-
-
-}
-
-export async function getTotalUnreadCount() {
-	// 获取未读消息
-	const res = await im.Conversation.getTotalUnreadCount();
-	console.log(res,'获取未读消息');
-    window.postMessage({type: 'im',num: res}, '/');
-	return res
-}
-
-export   async function initIm() {
-	// await connectIm()
-	// await getTotalUnreadCount()
-}
-
-
-
-

+ 332 - 0
src/views/ad/components/edit.vue

@@ -0,0 +1,332 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="所属站点:"
+          prop="website_id"
+      >
+      <el-select
+        v-model="form.website_id"
+        :multiple=false
+        :clearable="true"
+        filterable
+        remote
+        reserve-keyword
+        placeholder="请输入关键词"
+        :remote-method="remoteMethod"
+        :loading="loading">
+        <el-option
+          v-for="item in websiteList"
+          :key="item.id"
+          :label="item.website_name"
+          :value="item.id">
+        </el-option>
+      </el-select>
+    
+      </el-form-item>
+      <el-form-item
+          label="网站名称:"
+          prop="title"
+      >
+        <el-input v-model="form.title"  maxlength="50" placeholder="请输入资讯标题"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="网站地址:"
+          prop="url"
+      >
+        <el-input v-model="form.url"  maxlength="50" placeholder="请输入网站地址"></el-input>
+      </el-form-item>
+      <el-form-item  prop="image_url"  >
+          <template v-slot:label >
+            <span  style="display: inline-block">网站LOGO:</span>
+            <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="建议大小:90px*30px  支持格式: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.logo_url" 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="form.logo_url" style="width: 100%;height: 100%;"></div>
+          </div>
+        </el-form-item>
+      <el-form-item
+          label="网站介绍:"
+          prop="describe"
+      >
+        <el-input type="textarea" v-model="form.describe"  maxlength="50" placeholder="请输入网站介绍"></el-input>
+      </el-form-item>
+      <!---1通过,2待审核,3待发 4,拒绝 5删除-->
+      <el-form-item
+          label="状态:"
+          prop="status"
+      >
+      <el-radio-group v-model="form.status">
+          <el-radio :label="1">通过</el-radio>
+          <el-radio :label="2">待审核</el-radio>
+      </el-radio-group>
+      </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: {
+    LinkDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+  },
+  data() {
+    return {
+      form: {
+        website_id:'',//站点ID
+        title:'',//标题
+        url:'',//地址
+        logo_url:'', //图片地址
+        status:1,//状态
+        describe:'', //备注信息
+      },
+      categoryList: [],
+      Isdisabled: false,
+      rules: {
+        website_id: [
+          { required: true, message: '请选择所属站点' },
+        ],
+        title: [
+          {  required: true, message: '网站名称不能为空' },
+        ],
+        url: [
+          {  required: true, message: '网站地址不能为空' },
+        ],
+        status: [
+          {  required: true, message: '请选择状态' },
+        ],
+      },
+      pageSize:20,
+      page:1,
+      keyWord:'',
+      websiteList:[]
+    }
+  },
+  mounted() {
+    if(this.LinkDataForm) {
+      this.form = Object.assign({} , this.LinkDataForm)
+    }
+    this.remoteMethod()
+  },
+  methods: {
+    remoteMethod(keyWord){
+      let _t= this
+      let parames = {
+        'page':this.currentPage,
+        'pageSize':this.pageSize,
+        'keyWord':keyWord
+      }
+      this.$api.website.getWebsiteList(parames).then(res=>{
+                if(res.code==200){
+                  _t.websiteList = res.data.rows
+                }else{
+                    this.$message.error("查询失败")
+                }
+            })
+    },
+    isLinkOk(o){
+        console.log(o)
+        if(o==true){
+            this.isLink = true
+        }else{
+          this.isLink = false
+        }
+    },
+    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('LinkSubmitClick', this.form)
+        }
+      })
+    },
+
+    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.logo_url = 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);
+    },
+    addTag() {
+      if (this.tagInput.trim()) {
+        this.tags.push(this.tagInput.trim());
+        
+        this.tagInput = '';
+      }
+    },
+    removeTag(index) {
+      this.tags.splice(index, 1);
+    }
+  }
+}
+</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>
+
+

+ 280 - 0
src/views/ad/index.vue

@@ -0,0 +1,280 @@
+<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="title" width="250"></el-table-column>
+          <el-table-column label="站点名称" prop="website_name" width="250"></el-table-column>
+          <el-table-column label="排序" prop="sort" width="250"></el-table-column>
+          <el-table-column label="状态" prop="status_name" width="100"></el-table-column>
+          <el-table-column label="网站图片"  width="80">
+            <template v-slot="scope">
+              <el-image
+              style="width: 50px; height: 50px"
+              :src="scope.row.logo_url"
+              ></el-image>
+          </template>
+          </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="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="LinkDialogShow = false"
+      @DialogClose="LinkDialogShow = false"
+      :innerVisible="LinkDialogShow"
+      @colesClick="LinkDialogShow  = false"
+  >
+    <editFrom
+        @colesClick="LinkDialogShow = false"
+        :LinkDataForm="LinkDataForm"
+         :isloading="isloading"
+        @LinkSubmitClick="LinkSubmitClick"
+        @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, //控制删除弹窗
+        LinkId:'',
+        LinkRowIndex:'',
+        LinkDataForm: {},
+        LinkTableData: [],
+        isloading:false, //提交按钮状态
+        LinkDialogShow: false, // 控制保存弹窗
+        pid:0,
+        keyword:''
+      }
+    },
+    mounted() {
+     
+    },
+    methods: {
+      // 获取分类信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyword
+        }
+        console.log("参数:",parames)
+        this.$api.link.getLinkList(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.LinkDataForm = {}
+        this.LinkDialogShow = true
+      },
+      //更新分类
+      updateClick(row,index){
+        console.log(row)
+        this.LinkDataForm = row
+        this.rowIndex = index
+        this.LinkDialogShow = true
+      },
+      // LinkDialogShow(){
+      //   this.isloading = false
+      // },
+      closeDlg(val){
+          this.LinkDialogShow = false
+          this.isloading = false
+      },
+      LinkSubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.link.updateLink(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                     this.getList()
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.LinkDialogShow = false
+                this.isloading = false
+            })
+        }else{
+          this.$api.link.createLink(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                    this.getList()
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.LinkDialogShow = false
+                this.isloading = false
+            })
+        }
+       
+      },
+      //删除分类
+      deleteAuthority(row, index) {
+        this.LinkId = row.id
+        this.LinkRowIndex = index
+        this.DialogShow = true
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      },
+      submitSureClickDel(row,index){
+        let _t = this
+        let parames = {
+          'id':this.LinkId
+        }
+        this.$api.link.delLink(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>

+ 389 - 0
src/views/adPlace/components/edit.vue

@@ -0,0 +1,389 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="所属站点:"
+          prop="website_id"
+      >
+      <el-select
+        v-model="form.website_id"
+        :multiple=false
+        :clearable="true"
+        filterable
+        remote
+        reserve-keyword
+        placeholder="请输入关键词"
+        :remote-method="remoteMethod"
+        :loAdPlaceing="loAdPlaceing">
+        <el-option
+          v-for="item in websiteList"
+          :key="item.id"
+          :label="item.website_name"
+          :value="item.id">
+        </el-option>
+      </el-select>
+    
+      </el-form-item>
+      <el-form-item
+          label="广告位名称:"
+          prop="name"
+      >
+        <el-input v-model="form.name"  maxlength="50" placeholder="请输入广告位名称"></el-input>
+      </el-form-item>
+  
+      <el-form-item  prop="thumb"  >
+          <template v-slot:label >
+            <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.thumb" 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="form.thumb" style="width: 100%;height: 100%;"></div>
+          </div>
+        </el-form-item>
+      <el-form-item
+          label="广告位介绍:"
+          prop="introduce"
+      >
+        <el-input type="textarea" v-model="form.introduce"  maxlength="200" placeholder="请输入广告位介绍"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="广告类型:"
+          prop="typeid"
+      >
+      <el-radio-group v-model="form.typeid" @change="onclickType">
+          <el-radio :label="1">文字</el-radio>
+          <el-radio :label="2">图文</el-radio>
+      </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          v-if="form.typeid==2"
+          label="广告位大小:"
+          prop="size"
+          ref="size"
+      >
+        <el-input v-model.number="form.width" style="width:150px;" maxlength="50" placeholder="宽"></el-input> X <el-input v-model.number="form.height" style="width:150px;" maxlength="50" placeholder="高"></el-input>[宽 X 高 px]
+      </el-form-item>
+      <el-form-item
+          label="价格:"
+          prop="price"
+      >
+        <el-input v-model.number="form.price"  maxlength="50" placeholder="0表示面议"></el-input>
+      </el-form-item>
+
+      <!---1通过,2待审-->
+      <el-form-item
+          label="状态:"
+          prop="status"
+      >
+      <el-radio-group v-model="form.status">
+          <el-radio :label="1">通过</el-radio>
+          <el-radio :label="2">待审核</el-radio>
+      </el-radio-group>
+      </el-form-item>
+
+      <el-form-item>
+        <div style="text-align: center">
+          <el-button type="primary" @click="onSubmit" :disabled="Isdisabled" :loAdPlaceing="isloAdPlaceing">保存</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: {
+    AdPlaceDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloAdPlaceing:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+  },
+  data() {
+    return {
+      isShow:'',
+      form: {
+        website_id:'',//站点ID
+        name:'',//标题
+        thumb:'',//示意图
+        typeid:'', //广告类型
+        status:'',//状态
+        introduce:'', //备注信息
+        width:0,
+        height:0,
+        size:''
+
+      },
+      categoryList: [],
+      Isdisabled: false,
+      rules: {
+        website_id: [
+          { required: true, message: '请选择所属站点' },
+        ],
+        name: [
+          {  required: true, message: '广告位名称不能为空' },
+        ],
+        size: [
+          {  required: true, message: '宽高不能为空' },
+        ],
+        status: [
+          {  required: true, message: '请选择状态' },
+        ],
+        typeid: [
+          {  required: true, message: '请选择广告类型' },
+        ],
+        price:[
+          {pattern: /^(([0-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/,message:'您的价格填写有误'}
+        ]
+      },
+      pageSize:20,
+      page:1,
+      keyWord:'',
+      websiteList:[]
+    }
+  },
+  watch:{
+    "form.width":{
+      immediate:true, 
+      handler: function(n,o){
+        console.log("宽:",n)
+        if(n>0 && this.form.height>0){
+           setTimeout(() => {
+            this.form.size = "1"
+            this.$refs['size'].clearValidate()
+           })
+          
+        }else{
+           this.form.size = ""
+        }
+      }
+    }
+    , 
+    "form.height":{
+      immediate:true, 
+      handler: function(n,o){
+        console.log("高:",n)
+        if(n>0 && this.form.width>0){
+          setTimeout(() => {
+            this.form.size = "1"
+            this.$refs['size'].clearValidate()
+           })
+          
+        }else{
+           this.form.size = ""
+        }
+      }
+    }
+  },
+  mounted() {
+    if(this.AdPlaceDataForm) {
+      this.form = Object.assign({} , this.AdPlaceDataForm)
+    }
+    this.remoteMethod()
+  },
+  methods: {
+    onclickType(val){
+      console.log(val)
+      if(val==1){
+          this.isShow = false
+      }else{
+        this.isShow = true
+      }
+    },
+    remoteMethod(keyWord){
+      let _t= this
+      let parames = {
+        'page':this.currentPage,
+        'pageSize':this.pageSize,
+        'keyWord':keyWord
+      }
+      this.$api.website.getWebsiteList(parames).then(res=>{
+                if(res.code==200){
+                  _t.websiteList = res.data.rows
+                }else{
+                    this.$message.error("查询失败")
+                }
+            })
+    },
+    isAdPlaceOk(o){
+        console.log(o)
+        if(o==true){
+            this.isAdPlace = true
+        }else{
+          this.isAdPlace = false
+        }
+    },
+    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('AdPlaceSubmitClick', this.form)
+        }
+      })
+    },
+
+    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.thumb = 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);
+    },
+   
+    removeTag(index) {
+      this.tags.splice(index, 1);
+    }
+  }
+}
+</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>
+
+

+ 278 - 0
src/views/adPlace/index.vue

@@ -0,0 +1,278 @@
+<template>
+    <div class="main-content__div">
+      <div class="table-box__div" v-cloak v-loAdPlaceing="loAdPlaceingFlag">
+        <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-loAdPlaceing="loAdPlaceingFlag">
+        <!-- 查询表单 -->
+        <el-form :inline="true" class="demo-form-inline">
+          <el-form-item>
+            <el-button type="primary" size="small" @click="AdPlacedClick">添加广告位</el-button>
+          </el-form-item>
+        
+        </el-form>
+        <el-table
+          size="mini"
+          :data="tableData"
+          :empty-text="tableDataLoAdPlaceingText"
+          style="width: 100%;font-size: 15px;"
+          :heAdPlaceer-cell-style="{background:'#FAFAFA'}"
+        >
+          <el-table-column label="编号" width="150" prop="id"></el-table-column>
+          <el-table-column label="广告位类型" prop="type_name" width="150"></el-table-column>
+          <el-table-column label="广告位名称" prop="name" width="250"></el-table-column>
+          <el-table-column label="宽度(PX)" prop="width" width="100"></el-table-column>
+          <el-table-column label="高度(PX)" prop="height" width="100"></el-table-column>
+          <el-table-column label="状态" prop="status_name" width="100"></el-table-column>
+          <el-table-column label="价格" prop="price" width="150">
+            <template v-slot="scope">
+              <div v-if="scope.row.price==0">面议</div>   
+              <div v-else>{{scope.row.price}}</div>        
+            </template>
+          </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="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="AdPlaceDialogShow = false"
+      @DialogClose="AdPlaceDialogShow = false"
+      :innerVisible="AdPlaceDialogShow"
+      @colesClick="AdPlaceDialogShow  = false"
+  >
+    <editFrom
+        @colesClick="AdPlaceDialogShow = false"
+        :AdPlaceDataForm="AdPlaceDataForm"
+         :isloAdPlaceing="isloAdPlaceing"
+        @AdPlaceSubmitClick="AdPlaceSubmitClick"
+        @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: [],
+        //  加载中数据提示
+        tableDataLoAdPlaceingText:"拼命加载中······",
+        //  是否显示分页
+        pagination:false,
+        //  每页显示的条数
+        pageSize:10,
+        //  当前页
+        currentPage:1,
+        //  分类列表数据总条数
+        tableCount:0,
+  
+        loAdPlaceingFlag: false,
+        isShowSource: false, // 是否显示来源列
+        id:0,
+        DialogShow: false, //控制删除弹窗
+        AdPlaceId:'',
+        AdPlaceRowIndex:'',
+        AdPlaceDataForm: {},
+        AdPlaceTableData: [],
+        isloAdPlaceing:false, //提交按钮状态
+        AdPlaceDialogShow: false, // 控制保存弹窗
+        pid:0,
+        keyword:''
+      }
+    },
+    mounted() {
+     
+    },
+    methods: {
+      // 获取分类信息列表
+      getList:function(){
+        let _t = this;
+        _t.loAdPlaceingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyword
+        }
+        console.log("参数:",parames)
+        this.$api.ad.getAdPlaceList(parames).then(res=>{
+                _t.loAdPlaceingFlag = 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.tableDataLoAdPlaceingText = "暂无数据";
+                    }
+                }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()
+      },
+      AdPlacedClick(){
+        this.AdPlaceDataForm = {}
+        this.AdPlaceDialogShow = true
+      },
+      //更新分类
+      updateClick(row,index){
+        console.log(row)
+        this.AdPlaceDataForm = row
+        this.rowIndex = index
+        this.AdPlaceDialogShow = true
+      },
+      // AdPlaceDialogShow(){
+      //   this.isloAdPlaceing = false
+      // },
+      closeDlg(val){
+          this.AdPlaceDialogShow = false
+          this.isloAdPlaceing = false
+      },
+      AdPlaceSubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        _t.isloAdPlaceing = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.ad.updateAdPlace(parames).then(res=>{
+                _t.loAdPlaceingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                     this.getList()
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.AdPlaceDialogShow = false
+                this.isloAdPlaceing = false
+            })
+        }else{
+          this.$api.ad.createAdPlace(parames).then(res=>{
+                _t.loAdPlaceingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                    this.getList()
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.AdPlaceDialogShow = false
+                this.isloAdPlaceing = false
+            })
+        }
+       
+      },
+      //删除分类
+      deleteAuthority(row, index) {
+        this.AdPlaceId = row.id
+        this.AdPlaceRowIndex = index
+        this.DialogShow = true
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      },
+      submitSureClickDel(row,index){
+        let _t = this
+        let parames = {
+          'id':this.AdPlaceId
+        }
+        this.$api.ad.delAdPlace(parames).then(res=>{
+          if(res.code==200){
+            this.DialogShow = false
+            _t.tableData.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>

+ 126 - 0
src/views/category/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/category/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>

+ 148 - 0
src/views/city/index.vue

@@ -0,0 +1,148 @@
+<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-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="level" width="100"></el-table-column>
+          <el-table-column label="编码" prop="code" width="200"></el-table-column>
+          <el-table-column label="区号" prop="city_code" width="100"></el-table-column>
+          <el-table-column label="备注" prop="remark" width="200"></el-table-column>
+          <el-table-column label="创建时间" prop="create_time"  width="200"></el-table-column>
+          <el-table-column label="更新时间" prop="update_time" ></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>
+
+
+  </template>
+  <script>
+ 
+  export default {
+
+    data() {
+      return {
+        value:"1",
+        //  站点数据
+        tableData: [],
+        //  加载中数据提示
+        tableDataLoadingText:"拼命加载中······",
+        //  是否显示分页
+        pagination:false,
+        //  每页显示的条数
+        pageSize:15,
+        //  当前页
+        currentPage:1,
+        //  菜单列表数据总条数
+        tableCount:0,
+        keyWord:'',
+        loadingFlag: false,
+        isShowSource: false, // 是否显示来源列
+        id:0,
+        DialogShow: false, //控制删除弹窗
+        cityId:'',
+        cityRowIndex:'',
+        cityDataForm: {},
+        cityTableData: [],
+        isloading:false, //提交按钮状态
+        cityDialogShow: false, // 控制保存弹窗
+      }
+    },
+    mounted() {},
+    methods: {
+      // 获取菜单信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyWord
+        }
+        this.$api.publicApi.getCityList(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("查询失败")
+                }
+            })
+      },
+      // 点击翻页
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getList();
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 15
+        this.getList()
+      }
+
+    },
+    created() {
+        this.getList();
+    }
+  }
+  </script>
+  <style >
+   .demo-form-inline{
+      display: flex;
+   }
+   .demo-form-inline .el-form-item{
+    margin: 0 20px;
+   }
+  </style>
+  
+  

+ 84 - 0
src/views/level/components/edit.vue

@@ -0,0 +1,84 @@
+<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"  placeholder="请输入等级名称"></el-input>
+      </el-form-item>
+
+      <el-form-item label="sort:" prop="sort">
+        <el-input v-model="form.sort"  placeholder="请输入排序" ></el-input>
+      </el-form-item>
+      <el-form-item label="备注信息:" prop="remark">
+        <el-input v-model="form.remark"  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: {
+    userLevelDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+  },
+  data() {
+    let self = this
+    return {
+      userLevelList:[],
+      form: {
+        id:'',
+        name: '',
+        sort:"",
+        remark:"",
+      },
+      menulist: [],
+      Isdisabled: false,
+      rules: {
+        name: [
+          { required: true, message: '等级名称必填' },
+        ]
+      }
+    }
+  },
+  mounted() {
+    if(this.userLevelDataForm) {
+      this.form = Object.assign({} , this.userLevelDataForm)
+    }
+  },
+  methods: {
+    closeDlg() {
+      this.$emit('closeDlg',1)
+    },
+    onSubmit() {
+      let that = this
+      that.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.$emit('userLevelSubmitClick', this.form)
+        }
+      })
+    },
+  }
+}
+</script>
+<style>
+.el-cascader-node>.el-radio{
+  margin-top:25px;
+}
+</style>

+ 259 - 0
src/views/level/index.vue

@@ -0,0 +1,259 @@
+<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="remark" 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="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="userLevelDialogShow = false"
+      @DialogClose="userLevelDialogShow = false"
+      :innerVisible="userLevelDialogShow"
+      @colesClick="userLevelDialogShow  = false"
+  >
+    <editFrom
+        @colesClick="userLevelDialogShow = false"
+        :userLevelDataForm="userLevelDataForm"
+         :isloading="isloading"
+        @userLevelSubmitClick="userLevelSubmitClick"
+        @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,
+        keyWord:'',
+        loadingFlag: false,
+        isShowSource: false, // 是否显示来源列
+        id:0,
+        DialogShow: false, //控制删除弹窗
+        userLevelId:'',
+        userLevelRowIndex:'',
+        userLevelDataForm: {},
+        userLevelTableData: [],
+        isloading:false, //提交按钮状态
+        userLevelDialogShow: false, // 控制保存弹窗
+      }
+    },
+    mounted() {},
+    methods: {
+      // 获取菜单信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyWord
+        }
+        this.$api.publicApi.getUserLevelList(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("查询失败")
+                }
+            })
+      },
+      // 点击翻页
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getList();
+      },
+
+      addClick(){
+        this.userLevelDataForm = {}
+        this.userLevelDialogShow = true
+      },
+      //更新菜单
+      updateClick(row,index){
+        console.log(row)
+        this.userLevelDataForm = row
+        this.rowIndex = index
+        this.userLevelDialogShow = true
+      },
+      // userLevelDialogShow(){
+      //   this.isloading = false
+      // },
+      closeDlg(val){
+      
+          this.userLevelDialogShow = false
+          this.isloading = false
+      },
+      userLevelSubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.publicApi.updateUserLevel(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                    //  location.reload();
+                    this.getList();
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.userLevelDialogShow = false
+                this.isloading = false
+            })
+        }else{
+          this.$api.publicApi.addUserLevel(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                     this.getList();
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.userLevelDialogShow = false
+                this.isloading = false
+            })
+        }
+       
+      },
+      //删除菜单
+      deleteAuthority(row, index) {
+        this.userLevelId = row.id
+        this.userLevelRowIndex = index
+        this.DialogShow = true
+      },
+      submitSureClickDel(row,index){
+        let parames = {
+          'id':this.userLevelId
+        }
+        this.$api.publicApi.delUserLevel(parames).then(res=>{
+          if(res.code==200){
+            this.DialogShow = false
+            this.tableData.splice(index, 1);
+            this.getList()
+          }else{
+            this.$message.error("删除失败")
+          }
+        })
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      }
+
+    },
+    created() {
+        this.getList();
+    }
+  }
+  </script>
+  <style >
+   .demo-form-inline{
+      display: flex;
+   }
+   .demo-form-inline .el-form-item{
+    margin: 0 20px;
+   }
+  </style>
+  
+  

+ 332 - 0
src/views/link/components/edit.vue

@@ -0,0 +1,332 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="所属站点:"
+          prop="website_id"
+      >
+      <el-select
+        v-model="form.website_id"
+        :multiple=false
+        :clearable="true"
+        filterable
+        remote
+        reserve-keyword
+        placeholder="请输入关键词"
+        :remote-method="remoteMethod"
+        :loading="loading">
+        <el-option
+          v-for="item in websiteList"
+          :key="item.id"
+          :label="item.website_name"
+          :value="item.id">
+        </el-option>
+      </el-select>
+    
+      </el-form-item>
+      <el-form-item
+          label="网站名称:"
+          prop="title"
+      >
+        <el-input v-model="form.title"  maxlength="50" placeholder="请输入网站名称"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="网站地址:"
+          prop="url"
+      >
+        <el-input v-model="form.url"  maxlength="50" placeholder="请输入网站地址"></el-input>
+      </el-form-item>
+      <el-form-item  prop="image_url"  >
+          <template v-slot:label >
+            <span  style="display: inline-block">网站LOGO:</span>
+            <el-tooltip
+                class="box-item"
+                effect="dark"
+                content="建议大小:90px*30px  支持格式: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.logo_url" 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="form.logo_url" style="width: 100%;height: 100%;"></div>
+          </div>
+        </el-form-item>
+      <el-form-item
+          label="网站介绍:"
+          prop="describe"
+      >
+        <el-input type="textarea" v-model="form.describe"  maxlength="50" placeholder="请输入网站介绍"></el-input>
+      </el-form-item>
+      <!---1通过,2待审核,3待发 4,拒绝 5删除-->
+      <el-form-item
+          label="状态:"
+          prop="status"
+      >
+      <el-radio-group v-model="form.status">
+          <el-radio :label="1">通过</el-radio>
+          <el-radio :label="2">待审核</el-radio>
+      </el-radio-group>
+      </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: {
+    LinkDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+  },
+  data() {
+    return {
+      form: {
+        website_id:'',//站点ID
+        title:'',//标题
+        url:'',//地址
+        logo_url:'', //图片地址
+        status:1,//状态
+        describe:'', //备注信息
+      },
+      categoryList: [],
+      Isdisabled: false,
+      rules: {
+        website_id: [
+          { required: true, message: '请选择所属站点' },
+        ],
+        title: [
+          {  required: true, message: '网站名称不能为空' },
+        ],
+        url: [
+          {  required: true, message: '网站地址不能为空' },
+        ],
+        status: [
+          {  required: true, message: '请选择状态' },
+        ],
+      },
+      pageSize:20,
+      page:1,
+      keyWord:'',
+      websiteList:[]
+    }
+  },
+  mounted() {
+    if(this.LinkDataForm) {
+      this.form = Object.assign({} , this.LinkDataForm)
+    }
+    this.remoteMethod()
+  },
+  methods: {
+    remoteMethod(keyWord){
+      let _t= this
+      let parames = {
+        'page':this.currentPage,
+        'pageSize':this.pageSize,
+        'keyWord':keyWord
+      }
+      this.$api.website.getWebsiteList(parames).then(res=>{
+                if(res.code==200){
+                  _t.websiteList = res.data.rows
+                }else{
+                    this.$message.error("查询失败")
+                }
+            })
+    },
+    isLinkOk(o){
+        console.log(o)
+        if(o==true){
+            this.isLink = true
+        }else{
+          this.isLink = false
+        }
+    },
+    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('LinkSubmitClick', this.form)
+        }
+      })
+    },
+
+    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.logo_url = 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);
+    },
+    addTag() {
+      if (this.tagInput.trim()) {
+        this.tags.push(this.tagInput.trim());
+        
+        this.tagInput = '';
+      }
+    },
+    removeTag(index) {
+      this.tags.splice(index, 1);
+    }
+  }
+}
+</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>
+
+

+ 280 - 0
src/views/link/index.vue

@@ -0,0 +1,280 @@
+<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="title" width="250"></el-table-column>
+          <el-table-column label="站点名称" prop="website_name" width="250"></el-table-column>
+          <el-table-column label="排序" prop="sort" width="250"></el-table-column>
+          <el-table-column label="状态" prop="status_name" width="100"></el-table-column>
+          <el-table-column label="网站图片"  width="80">
+            <template v-slot="scope">
+              <el-image
+              style="width: 50px; height: 50px"
+              :src="scope.row.logo_url"
+              ></el-image>
+          </template>
+          </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="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="LinkDialogShow = false"
+      @DialogClose="LinkDialogShow = false"
+      :innerVisible="LinkDialogShow"
+      @colesClick="LinkDialogShow  = false"
+  >
+    <editFrom
+        @colesClick="LinkDialogShow = false"
+        :LinkDataForm="LinkDataForm"
+         :isloading="isloading"
+        @LinkSubmitClick="LinkSubmitClick"
+        @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, //控制删除弹窗
+        LinkId:'',
+        LinkRowIndex:'',
+        LinkDataForm: {},
+        LinkTableData: [],
+        isloading:false, //提交按钮状态
+        LinkDialogShow: false, // 控制保存弹窗
+        pid:0,
+        keyword:''
+      }
+    },
+    mounted() {
+     
+    },
+    methods: {
+      // 获取分类信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyword
+        }
+        console.log("参数:",parames)
+        this.$api.link.getLinkList(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.LinkDataForm = {}
+        this.LinkDialogShow = true
+      },
+      //更新分类
+      updateClick(row,index){
+        console.log(row)
+        this.LinkDataForm = row
+        this.rowIndex = index
+        this.LinkDialogShow = true
+      },
+      // LinkDialogShow(){
+      //   this.isloading = false
+      // },
+      closeDlg(val){
+          this.LinkDialogShow = false
+          this.isloading = false
+      },
+      LinkSubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.link.updateLink(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                     this.getList()
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.LinkDialogShow = false
+                this.isloading = false
+            })
+        }else{
+          this.$api.link.createLink(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                    this.getList()
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.LinkDialogShow = false
+                this.isloading = false
+            })
+        }
+       
+      },
+      //删除分类
+      deleteAuthority(row, index) {
+        this.LinkId = row.id
+        this.LinkRowIndex = index
+        this.DialogShow = true
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      },
+      submitSureClickDel(row,index){
+        let _t = this
+        let parames = {
+          'id':this.LinkId
+        }
+        this.$api.link.delLink(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>

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

@@ -56,9 +56,11 @@
             this.$api.login.loginApi(parames).then(res=>{
                 console.log(res)
                 if(res.code==200){
+                 
                   document.setCookie("token",res.data.token,86400)
+              
                   this.$message.success('登录成功')
-                   this.$router.push("/home")
+                   this.$router.push("/left/websiteList")
                 }else{
                     this.$message.error("登录失败")
                 }

+ 101 - 0
src/views/member/components/addEdit.vue

@@ -0,0 +1,101 @@
+<template>
+    <div>
+      <el-form  label-width="120px">
+        <el-form-item
+            label="用户类型:"
+            prop="type_id"
+        >
+          <el-radio-group v-model="type_id" >
+                <el-radio :label="1">个人会员</el-radio>
+                <el-radio :label="2">政务会员</el-radio>
+                <!-- <el-radio :label="3">企业会员</el-radio> -->
+         </el-radio-group>
+        </el-form-item>
+        <!---添加-->
+        <Personal     v-if="type_id==1 && !this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick" @closeDlg="closeDlg">
+        </Personal>
+         <GovernmentAffairs     v-if="type_id==2 && !this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick"     @closeDlg="closeDlg"   >
+        </GovernmentAffairs>
+
+        <!--修改-->
+        <PersonalEdit     v-if="type_id==1 && this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick" @closeDlg="closeDlg">
+        </PersonalEdit>
+         <GovernmentAffairsEdit     v-if="type_id==2  && this.memberDataForm.id"  :memberDataForm="memberDataForm"  @SubmitClick="SubmitClick"      @closeDlg="closeDlg"  >
+        </GovernmentAffairsEdit>
+       <!-- <Enterprise         v-if="type_id==3"     @SubmitClick="SubmitClick">
+        </Enterprise> -->
+       
+      </el-form>
+    </div>
+  </template>
+  <script>
+    // import Enterprise from "./enterprise";
+    import GovernmentAffairs from "./governmentAffairs";
+    import Personal from "./personal";
+    import GovernmentAffairsEdit from "./governmentAffairsEdit";
+    import PersonalEdit from "./personalEdit";
+  export default {
+    props: {
+      memberDataForm: {
+      type: Object,
+      default: () => {}
+    },
+    isloading:{
+      type:Boolean,
+      default: true
+    },
+    closeDlg:{
+      type:Function
+    }
+    },
+    components: {
+        // Enterprise,
+        GovernmentAffairs,
+        Personal,
+        GovernmentAffairsEdit,
+        PersonalEdit,
+    },
+    data() {
+      let self = this
+      return {
+        type_id:1
+      }
+    },
+    mounted() {
+        console.log("接收数据:",this.memberDataForm)
+        if(this.memberDataForm) {
+          this.form = Object.assign({} , this.memberDataForm)
+          this.type_id = this.memberDataForm.type_id
+        }
+    },
+    methods: {
+      closeDlg() {
+        // this.isloading = false
+        console.log("addEdit提交")
+        this.$emit('closeDlg',1)
+      },
+   
+      accountType(){
+       
+        console.log(this.type_id)
+      },
+      SubmitClick(data){
+      
+        data['type_id'] = this.type_id
+        console.log("提交数据:",data)
+        this.$emit('memberSubmitClick',data)
+      }
+
+      
+    }
+  }
+  </script>
+  <style>
+  /* .el-cascader-node>.el-radio{
+    margin-top:25px;
+  } */
+  .el-radio-group{
+    line-height: 46px;
+  }
+  </style>
+  

+ 122 - 0
src/views/member/components/enterprise.vue

@@ -0,0 +1,122 @@
+<template>
+    <div>
+      <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+        <el-form-item
+            label="栏目名称:"
+            prop="column_name"
+        >
+          <el-input v-model.number="form.column_name"  placeholder="请输入栏目名称"></el-input>
+        </el-form-item>
+        <el-form-item
+            label="父级栏目:"
+            prop="column_arr_id"
+        >
+        <el-cascader
+        v-model="form.column_arr_id"
+        :options="websiteColumnList"
+        :props="{
+                  checkStrictly: true,
+                  value:'id',
+                  label:'column_name',
+                  children:'children',
+                }" 
+        clearable></el-cascader>
+      </el-form-item>
+        <el-form-item label="sort:" prop="sort">
+          <el-input v-model="form.sort"  placeholder="请输入排序" ></el-input>
+        </el-form-item>
+        <el-form-item label="备注信息:" prop="remark">
+          <el-input v-model="form.remark"  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: {
+      websiteColumnDataForm: {
+        type: Object,
+        default: () => {}
+      },
+      isloading:{
+        type:Boolean,
+        default: true
+      },
+      closeDlg:{
+        type:Function
+      }
+    },
+    data() {
+      let self = this
+      return {
+        websiteColumnList:[],
+        form: {
+          id:'',
+          column_name: '',
+          column_arr_id:[0],
+          sort:"",
+          remark:"",
+        },
+        menulist: [],
+        Isdisabled: false,
+        rules: {
+          column_name: [
+            { required: true, message: '栏目名称必填' },
+          ],
+          column_arr_id: [
+            { required: true, message: '请选择栏目' }
+          ]
+        }
+      }
+    },
+    mounted() {
+      if(this.websiteColumnDataForm) {
+        this.form = Object.assign({} , this.websiteColumnDataForm)
+        this.form.column_arr_id =  this.websiteColumnDataForm.column_arr_id
+      }
+  
+      this.getwebsiteColumnColumnList()
+    },
+    methods: {
+      closeDlg() {
+        // this.isloading = false
+        console.log("edit提交")
+        this.$emit('closeDlg',1)
+      },
+      onSubmit() {
+        let that = this
+        that.$refs['form'].validate((valid) => {
+          if (valid) {
+            this.$emit('websiteColumnSubmitClick', this.form)
+          }
+        })
+      },
+      getwebsiteColumnColumnList(){
+        let _t= this
+        let parames = {}
+       this.$api.website.websiteColumnList(parames).then(res=>{
+                  if(res.code==200){
+                     console.log(res.data)
+                    _t.websiteColumnList = res.data
+                  }else{
+                      this.$message.error("查询失败")
+                  }
+              })
+      },
+  
+      
+    }
+  }
+  </script>
+  <style>
+  .el-cascader-node>.el-radio{
+    margin-top:25px;
+  }
+  </style>
+  

+ 421 - 0
src/views/member/components/governmentAffairs.vue

@@ -0,0 +1,421 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="职务:"
+          prop="job"
+      >
+        <el-input v-model="form.job"  placeholder="请输入职务"></el-input>
+      </el-form-item>
+      <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"
+      >
+        <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: {
+        job:'',//职务
+        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: {
+        job: [
+          { required: true, message: '职务名称必填' }
+        ],
+        user_name: [
+          { required: true, message: '用户名称必填' },
+          { validator: this.checkName, trigger: "blur" }
+        ],
+
+        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)
+      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
+      }
+      _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("edit提交")
+      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>
+

+ 459 - 0
src/views/member/components/governmentAffairsEdit.vue

@@ -0,0 +1,459 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="职务:"
+          prop="job"
+      >
+        <el-input v-model="form.job"  placeholder="请输入职务"></el-input>
+      </el-form-item>
+      <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="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: {
+        job:'',//职务
+        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: {
+        job: [
+          { required: true, message: '职务名称必填' }
+        ],
+        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() {
+      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) {
+          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>
+

+ 408 - 0
src/views/member/components/personal.vue

@@ -0,0 +1,408 @@
+<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"
+      >
+        <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:[],//城市
+      },
+      cascaderKey:0,
+      avatarUrl:'',
+      menulist: [],
+      Isdisabled: false,
+      rules: {
+        user_name: [
+          { required: true, message: '用户名称必填' },
+          { validator: this.checkName, trigger: "blur" }
+        ],
+        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/personalEdit.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>
+

+ 282 - 0
src/views/member/index.vue

@@ -0,0 +1,282 @@
+<template>
+    <div class="main-content__div">
+      <div class="table-box__div" >
+      <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="100" prop="id"></el-table-column>
+          <el-table-column label="头像"  width="80">
+            <template v-slot="scope">
+              <el-image
+              style="width: 50px; height: 50px"
+              :src="scope.row.avatar"
+              ></el-image>
+          </template>
+          </el-table-column>
+          <el-table-column label="会员名" prop="user_name" width="100"></el-table-column>
+          <el-table-column label="会员类型" prop="type_name" width="100"></el-table-column>
+          <el-table-column label="状态" prop="status_name" width="100"></el-table-column>
+          <el-table-column label="会员等级" prop="level_name" width="100"></el-table-column>
+          <el-table-column label="性别" prop="gender_name" width="100"></el-table-column>
+          <el-table-column label="真实姓名" prop="real_name" width="100"></el-table-column>
+          <el-table-column label="手机" prop="mobile" width="150"></el-table-column>
+          <el-table-column label="职务" prop="job" width="150"></el-table-column>
+          <el-table-column label="邮箱" prop="email" width="150"></el-table-column>
+          <el-table-column label="更新时间" prop="updated_at" width="180"></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="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="memberDialogShow = false"
+      @DialogClose="memberDialogShow = false"
+      :innerVisible="memberDialogShow"
+      @colesClick="memberDialogShow  = false"
+  >
+    <addEdit
+        @colesClick="memberDialogShow = false"
+        :memberDataForm="memberDataForm"
+         :isloading="isloading"
+        @memberSubmitClick="memberSubmitClick"
+        @closeDlg="closeDlg"
+        >
+    </addEdit>
+  </DialogSlot>
+  </template>
+  <script>
+  import Dialog from "../../components/dialog";
+  import addEdit from "./components/addEdit";
+  import DialogSlot from "../../components/DialogSlot";
+  export default {
+    components: {
+      Dialog,
+      addEdit,
+      DialogSlot
+    },
+    data() {
+      return {
+        value:"1",
+        //  站点数据
+        tableData: [],
+        //  加载中数据提示
+        tableDataLoadingText:"拼命加载中······",
+        //  是否显示分页
+        pagination:false,
+        //  每页显示的条数
+        pageSize:10,
+        //  当前页
+        currentPage:1,
+        //  菜单列表数据总条数
+        tableCount:0,
+        //关键字
+        keyWord:'',
+        loadingFlag: false,
+      
+    
+        RowIndex:'',
+        DataForm: {},
+  
+        isloading:false, //提交按钮状态
+        addDialogShow: false, // 控制保存弹窗
+
+
+
+        DialogShow: false, //控制删除弹窗
+        memberDialogShow: false, // 控制保存弹窗
+      }
+    },
+    mounted() {},
+    methods: {
+      // 获取用户信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyWord
+        }
+        this.$api.user.getUserList(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("查询失败")
+                }
+            })
+      },
+      // 点击翻页
+      handleCurrentChange(val) {
+        this.currentPage = val;
+        this.getList();
+      },
+
+      addClick(){
+        this.memberDataForm = {}
+        this.memberDialogShow = true
+      },
+
+      //更新菜单
+      updateClick(row,index){
+        this.memberDataForm = row
+        this.rowIndex = index
+        this.memberDialogShow = true
+      },
+      closeDlg(val){
+        this.memberDialogShow = false
+        this.DialogShow = false
+        this.isloading = false
+  },
+  memberSubmitClick(data){
+        let _t = this
+        console.log("提交数据",data)
+        let parames = data
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.user.updateUser(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                  _t.tableData[_t.rowIndex] = parames
+                     console.log("修改成功")
+                    //  location.reload();
+                    this.getList();
+                }else{
+                    this.$message.error("修改失败")
+                }
+                this.memberDialogShow = false
+                this.DialogShow = false
+                this.isloading = false
+            })
+        }else{
+          this.$api.user.createUser(parames).then(res=>{
+                _t.loadingFlag = false;
+                if(res.code==200){
+                     console.log("创建成功")
+                     this.getList();
+                }else{
+                    this.$message.error(res.message)
+                }
+                this.memberDialogShow = false
+                this.DialogShow = false
+                this.isloading = false
+            })
+        }
+       
+      },
+      //删除菜单
+      deleteAuthority(row, index) {
+        this.Id = row.id
+        this.RowIndex = index
+        this.DialogShow = true
+      },
+      submitSureClickDel(row,index){
+        let parames = {
+          'id':this.Id
+        }
+        this.$api.user.delUser(parames).then(res=>{
+          if(res.code==200){
+            this.DialogShow = false
+            this.tableData.splice(index, 1);
+            this.getList()
+          }else{
+            this.$message.error("删除失败")
+          }
+        })
+      },
+      //审核
+      toExamine(){
+
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      }
+
+    },
+    created() {
+        this.getList();
+    }
+  }
+  </script>
+  <style >
+   .demo-form-inline{
+      display: flex;
+   }
+   .demo-form-inline .el-form-item{
+    margin: 0 20px;
+   }
+  </style>
+  
+  

+ 3 - 3
src/views/menu/components/edit.vue

@@ -88,9 +88,9 @@ export default {
         label: [
           { required: true, message: '菜单名称必填' },
         ],
-        url: [
-          { required: true, message: '路由地址必填' }
-        ],
+        // url: [
+        //   { required: true, message: '路由地址必填' }
+        // ],
         sort: [
           { pattern: /^[1-9]\d*$/, message: '排序值格式错误' },
         ]

+ 3 - 3
src/views/menu/index.vue

@@ -43,9 +43,9 @@
               ></el-switch>
             </template>
           </el-table-column>
-          <el-table-column   prop="" label="操作" align="center" >
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="200">
                   <template v-slot="scope">
-                    <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
+                    <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>
@@ -242,7 +242,7 @@
             // row.splice(index, 1);
             this.getList()
           }else{
-            this.$message.error("删除失败")
+            this.$message.error(res.message)
           }
         })
       }

+ 417 - 0
src/views/news/components/edit.vue

@@ -0,0 +1,417 @@
+<template>
+  <div>
+    <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
+      <el-form-item
+          label="所属分类:"
+          prop="catid"
+      >
+      <el-cascader
+      v-model="form.catid"
+      :options="categoryList"
+      :props="{
+                checkStrictly: true,
+                value:'id',
+                label:'name',
+                children:'children',
+              }" 
+      clearable></el-cascader>
+      <el-checkbox style="margin-left:10px;" v-model="form.islink"   @change="isLinkOk">外部链接</el-checkbox>
+      </el-form-item>
+      <el-form-item
+          label="资讯标题:"
+          prop="title"
+      >
+        <el-input v-model="form.title"  maxlength="50" placeholder="请输入资讯标题"></el-input>
+       
+      </el-form-item>
+      <el-form-item
+          label="推荐等级:"
+          prop="level"
+      >
+        <el-select v-model="form.level" placeholder="请选择">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </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="建议大小:400px*600px  支持格式: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.imgurl" 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="form.imgurl" style="width: 100%;height: 100%;"></div>
+          </div>
+        </el-form-item>
+      <el-form-item
+          v-if="isLink==true"
+          label="链接地址:"
+          prop="form"
+      >
+        <el-input v-model="form.linkurl"  maxlength="50" placeholder="请输入链接地址"></el-input>
+      </el-form-item>
+     <el-form-item  
+     v-if="isLink==false"
+      label="资讯内容:"
+      prop="content">
+      <Editor @input="handelIncrease" :ContentValue="ContentValue" :value="value"></Editor>
+     </el-form-item>
+
+      <el-form-item label="资讯简介:" prop="introduce">
+        <el-input  type="textarea" v-model="form.introduce" maxlength="80"
+        show-word-limit  placeholder="输入简介" ></el-input>
+      </el-form-item>
+      <el-form-item
+          label="作者:"
+          prop="author"
+      >
+        <el-input v-model="form.author"  maxlength="50" placeholder="请输入作者"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="来源:"
+          prop="copyfrom"
+      >
+        <el-input v-model="form.copyfrom"  maxlength="50" placeholder="请输入来源"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="来源链接:"
+          prop="fromurl"
+      >
+        <el-input v-model="form.fromurl"  maxlength="50" placeholder="请输入来源链接"></el-input>
+      </el-form-item>
+      <el-form-item
+          label="标签:"
+          prop="tag"
+      >
+          <el-input
+          v-model="tagInput"
+          placeholder="输入标签"
+          @keyup.enter="addTag"
+        ></el-input>
+        <el-tag
+          v-for="(tag, index) in tags"
+          :key="index"
+          closable
+          :disable-transitions="false"
+          @close="removeTag(index)"
+        >
+          {{ tag }}
+        </el-tag>
+
+      </el-form-item>
+      <!---1通过,2待审核,3待发 4,拒绝 5删除-->
+      <el-form-item
+          label="资讯状态:"
+          prop="status"
+      >
+      <el-radio-group v-model="form.status">
+          <el-radio :label="1">通过</el-radio>
+          <el-radio :label="2">待审核</el-radio>
+          <el-radio :label="3">待发</el-radio>
+          <el-radio :label="4">拒绝</el-radio>
+          <el-radio :label="5">删除</el-radio>
+      </el-radio-group>
+      </el-form-item>
+      <el-form-item
+          label="浏览次数:"
+          prop="hits"
+      >
+        <el-input v-model.number="form.hits"  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 {
+      isLink:false,
+      ContentValue:'',
+      //级别:1 推荐文章,2:幻灯图片 3:推荐图文 4:头条相关 5:头条推荐 6:6级 7:7级
+      options: [{
+          value: '0',
+          label: '暂无推荐'
+        },{
+          value: '1',
+          label: '推荐文章'
+        }, {
+          value: '2',
+          label: '幻灯图片'
+        }, {
+          value: '3',
+          label: '推荐图文'
+        }, {
+          value: '4',
+          label: '头条相关'
+        }, {
+          value: '5',
+          label: '头条推荐'
+        }],
+      form: {
+        catid:'',//分类ID
+        title:'',//标题
+        author:'',//作者
+        status:1, //状态
+        hits:0,//浏览量
+        tag:[], //标签
+        islink: '',//是否外链
+        linkurl:'',//外链链接地址
+        content:'',//内容
+        imgurl:'',//图片地址
+        level:'',//推荐等级
+        author:'',//作者
+        copyfrom:'',//来源
+        fromurl:'',//来源链接
+      },
+      categoryList: [],
+      Isdisabled: false,
+      rules: {
+        catid: [
+          { required: true, message: '请选择所属分类' },
+        ],
+        title: [
+          {  required: true, message: '资讯标题不能为空' },
+        ],
+        author: [
+          {  required: true, message: '作者不能为空' },
+        ],
+      },
+      tagInput: '',
+      tags: [],
+      value:''
+    }
+  },
+  mounted() {
+    if(this.ArticleDataForm) {
+      this.form = Object.assign({} , this.ArticleDataForm)
+      // this.form.status = 1
+      this.tags = this.form.tag
+      this.ContentValue = this.form.content
+      console.log("内容:",this.ContentValue)
+      this.isLink = this.form.islink
+    }
+    this.getRecursionCategory()
+  },
+  methods: {
+    isLinkOk(o){
+        console.log(o)
+        if(o==true){
+            this.isLink = true
+        }else{
+          this.isLink = false
+        }
+    },
+    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)
+        }
+      })
+    },
+    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("查询失败")
+                }
+            })
+    },
+    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.imgurl = 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);
+    },
+    addTag() {
+      if (this.tagInput.trim()) {
+        this.tags.push(this.tagInput.trim());
+        
+        this.tagInput = '';
+      }
+    },
+    removeTag(index) {
+      this.tags.splice(index, 1);
+    }
+  }
+}
+</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>
+
+

+ 280 - 0
src/views/news/index.vue

@@ -0,0 +1,280 @@
+<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="title" width="250"></el-table-column>
+          <el-table-column label="资讯分类" prop="name" width="250"></el-table-column>
+          <el-table-column label="作者" prop="author" width="250"></el-table-column>
+          <el-table-column label="状态" prop="status_name" width="100"></el-table-column>
+          <el-table-column label="资讯图片"  width="80">
+            <template v-slot="scope">
+              <el-image
+              style="width: 50px; height: 50px"
+              :src="scope.row.imgurl"
+              ></el-image>
+          </template>
+          </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="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="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 {
+        value:"1",
+        //  分类列表数据
+        tableData: [],
+        //  加载中数据提示
+        tableDataLoadingText:"拼命加载中······",
+        //  是否显示分页
+        pagination:false,
+        //  每页显示的条数
+        pageSize:10,
+        //  当前页
+        currentPage:1,
+        //  分类列表数据总条数
+        tableCount:0,
+  
+        loadingFlag: false,
+        isShowSource: false, // 是否显示来源列
+        id:0,
+        DialogShow: false, //控制删除弹窗
+        ArticleId:'',
+        ArticleRowIndex:'',
+        ArticleDataForm: {},
+        ArticleTableData: [],
+        isloading:false, //提交按钮状态
+        ArticleDialogShow: false, // 控制保存弹窗
+        pid:0,
+        keyword:''
+      }
+    },
+    mounted() {
+     
+    },
+    methods: {
+      // 获取分类信息列表
+      getList:function(){
+        let _t = this;
+        _t.loadingFlag = true;
+        let parames = {
+            'page':this.currentPage,
+            'pageSize':this.pageSize,
+            'keyWord':this.keyword
+        }
+        console.log("参数:",parames)
+        this.$api.news.getArticleList(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.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
+        _t.isloading = true
+        //有id更新,没有新增
+        if(parames.id){
+          this.$api.news.updateArticle(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
+            })
+        }
+       
+      },
+      //删除分类
+      deleteAuthority(row, index) {
+        this.ArticleId = row.id
+        this.ArticleRowIndex = index
+        this.DialogShow = true
+      },
+      searchFrom(){
+        this.currentPage = 1
+        this.pageSize = 10
+        this.getList()
+      },
+      submitSureClickDel(row,index){
+        let _t = this
+        let parames = {
+          'id':this.ArticleId
+        }
+        this.$api.news.delArticle(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>

+ 3 - 3
src/views/role/index.vue

@@ -38,10 +38,10 @@
           <el-table-column label="角色名称" prop="role_name" width="350"></el-table-column>
           <el-table-column label="角色备注" prop="remark" width="300"></el-table-column>
           <el-table-column label="操作时间" prop="updated_at" width="300"></el-table-column>
-          <el-table-column label="排序" prop="sort" width="300"></el-table-column>
-          <el-table-column   prop="" label="操作" align="center">
+          <el-table-column label="排序" prop="sort" width="50"></el-table-column>
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="200">
                   <template v-slot="scope">
-                    <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;"  v-if="scope.row.rule[0]!='0'">
+                    <div style="display: flex;flex-direction: row;justify-content: center;align-items: center;"  v-if="scope.row.rule[0]!='0'">
                       <span class="btn"  @click="assignPermissions(scope.row, scope.$index)">分配权限</span>
                       <span class="btn"  @click="updateClick(scope.row, scope.$index)">编辑</span>
                       <span class="btn"  @click="deleteAuthority(scope.row,scope.$index)">删除</span>

+ 1 - 2
src/views/website/components/edit.vue

@@ -5,7 +5,7 @@
           label="站点名称:"
           prop="website_name"
       >
-        <el-input v-model.number="form.website_name"  placeholder="请输入站点名称"></el-input>
+        <el-input v-model="form.website_name"  placeholder="请输入站点名称"></el-input>
       </el-form-item>
       <el-form-item
           label="父级栏目:"
@@ -168,7 +168,6 @@ export default {
       })
     },
     getWebsiteColumnList(){
-      console.log("fuck you =======")
       let _t= this
       let parames = {}
      this.$api.website.websiteColumnList(parames).then(res=>{

+ 8 - 11
src/views/website/index.vue

@@ -35,13 +35,13 @@
           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="website_name" width="250"></el-table-column>
+          <el-table-column label="编号" width="50" prop="id"></el-table-column>
+          <el-table-column label="站点名称" prop="website_name" width="200"></el-table-column>
           <el-table-column label="站点栏目" prop="column_name" width="200"></el-table-column>
-          <el-table-column label="站点logo" prop="logo" width="200"></el-table-column>
+          <el-table-column label="站点logo" prop="logo" width="100"></el-table-column>
           <el-table-column label="站点地址" prop="website_url" width="200"></el-table-column>
-          <el-table-column label="站点城市" prop="name" width="200"></el-table-column>
-          <el-table-column label="站点状态" width="200"  prop="is_links">
+          <el-table-column label="站点城市" prop="name" width="100"></el-table-column>
+          <el-table-column label="站点状态" width="150"  prop="is_links">
             <template v-slot="{row}">
               <el-switch
                 v-model="row.status"
@@ -51,10 +51,10 @@
               ></el-switch>
             </template>
           </el-table-column>
-          <el-table-column label="创建时间" prop="created_at" width="200"></el-table-column>
-          <el-table-column   prop="" label="操作" align="center" >
+          <el-table-column label="创建时间" prop="created_at" width="350"></el-table-column>
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="200">
                   <template v-slot="scope">
-                    <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
+                    <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="deleteAuthority(scope.row,scope.$index)">删除</span>
                       <span class="btn"  @click="websiteRoleClick(scope.row)">站点角色</span>
@@ -185,9 +185,6 @@
         this.rowIndex = index
         this.websiteDialogShow = true
       },
-      // websiteDialogShow(){
-      //   this.isloading = false
-      // },
       closeDlg(val){
       
           this.websiteDialogShow = false

+ 1 - 1
src/views/websiteColumn/components/edit.vue

@@ -98,7 +98,7 @@ export default {
       })
     },
     getwebsiteColumnColumnList(){
-      console.log("fuck you =======")
+
       let _t= this
       let parames = {}
      this.$api.website.websiteColumnList(parames).then(res=>{

+ 2 - 2
src/views/websiteColumn/index.vue

@@ -42,9 +42,9 @@
           <el-table-column label="备注" prop="remark" width="200"></el-table-column>
           <el-table-column label="更新时间" prop="updated_at" width="200"></el-table-column>
 
-          <el-table-column   prop="" label="操作" align="center" >
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="200">
                   <template v-slot="scope">
-                    <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
+                    <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="deleteAuthority(scope.row,scope.$index)">删除</span>
                     </div>

+ 15 - 18
src/views/websiteRole/index.vue

@@ -34,15 +34,15 @@
           style="width: 100%;font-size: 15px;"
           :header-cell-style="{background:'#FAFAFA'}"
         >
-          <el-table-column label="编号" width="250" prop="id"></el-table-column>
+          <el-table-column label="编号" width="250" prop="website_role_id"></el-table-column>
           <el-table-column label="角色名称" prop="role_name" width="350"></el-table-column>
           <el-table-column label="角色备注" prop="remark" width="300"></el-table-column>
-          <el-table-column label="操作时间" prop="updated_at" width="300"></el-table-column>
-          <el-table-column label="排序" prop="sort" width="300"></el-table-column>
-          <el-table-column   prop="" label="操作" align="center">
+          <el-table-column label="操作时间" prop="updated_at" width="200"></el-table-column>
+          <el-table-column label="排序" prop="sort" 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: column;justify-content: center;align-items: center;" >
-                      <span class="btn"  @click="assignPermissions(scope.row, scope.$index)">添加用户</span>
+                    <div style="display: flex;flex-direction: row;justify-content: center;align-items: center;" >
+                      <span class="btn"  @click="addUser(scope.row)">添加用户</span>
                       <span class="btn"  @click="deleteAuthority(scope.row,scope.$index)">删除</span>
                     </div>
                   </template>
@@ -142,7 +142,7 @@
             'keyword':this.keyword,
             'id':this.websiteId
         }
-        this.$api.website.getAdminWebsiteRoleList(parames).then(res=>{
+        this.$api.website.getWebsiteRoleList(parames).then(res=>{
                 _t.loadingFlag = false;
                 if(res.code==200){
                   if(res.data.rows.length==0){
@@ -189,12 +189,12 @@
         let _t = this
         console.log("提交数据",data)
         let parames = {
-          type_id:data.role_id,
-          type:'1',
+          role_id:data.role_id,
+          type:1,
           website_id:this.websiteId
         }
         _t.isloading = true
-        this.$api.website.createAdminWebsiteRoleUser(parames).then(res=>{
+        this.$api.website.createWebsiteRole(parames).then(res=>{
               _t.loadingFlag = false;
               if(res.code==200){
                     console.log("创建成功")
@@ -209,7 +209,7 @@
    
       //删除站点角色
       deleteAuthority(row, index) {
-        this.websiteRoleId = row.website_role_user_id
+        this.websiteRoleId = row.website_role_id
         this.roleRowIndex = index
         this.DialogShow = true
       },
@@ -217,7 +217,7 @@
         let parames = {
           'id':this.websiteRoleId
         }
-        this.$api.website.delAdminWebsiteRoleUser(parames).then(res=>{
+        this.$api.website.delWebsiteRole(parames).then(res=>{
           if(res.code==200){
             this.DialogShow = false
             this.getList()
@@ -231,13 +231,10 @@
         this.pageSize = 10
         this.getList()
       },
-      assignPermissions(row,index){
-        console.log(row)
-        this.authorityDataForm = row
-        this.rowIndex = index
-        this.authorityDialogShow = true
+      addUser(row){
+        console.log("角色id::",row.role_id)
+          this.$router.push('/left/websiteRoleUser/'+row.website_id+'/'+row.role_id);
       }
-
     },
     created() {
         //赋值站点id

+ 8 - 8
src/views/websiteRoleUser/components/edit.vue

@@ -2,11 +2,11 @@
   <div>
     <el-form ref="form" :rules="rules"  :model="form" label-width="120px">
       <el-form-item
-          label="角色名称:"
+          label="用户名称:"
           prop="role_id"
       >
       <el-select
-          v-model="form.role_id"
+          v-model="form.user_id"
           :multiple = "false"
           filterable
           remote
@@ -17,7 +17,7 @@
           <el-option
             v-for="item in options"
             :key="item.id"
-            :label="item.role_name"
+            :label="item.user_name"
             :value="item.id">
           </el-option>
         </el-select>
@@ -52,12 +52,12 @@ export default {
       options: [],
       loading: false,
       form: {
-        role_id: ''
+        user_id: ''
       },
       Isdisabled: false,
       rules: {
-        role_id: [
-          { required: true, message: '角色名称必填' },
+        user_id: [
+          { required: true, message: '用户名称必填' },
         ]
       }
     }
@@ -78,11 +78,11 @@ export default {
         let parames = {
             'keyword':query
         }
-        this.$api.user.roleList(parames).then(res=>{
+        this.$api.user.getUserList(parames).then(res=>{
                 _t.loading = false;
                 if(res.code==200){
                   if(res.data.rows.length==0){
-                    this.$message.error("没找到该角色!!!")
+                    this.$message.error("没找到该用户!!!")
                     return
                   }
                   this.options = res.data.rows

+ 27 - 19
src/views/websiteRoleUser/index.vue

@@ -34,14 +34,15 @@
           style="width: 100%;font-size: 15px;"
           :header-cell-style="{background:'#FAFAFA'}"
         >
-          <el-table-column label="编号" width="250" prop="id"></el-table-column>
+          <el-table-column label="编号" width="250" prop="website_role_user_id"></el-table-column>
+          <el-table-column label="用户名" width="250" prop="user_name"></el-table-column>
+          <el-table-column label="手机号码" width="250" prop="mobile"></el-table-column>
+          <el-table-column label="邮箱" width="250" prop="email"></el-table-column>
           <el-table-column label="角色名称" prop="role_name" width="350"></el-table-column>
-          <el-table-column label="角色备注" prop="remark" width="300"></el-table-column>
-          <el-table-column label="操作时间" prop="updated_at" width="300"></el-table-column>
-          <el-table-column label="排序" prop="sort" width="300"></el-table-column>
-          <el-table-column   prop="" label="操作" align="center">
+          <el-table-column label="操作时间" prop="user_update_at" width="300"></el-table-column>
+          <el-table-column   prop="" label="操作" align="center"  fixed="right" width="200">
                   <template v-slot="scope">
-                    <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;" >
+                    <div style="display: flex;flex-direction: row;justify-content: center;align-items: center;" >
                       <span class="btn"  @click="deleteAuthority(scope.row,scope.$index)">删除</span>
                     </div>
                   </template>
@@ -60,7 +61,7 @@
         </div>
       </div>
     </div>
-  <Dialog title="温馨提示" content="您确认要删除该角色吗?"
+  <Dialog title="温馨提示" content="您确认要删除该角色用户吗?"
           @close="DialogShow = false"
           @submitSureClick="submitSureClickDel"
           @DialogFalse="DialogShow = false"
@@ -126,7 +127,9 @@
         authorityDialogShow:false,
         authorityDataForm: {},
         keyword:'',
-        websiteId:''
+        websiteId:'',
+        roleId:'',
+        websiteRoleUserId:''
       }
     },
     mounted() {},
@@ -139,13 +142,14 @@
             'page':this.currentPage,
             'pageSize':this.pageSize,
             'keyword':this.keyword,
-            'id':this.websiteId
+            'website_id':this.websiteId,
+            'role_id':this.roleId
         }
-        this.$api.website.getAdminWebsiteRoleList(parames).then(res=>{
+        this.$api.website.getWebsiteRoleUserList(parames).then(res=>{
                 _t.loadingFlag = false;
                 if(res.code==200){
                   if(res.data.rows.length==0){
-                    this.$message.error("没找到该角色!!!")
+                    this.$message.error("没有数据!!!")
                     return
                   }
                     _t.tableData = res.data.rows;
@@ -188,15 +192,17 @@
         let _t = this
         console.log("提交数据",data)
         let parames = {
-          type_id:data.role_id,
+          user_id:data.user_id,
           type:'1',
-          website_id:this.websiteId
+          website_id:this.websiteId,
+          role_id:this.roleId
         }
         _t.isloading = true
-        this.$api.website.createAdminWebsiteRoleUser(parames).then(res=>{
+        this.$api.website.createWebsiteRoleUser(parames).then(res=>{
               _t.loadingFlag = false;
               if(res.code==200){
                     console.log("创建成功")
+                   
                     this.getList()
               }else{
                   this.$message.error(res.message)
@@ -208,17 +214,18 @@
    
       //删除站点角色
       deleteAuthority(row, index) {
-        this.websiteRoleId = row.website_role_user_id
+        this.websiteRoleUserId = row.website_role_user_id
         this.roleRowIndex = index
         this.DialogShow = true
       },
       submitSureClickDel(row,index){
         let parames = {
-          'id':this.websiteRoleId
+          'id':this.websiteRoleUserId
         }
-        this.$api.website.delAdminWebsiteRoleUser(parames).then(res=>{
+        this.$api.website.delWebsiteRoleUser(parames).then(res=>{
           if(res.code==200){
             this.DialogShow = false
+            this.tableData.splice(index, 1);
             this.getList()
           }else{
             this.$message.error("删除失败")
@@ -240,8 +247,9 @@
     },
     created() {
         //赋值站点id
-        this.websiteId = this.$route.params.Id;
-        console.log("接收参数:",this.$route.params.Id);
+        this.websiteId = this.$route.params.websiteId;
+        this.roleId = this.$route.params.roleId;
+        console.log("接收参数:",this.$route.params.websiteId);
         this.getList();
   
     }

+ 1 - 1
vue.config.js

@@ -3,7 +3,7 @@ const path = require("path")
 module.exports = {
   publicPath: '/',
   devServer: {
-    host: 'localhost',
+    host: '192.168.31.6',
     port: 8099,
     // allowedHosts: [
     //   '192.168.131.193:9501'

Некоторые файлы не были показаны из-за большого количества измененных файлов