Tang 2 lat temu
rodzic
commit
734069e5fd

+ 1 - 1
README.md

@@ -7,7 +7,7 @@ npm install
 
 ### Compiles and hot-reloads for development
 ```
-npm run serve
+npm run dev
 ```
 
 ### Compiles and minifies for production

+ 122 - 0
src/api/XfSysBussiness.js

@@ -28,6 +28,15 @@ export default {
             tokenName
         })
     },
+    //删除前台导航信息
+    XfSysBussinessDelMenu(data) {
+        return request({
+            url: '/api/XfSysBussiness/DelMenu',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
 
     //新闻列表
     XfSysBussinessGetNewsList(data) {
@@ -83,6 +92,42 @@ export default {
             tokenName
         })
     },
+    //首页新闻展示模块 设置列表
+    XfSysBussinessGetNewPositionList(data) {
+        return request({
+            url: '/api/XfSysBussiness/GetNewPositionList',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+    //首页新闻展示模块 保存选中关联新闻
+    XfSysBussinessSaveSelectPosition(data) {
+        return request({
+            url: '/api/XfSysBussiness/SaveSelectPosition',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+    //首页新闻展示模块 更新排序
+    XfSysBussinessUpdateSortNumber(data) {
+        return request({
+            url: '/api/XfSysBussiness/UpdateSortNumber',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+    //首页新闻展示模块 更改状态
+    XfSysBussinessEditNewPositionStatus(data) {
+        return request({
+            url: '/api/XfSysBussiness/EditNewPositionStatus',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
     //会员列表
     XfSysBussinessGetMemberList(data) {
         return request({
@@ -155,4 +200,81 @@ export default {
             tokenName
         })
     },
+
+    //广告类别
+    XfSysBussinessGetBannerList(data) {
+        return request({
+            url: '/api/XfSysBussiness/GetBannerList',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+
+    //广告新增、编辑
+    XfSysBussinessSaveBanner(data) {
+        return request({
+            url: '/api/XfSysBussiness/SaveBanner',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+    //删除广告,支持批量
+    XfSysBussinessDelBanner(data) {
+        return request({
+            url: '/api/XfSysBussiness/DelBanner',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+
+    //友情链接列表
+    XfSysBussinessGetWebFriendlinksList(data) {
+        return request({
+            url: '/api/XfSysBussiness/GetWebFriendlinksList',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+    //友情链接新增、编辑
+    XfSysBussinessSaveWebFriendlinks(data) {
+        return request({
+            url: '/api/XfSysBussiness/SaveWebFriendlinks',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+    //删除友情链接,支持批量
+    XfSysBussinessDelWebFriendlinks(data) {
+        return request({
+            url: '/api/XfSysBussiness/DelWebFriendlinks',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
+
+    //留言建议列表
+    XfSysBussinessGetWebProposeList(data) {
+        return request({
+            url: '/api/XfSysBussiness/GetWebProposeList',
+            method: 'get',
+            params: data,
+            tokenName
+        })
+    },
+
+    //删除留言
+    XfSysBussinessDelWebPropose(data) {
+        return request({
+            url: '/api/XfSysBussiness/DelWebPropose',
+            method: 'post',
+            data: data,
+            tokenName
+        })
+    },
 }

+ 9 - 0
src/api/XfWebApi.js

@@ -127,4 +127,13 @@ export default {
             noToken: true
         })
     },
+    //保存建议留言
+    XfWebApiSavePropose(data) {
+        return request({
+            url: '/api/XfWebApi/SavePropose',
+            method: 'post',
+            data: data,
+            noToken: true
+        })
+    },
 }

+ 0 - 1
src/components/membership/index.vue

@@ -105,7 +105,6 @@ export default {
   data() {
     var validatorphone = (rule, value, callback) => {
       var reg = /^1(3|4|5|6|7|8|9)\d{9}$/;
-      console.log(reg.test(13602712680));
       if (!value) {
         return callback(new Error("请输入手机号码"));
       } else if (!reg.test(value)) {

+ 21 - 9
src/components/nav-tab/index.vue

@@ -16,10 +16,19 @@
           <template v-for="(item, index) in $store.state.asyncRouter">
             <el-menu-item
               v-if="!item.ChildList || item.ChildList.length <= 0"
-              :index="item.webUrl ? '' : 'home'"
-              ><a v-if="item.webUrl" :href="item.webUrl" target="_blank">{{
-                item.Name
-              }}</a
+              :index="
+                item.MenuId === 1
+                  ? 'home'
+                  : item.WebUrl
+                  ? null
+                  : `menuList?ParentId=${item.ParentId}&MenuId=${item.MenuId}`
+              "
+              ><a
+                v-if="item.WebUrl && item.MenuId !== 1"
+                :href="item.WebUrl"
+                target="_blank"
+                style="color: #fff; display: block"
+                >{{ item.Name }}</a
               ><span v-else>{{ item.Name }}</span></el-menu-item
             >
             <el-submenu
@@ -31,13 +40,16 @@
                 v-for="(items, indexs) in item.ChildList"
                 :key="indexs"
                 :index="
-                  item.webUrl
-                    ? ''
+                  items.WebUrl
+                    ? null
                     : `menuList?ParentId=${items.ParentId}&MenuId=${items.MenuId}`
                 "
-                ><a v-if="items.webUrl" :href="items.webUrl" target="_blank">{{
-                  items.Name
-                }}</a
+                ><a
+                  v-if="items.WebUrl"
+                  :href="items.WebUrl"
+                  target="_blank"
+                  style="color: #fff; display: block"
+                  >{{ items.Name }}</a
                 ><span v-else>{{ items.Name }}</span></el-menu-item
               >
             </el-submenu>

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

@@ -30,6 +30,20 @@
             :value="items.RoleId"
           ></el-option>
         </el-select>
+        <el-select
+          clearable
+          :size="$store.state.defaultSize"
+          v-else-if="item.scope === 'TypeList'"
+          v-model="formData[item.prop]"
+          :placeholder="item.placeholder"
+        >
+          <el-option
+            v-for="(items, indexs) in TypeList"
+            :key="indexs"
+            :label="items.text"
+            :value="items.value"
+          ></el-option>
+        </el-select>
         <el-cascader
           :size="$store.state.defaultSize"
           v-else-if="item.scope === 'MenuList'"
@@ -137,7 +151,7 @@ export default {
       },
     };
   },
-  computed: { ...mapGetters(["roleList", "MenuList"]) },
+  computed: { ...mapGetters(["roleList", "MenuList","TypeList"]) },
   methods: {
     onSubmit(e) {
       this.$emit("onSubmit", e);

+ 110 - 0
src/components/suggestion/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <div id="">
+    <el-dialog
+      :close-on-click-modal="false"
+      title="网站建议"
+      :append-to-body="true"
+      :visible.sync="dialogVisible"
+      width="600px"
+    >
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="120px"
+        class="demo-ruleForm"
+      >
+        <el-row>
+          <el-col :span="24"
+            ><el-form-item label="联系电话" prop="Mobile">
+              <el-input
+                clearable
+                v-model.trim="ruleForm.Mobile"
+              ></el-input> </el-form-item
+          ></el-col>
+
+          <el-col :span="24"
+            ><el-form-item label="建议留言" prop="ProposeContent">
+              <el-input
+                clearable
+                v-model.trim="ruleForm.ProposeContent"
+              ></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close">取 消</el-button>
+        <el-button
+          size="small"
+          type="primary"
+          @click="submit('ruleForm')"
+          :loading="loading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    var validatorphone = (rule, value, callback) => {
+      var reg = /^1(3|4|5|6|7|8|9)\d{9}$/;
+      if (!value) {
+        return callback(new Error("请输入手机号码"));
+      } else if (!reg.test(value)) {
+        return callback(new Error("请输入正确手机号码"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      loading: false,
+      dialogVisible: false,
+      ruleForm: { Mobile: "", ProposeContent: "" },
+      rules: {
+        Mobile: [
+          { required: true, validator: validatorphone, trigger: "blur" },
+        ],
+        ProposeContent: [
+          { required: true, message: "请输入建议留言", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  methods: {
+    showInit(e, name) {
+      this.ruleForm = { Mobile: "", ProposeContent: "" };
+      this.dialogVisible = true;
+    },
+    close() {
+      this.$refs["ruleForm"].resetFields();
+      this.loading = false;
+      this.dialogVisible = false;
+    },
+    submit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          this.loading = true;
+          this.$api
+            .XfWebApiSavePropose(this.ruleForm)
+            .then((res) => {
+              this.close();
+              this.$parent.search();
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 12 - 0
src/components/table/index.vue

@@ -34,6 +34,15 @@
                 }}</span>
               </template>
             </div>
+            <el-input-number
+              v-else-if="item.scope === 'input'"
+              style="width: 100%;"
+              :precision="0"
+              :min="0"
+              :controls="false"
+              v-model="scope.row[item.prop]"
+              @change="changeSort($event,scope.row)"
+            ></el-input-number>
             <span v-else-if="item.scope === 'time'">{{
               $methods.onlyFormaHao(scope.row[item.prop])
             }}</span>
@@ -96,6 +105,9 @@ export default {
     return {};
   },
   methods: {
+    changeSort(e,item){
+      this.$emit("changeSort",e,item)
+    },
     //多选触发
     selectionChange(e) {
       this.$emit("selectionChange", e);

+ 8 - 2
src/components/top-header/index.vue

@@ -13,7 +13,7 @@
           <li>|</li>
           <li class="links">网站地图</li>
           <li>|</li>
-          <li class="links">网站建议</li>
+          <li class="links" @click="suggestion">网站建议</li>
           <li v-if="$store.state.token">|</li>
           <li
             class="links"
@@ -50,13 +50,15 @@
       </div>
     </div>
     <membership ref="membership"></membership>
+    <suggestion ref="suggestion"></suggestion>
   </div>
 </template>
 
 <script>
 import membership from "@/components/membership";
+import suggestion from "@/components/suggestion";
 export default {
-  components: { membership },
+  components: { membership,suggestion },
   data() {
     return {
       gettime: "",
@@ -95,6 +97,10 @@ export default {
     joinVip() {
       this.$refs.membership.showInit();
     },
+    //网站建议
+    suggestion(){
+      this.$refs.suggestion.showInit()
+    },
     submit() {
       if (!this.searchKey) {
         this.$message.warning("请输入关键词");

+ 10 - 0
src/store/index.js

@@ -22,6 +22,7 @@ export default new Vuex.Store({
     userInfo: {},
     roleList: null,//角色列表
     MenuList: null,//栏目列表
+    TypeList: null,//分类列表
   },
   getters: {
     backstageAsyncRouter: (state) => {
@@ -48,6 +49,15 @@ export default new Vuex.Store({
           });
       }
       return state.MenuList
+    },
+    TypeList: (state) => {
+      if (!state.TypeList) {
+        api.XfSysBussinessGetTypeList({ type:3,pageindex: 1, pagesize: 999 })
+          .then((res) => {
+            state.TypeList = res.Data || [];
+          });
+      }
+      return state.TypeList
     }
 
   },

+ 2 - 1
src/utils/element.js

@@ -1,7 +1,7 @@
 import Vue from 'vue';
 import {
   Button, Menu, Submenu, MenuItem, MenuItemGroup, Carousel, CarouselItem, Tabs, TabPane, Pagination, Backtop, Breadcrumb, BreadcrumbItem, Empty, Dialog, Form, FormItem, Input, Message, MessageBox, Tooltip
-  , Table, TableColumn, RadioGroup, Radio, Col, Row, InputNumber, Tree, Dropdown, DropdownMenu, DropdownItem, Checkbox, Select, Option, Upload, DatePicker, Loading,Cascader
+  , Table, TableColumn, RadioGroup, Radio, Col, Row, InputNumber, Tree, Dropdown, DropdownMenu, DropdownItem, Checkbox, Select, Option, Upload, DatePicker, Loading,Cascader,Image
 } from 'element-ui';
 
 Vue.use(Button);
@@ -42,6 +42,7 @@ Vue.use(DatePicker)
 Vue.use(Loading);
 Vue.use(Loading.directive);
 Vue.use(Cascader)
+Vue.use(Image)
 
 Vue.prototype.$message = Message;
 Vue.prototype.$confirm = MessageBox.confirm;

+ 2 - 2
src/utils/request.js

@@ -6,8 +6,8 @@ import { set } from 'nprogress'
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
-export const BASE_URL = 'http://192.168.1.210:8032/'
-export const BASE_IMG_URL = 'http://192.168.1.210:8032'
+export const BASE_URL = 'http://192.168.1.28:8032/'
+export const BASE_IMG_URL = 'http://192.168.1.28:8032'
 // export const BASE_IMG_URL = process.env.VUE_APP_IMG_API
 
 const service = axios.create({

+ 205 - 9
src/views/System/contentSet/advertisement/index.vue

@@ -1,21 +1,217 @@
 <template>
   <div id="">
-    advertisement
+    <Search
+      ref="search"
+      :formList="formList"
+      :formData="formData"
+      @onSubmit="search"
+    ></Search>
+    <div style="text-align: right; margin-bottom: 10px">
+      <el-button :size="$store.state.defaultSize" @click="delPL" type="primary"
+        >批量删除</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="add" type="primary"
+        >新增</el-button
+      >
+    </div>
+    <Table
+      ref="table"
+      :tableData="tableData"
+      :tableList="tableList"
+      :rowKey="'BannerId'"
+      :check="true"
+      @selectionChange="selectionChange"
+    >
+      <template #right="scope"
+        ><el-button @click="edit(scope.row)" type="text" size="small"
+          >修改</el-button
+        >
+        <el-button @click="del(scope.row)" type="text" size="small"
+          >删除</el-button
+        >
+      </template>
+    </Table>
+    <Pagination
+      :pageindex="formData.pageindex"
+      :pagesize="formData.pagesize"
+      :total="total"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    ></Pagination>
+    <Operation ref="operation"></Operation>
   </div>
 </template>
 
 <script>
+import Search from "@/components/search/index.vue";
+import Table from "@/components/table/index.vue";
+import Pagination from "@/components/pagination/index.vue";
+import Operation from "./operation.vue";
 export default {
-  data () {
+  components: { Search, Operation, Table, Pagination },
+  data() {
     return {
-    }
+      formList: [
+        {
+          label: "位置:",
+          prop: "bannerType",
+          scope: "options",
+          options: [
+            {
+              label: "首页轮播",
+              value: 1,
+            },
+            {
+              label: "新闻轮播",
+              value: 2,
+            },
+            {
+              label: "飘窗广告轮播",
+              value: 3,
+            },
+          ],
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+      tableData: [],
+      tableList: [
+        {
+          label: "编号",
+          prop: "BannerId",
+        },
+        {
+          label: "位置",
+          prop: "BannerTypeName",
+        },
+        {
+          label: "标题",
+          prop: "Title",
+        },
+        {
+          label: "图片",
+          prop: "ImageUrl",
+          scope: "image",
+        },
+        {
+          label: "跳转地址",
+          prop: "JumpUrl",
+        },
+        {
+          label: "排序",
+          prop: "SortNumber",
+        },
+        {
+          label: "创建时间",
+          prop: "CreateTime",
+          scope: "time",
+        },
+        {
+          label: "备注",
+          prop: "Remark",
+        },
+      ],
+      total: 0,
+      routerTableData: [],
+      checkbox: [], //当前选中
+    };
+  },
+  created() {
+    this.$api.XfSysBussinessGetMenuList().then((res) => {
+      this.routerTableData = res.Data || [];
+    });
+    this.search();
   },
   methods: {
-
-  }
-}
+    selectionChange(e) {
+      this.checkbox = e;
+    },
+    search(e) {
+      if (e === "init") {
+        this.formData = { pageindex: 1, pagesize: 10 };
+        this.clearCheck();
+      }
+      this.$api.XfSysBussinessGetBannerList(this.formData).then((res) => {
+        this.tableData = res.Data.List || [];
+        this.total = res.Data.TotalCount;
+      });
+    },
+    add() {
+      this.$refs.operation.showInit();
+    },
+    edit(item) {
+      this.$refs.operation.showInit(JSON.parse(JSON.stringify(item)));
+    },
+    clearCheck() {
+      this.checkbox = [];
+      this.$refs.table.$refs.table.clearSelection();
+    },
+    delPL() {
+      if (this.checkbox.length > 0) {
+        this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            let array = this.checkbox.map((item) => {
+              return item.BannerId;
+            });
+            this.$api.XfSysBussinessDelBanner({ idarr: array }).then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$message.error("请勾选需要删除的数据");
+        return;
+      }
+    },
+    del(item) {
+      this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .XfSysBussinessDelBanner({ idarr: [item.BannerId] })
+            .then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    handleCurrentChange(e) {
+      this.formData.pageindex = e;
+      this.search();
+    },
+    handleSizeChange(e) {
+      this.formData.pageindex = 1;
+      this.formData.pagesize = e;
+      this.search();
+    },
+  },
+};
 </script>
 
-<style lang="scss" scoped>
-
-</style>
+<style lang="scss" scoped></style>

+ 219 - 0
src/views/System/contentSet/advertisement/operation.vue

@@ -0,0 +1,219 @@
+<template>
+  <div id="">
+    <el-dialog
+      :close-on-click-modal="false"
+      title="广告"
+      :visible.sync="dialogVisible"
+      width="900px"
+    >
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="标题" prop="Title">
+              <el-input v-model.trim="ruleForm.Title"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="图片上传" prop="ImageUrl">
+              <el-image
+                v-if="ruleForm.ImageUrl"
+                style="width: 112px; height: 70px"
+                :src="$methods.splitImgHost(ruleForm.ImageUrl)"
+                :preview-src-list="[$methods.splitImgHost(ruleForm.ImageUrl)]"
+              >
+              </el-image>
+              <label for="uploads"><span class="btn">上传图片</span></label>
+              <input
+                type="file"
+                id="uploads"
+                style="display: none"
+                @change="uploadImg"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="位置" prop="BannerType">
+              <el-radio-group v-model="ruleForm.BannerType">
+                <el-radio :label="1">首页轮播</el-radio>
+                <el-radio :label="2">新闻轮播</el-radio>
+                <el-radio :label="3">飘窗广告轮播</el-radio>
+              </el-radio-group></el-form-item
+            >
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="排序" prop="SortNumber">
+              <el-input-number
+                :precision="0"
+                :min="0"
+                :controls="false"
+                v-model="ruleForm.SortNumber"
+              ></el-input-number
+            ></el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="跳转地址" prop="JumpUrl">
+              <el-input v-model.trim="ruleForm.JumpUrl"></el-input
+            ></el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="状态" prop="Status">
+              <el-radio-group v-model="ruleForm.Status">
+                <el-radio :label="1">正常</el-radio>
+                <el-radio :label="0">停用</el-radio>
+              </el-radio-group></el-form-item
+            >
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="Remark">
+              <el-input
+                type="textarea"
+                :rows="4"
+                v-model.trim="ruleForm.Remark"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close">取 消</el-button>
+        <el-button
+          size="small"
+          type="primary"
+          @click="submit('ruleForm')"
+          :loading="loading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Editor from "@/components/Editor";
+export default {
+  components: { Editor },
+  data() {
+    return {
+      dialogVisible: false,
+      ruleForm: {
+        Title: "",
+        BannerType: "",
+        SortNumber: "",
+        ImageUrl: "",
+        JumpUrl: "",
+        Status: 1,
+        Remark: "",
+      },
+      rules: {
+        Title: [{ required: true, message: "请输入标题", trigger: "blur" }],
+        SortNumber: [
+          { required: true, message: "请输入排序", trigger: "blur" },
+        ],
+        ImageUrl: [
+          { required: true, message: "请上传图片", trigger: "change" },
+        ],
+        JumpUrl: [
+          { required: true, message: "请输入跳转地址", trigger: "blur" },
+        ],
+        BannerType: [
+          {
+            required: true,
+            message: "请选择位置",
+            trigger: "change",
+          },
+        ],
+        Status: [
+          {
+            required: true,
+            message: "请选择状态",
+            trigger: "change",
+          },
+        ],
+      },
+      loading: false,
+    };
+  },
+  methods: {
+    showInit(e) {
+      if (e) {
+        this.ruleForm = e;
+      } else {
+        this.ruleForm = {
+          Title: "",
+          BannerType: "",
+          SortNumber: "",
+          ImageUrl: "",
+          JumpUrl: "",
+          Status: 1,
+          Remark: "",
+        };
+      }
+      this.dialogVisible = true;
+    },
+    close() {
+      this.loading = false;
+      this.$refs["ruleForm"].resetFields();
+      this.dialogVisible = false;
+    },
+    uploadImg(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) {
+        return;
+      }
+      if (file.size > 0.3 * 1024 * 1024) {
+        self.$message.error("图片不得大于300kb");
+        return;
+      }
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      if (type[0] != "jpg" && type[0] != "png" && type[0] != "jpeg") {
+        self.$message.error("上传格式需为:.jpg/.png/.jpeg");
+        e.target.value = "";
+        return;
+      }
+      let formDatas = new FormData();
+      formDatas.append("file", file);
+      this.$api
+        .XfSysBussinessUploadFile(formDatas)
+        .then((res) => {
+          this.$set(this.ruleForm, "ImageUrl", res.Data);
+          this.$refs["ruleForm"].validateField("ImageUrl");
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    submit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          this.$api.XfSysBussinessSaveBanner(this.ruleForm).then((res) => {
+            this.close();
+            this.$parent.search();
+          });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btn {
+  border: 1px solid #666;
+  padding: 4px 6px;
+  border-radius: 8px;
+  cursor: pointer;
+  user-select: none;
+  margin-left: 18px;
+}
+</style>

+ 13 - 8
src/views/System/contentSet/article/index.vue

@@ -198,7 +198,10 @@ export default {
           type: "warning",
         })
           .then(() => {
-            this.$api.XfSysBussinessDelNews(this.checkbox).then((res) => {
+            let array = this.checkbox.map((item) => {
+              return item.NewsId;
+            });
+            this.$api.XfSysBussinessDelNews({ idarr: array }).then((res) => {
               this.$message({
                 type: "success",
                 message: "删除成功!",
@@ -225,14 +228,16 @@ export default {
         type: "warning",
       })
         .then(() => {
-          this.$api.XfSysBussinessDelNews([item.NewsId]).then((res) => {
-            this.$message({
-              type: "success",
-              message: "删除成功!",
+          this.$api
+            .XfSysBussinessDelNews({ idarr: [item.NewsId] })
+            .then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
             });
-            this.clearCheck();
-            this.search();
-          });
         })
         .catch(() => {
           this.$message({

+ 12 - 21
src/views/System/contentSet/article/operation.vue

@@ -15,14 +15,19 @@
       >
         <el-row>
           <el-col :span="24">
-            <el-form-item label="所属菜单" prop="MenuId"
-              ><treeselect
+            <el-form-item label="所属菜单" prop="MenuId">
+              <el-cascader
                 v-model="ruleForm.MenuId"
+                placeholder="选择目录"
                 :options="$parent.routerTableData"
-                :normalizer="normalizer"
-                placeholder="选择上级目录"
-                :load-options="loadGroups"
-            /></el-form-item>
+                :props="{
+                  value: 'MenuId',
+                  label: 'Name',
+                  children: 'ChildList',
+                  emitPath: false,
+                }"
+              ></el-cascader
+            ></el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="标题" prop="Title">
@@ -81,10 +86,8 @@
 
 <script>
 import Editor from "@/components/Editor";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 export default {
-  components: { Treeselect, Editor },
+  components: { Editor },
   data() {
     return {
       dialogVisible: false,
@@ -128,18 +131,6 @@ export default {
       this.$refs["ruleForm"].resetFields();
       this.dialogVisible = false;
     },
-    loadGroups() {},
-    normalizer(node) {
-      //当子节点也就是children=[]时候去掉子节点
-      if (node.ChildList && !node.ChildList.length) {
-        delete node.ChildList;
-      }
-      return {
-        id: node.MenuId,
-        label: node.Name,
-        children: node.ChildList,
-      };
-    },
     submit(formName) {
       this.$refs[formName].validate(async (valid) => {
         if (valid) {

+ 204 - 9
src/views/System/contentSet/homeSet/index.vue

@@ -1,21 +1,216 @@
 <template>
   <div id="">
-    homeSet
+    <Search
+      ref="search"
+      :formList="formList"
+      :formData="formData"
+      @onSubmit="search"
+    ></Search>
+    <div style="text-align: right; margin-bottom: 10px">
+      <el-button :size="$store.state.defaultSize" @click="delPL" type="primary"
+        >批量删除</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="add" type="primary"
+        >新增</el-button
+      >
+    </div>
+    <Table
+      ref="table"
+      :tableData="tableData"
+      :tableList="tableList"
+      :rowKey="'NewPositionId'"
+      :check="true"
+      @selectionChange="selectionChange"
+      @changeSort="changeSort"
+    >
+      <template #right="scope"
+        ><el-button
+          v-if="scope.row.status === 1"
+          @click="del(scope.row, 0)"
+          type="text"
+          size="small"
+          >停用</el-button
+        >
+        <el-button
+          v-if="scope.row.status === 0"
+          @click="del(scope.row, 1)"
+          type="text"
+          size="small"
+          >启用</el-button
+        >
+        <el-button @click="del(scope.row, -1)" type="text" size="small"
+          >删除</el-button
+        >
+      </template>
+    </Table>
+    <Pagination
+      :pageindex="formData.pageindex"
+      :pagesize="formData.pagesize"
+      :total="total"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    ></Pagination>
+    <Operation ref="operation"></Operation>
   </div>
 </template>
 
 <script>
+import Search from "@/components/search/index.vue";
+import Table from "@/components/table/index.vue";
+import Pagination from "@/components/pagination/index.vue";
+import Operation from "./operation.vue";
 export default {
-  data () {
+  components: { Search, Operation, Table, Pagination },
+  data() {
     return {
-    }
+      formList: [
+        {
+          label: "分类:",
+          prop: "Seat",
+          scope: "TypeList",
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+      tableData: [],
+      tableList: [
+        {
+          label: "编号",
+          prop: "NewPositionId",
+        },
+        {
+          label: "标题",
+          prop: "Title",
+        },
+        {
+          label: "类型",
+          prop: "SeatName",
+        },
+        {
+          label: "排序",
+          prop: "SortNumber",
+          scope: "input",
+          width: "90",
+        },
+        {
+          label: "状态",
+          prop: "Status",
+          scope: "options",
+          options: [
+            { label: "停用", value: 0 },
+            { label: "正常", value: 1 },
+          ],
+        },
+      ],
+      total: 0,
+      routerTableData: [],
+      checkbox: [], //当前选中
+    };
+  },
+  created() {
+    this.$api.XfSysBussinessGetMenuList().then((res) => {
+      this.routerTableData = res.Data || [];
+    });
+    this.search();
   },
   methods: {
-
-  }
-}
+    changeSort(e, item) {
+      this.$api
+        .XfSysBussinessUpdateSortNumber({
+          List: [
+            { NewPositionId: item.NewPositionId, SortNumber: parseInt(e) },
+          ],
+        })
+        .then((res) => {
+          this.search();
+          this.$message.success("排序成功");
+        });
+    },
+    selectionChange(e) {
+      this.checkbox = e;
+    },
+    search(e) {
+      if (e === "init") {
+        this.formData = { pageindex: 1, pagesize: 10 };
+        this.clearCheck();
+      }
+      this.$api.XfSysBussinessGetNewPositionList(this.formData).then((res) => {
+        this.tableData = res.Data.List || [];
+        this.total = res.Data.TotalCount;
+      });
+    },
+    add() {
+      this.$refs.operation.showInit();
+    },
+    clearCheck() {
+      this.checkbox = [];
+      this.$refs.table.$refs.table.clearSelection();
+    },
+    delPL() {
+      if (this.checkbox.length > 0) {
+        this.$confirm(
+          `此操作将永久删除${this.checkbox.length}条数据, 是否继续?`,
+          "提示",
+          {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+          }
+        )
+          .then(() => {
+            let array = this.checkbox.map((item) => {
+              return item.NewPositionId;
+            });
+            this.$api
+              .XfSysBussinessEditNewPositionStatus({
+                idarr: array,
+                type: -1,
+              })
+              .then((res) => {
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                });
+                this.clearCheck();
+                this.search();
+              });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$message.error("请勾选需要删除的数据");
+        return;
+      }
+    },
+    del(item, k) {
+      this.$api
+        .XfSysBussinessEditNewPositionStatus({
+          ids: item.NewPositionId,
+          type: k,
+        })
+        .then((res) => {
+          this.$message({
+            type: "success",
+            message: "操作成功!",
+          });
+          this.clearCheck();
+          this.search();
+        });
+    },
+    handleCurrentChange(e) {
+      this.formData.pageindex = e;
+      this.search();
+    },
+    handleSizeChange(e) {
+      this.formData.pageindex = 1;
+      this.formData.pagesize = e;
+      this.search();
+    },
+  },
+};
 </script>
 
-<style lang="scss" scoped>
-
-</style>
+<style lang="scss" scoped></style>

+ 244 - 0
src/views/System/contentSet/homeSet/operation.vue

@@ -0,0 +1,244 @@
+<template>
+  <div id="">
+    <el-dialog
+      :close-on-click-modal="false"
+      title="新增"
+      :visible.sync="dialogVisible"
+      width="1200px"
+    >
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="分类:" prop="TypeId">
+          <el-radio-group v-model="ruleForm.TypeId">
+            <el-radio
+              v-for="(item, index) in TypeList"
+              :key="index"
+              :label="item.value"
+              >{{ item.text }}</el-radio
+            >
+          </el-radio-group></el-form-item
+        >
+      </el-form>
+      <Search
+        ref="search"
+        :formList="formList"
+        :formData="formData"
+        @onSubmit="search"
+      ></Search>
+      <Table
+        ref="table"
+        :tableData="tableData"
+        :tableList="tableList"
+        :rowKey="'NewsId'"
+        :check="true"
+        @selectionChange="selectionChange"
+      >
+        <template #right="scope"
+          ><el-button
+            v-if="scope.row.status === 1"
+            @click="del(scope.row, 0)"
+            type="text"
+            size="small"
+            >停用</el-button
+          >
+          <el-button
+            v-if="scope.row.status === 0"
+            @click="del(scope.row, 1)"
+            type="text"
+            size="small"
+            >启用</el-button
+          >
+          <el-button @click="del(scope.row, -1)" type="text" size="small"
+            >删除</el-button
+          >
+        </template>
+      </Table>
+      <Pagination
+        :pageindex="formData.pageindex"
+        :pagesize="formData.pagesize"
+        :total="total"
+        @handleSizeChange="handleSizeChange"
+        @handleCurrentChange="handleCurrentChange"
+      ></Pagination>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close">取 消</el-button>
+        <el-button
+          size="small"
+          type="primary"
+          @click="submit('ruleForm')"
+          :loading="loading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Search from "@/components/search/index.vue";
+import Table from "@/components/table/index.vue";
+import Pagination from "@/components/pagination/index.vue";
+import { mapGetters } from "vuex";
+export default {
+  components: { Search, Table, Pagination },
+  data() {
+    return {
+      dialogVisible: false,
+      ruleForm: {
+        TypeId: "",
+      },
+      rules: {
+        TypeId: [
+          {
+            required: true,
+            message: "请选择分类",
+            trigger: "change",
+          },
+        ],
+      },
+      formList: [
+        {
+          label: "菜单:",
+          prop: "MenuId",
+          scope: "MenuList",
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+      tableData: [],
+      tableList: [
+        {
+          label: "编号",
+          prop: "NewsId",
+          width:"90"
+        },
+        {
+          label: "标题",
+          prop: "Title",
+        },
+        {
+          label: "是否置顶",
+          prop: "IsTop",
+          scope: "options",
+          options: [
+            { label: "是", value: true },
+            { label: "否", value: false },
+          ],
+          width:"90"
+        },
+        {
+          label: "会员可见",
+          prop: "IsMemberRead",
+          scope: "options",
+          options: [
+            { label: "是", value: true },
+            { label: "否", value: false },
+          ],
+          width:"90"
+        },
+        {
+          label: "所属项目",
+          prop: "MenuName",
+          width:"90"
+        },
+        {
+          label: "创建时间",
+          prop: "CreateTime",
+          scope: "time",
+          width:"140"
+        },
+        {
+          label: "状态",
+          prop: "Status",
+          scope: "options",
+          options: [
+            { label: "停用", value: 0 },
+            { label: "正常", value: 1 },
+          ],
+          width:"90"
+        },
+      ],
+      total: 0,
+      checkbox: [], //当前选中
+      loading: false,
+    };
+  },
+  computed: { ...mapGetters(["TypeList"]) },
+  methods: {
+    selectionChange(e) {
+      this.checkbox = e;
+    },
+    search(e) {
+      if (e === "init") {
+        this.formData = { pageindex: 1, pagesize: 10 };
+        this.clearCheck();
+      }
+      this.$api.XfSysBussinessGetNewsList(this.formData).then((res) => {
+        this.tableData = res.Data.List || [];
+        this.total = res.Data.TotalCount;
+      });
+    },
+    clearCheck() {
+      this.checkbox = [];
+      this.$refs.table.$refs.table.clearSelection();
+    },
+    showInit() {
+      this.ruleForm = {
+        TypeId: "",
+      };
+      this.dialogVisible = true;
+      this.$nextTick(() => {
+        this.search("init");
+      });
+    },
+    close() {
+      this.loading = false;
+      this.dialogVisible = false;
+    },
+    submit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          if (this.checkbox.length === 0) {
+            this.$message.error("请勾选数据");
+            return;
+          }
+          let array = this.checkbox.map((item) => {
+            return item.NewsId;
+          });
+          this.$api
+            .XfSysBussinessSaveSelectPosition({
+              idarr: array,
+              type: this.ruleForm.TypeId,
+            })
+            .then((res) => {
+              this.close();
+              this.$parent.search();
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    handleCurrentChange(e) {
+      this.formData.pageindex = e;
+      this.search();
+    },
+    handleSizeChange(e) {
+      this.formData.pageindex = 1;
+      this.formData.pagesize = e;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-dialog {
+  margin-top: 3vh !important;
+}
+</style>

+ 29 - 2
src/views/System/contentSet/websiteMenu/index.vue

@@ -44,6 +44,12 @@
           >
           <el-button @click="handleClick(scope.row)" type="text" size="small"
             >修改</el-button
+          ><el-button
+            v-if="scope.row.Status === 0"
+            @click="del(scope.row)"
+            type="text"
+            size="small"
+            >删除</el-button
           >
         </template>
       </el-table-column>
@@ -79,7 +85,7 @@ export default {
           prop: "SortNumber",
         },
         {
-          label: "菜单状态",
+          label: "用途",
           prop: "ShowType",
           scope: "options",
           options: [
@@ -101,7 +107,7 @@ export default {
           prop: "Status",
           scope: "options",
           options: [
-            { label: "停用", value: -1 },
+            { label: "停用", value: 0 },
             { label: "正常", value: 1 },
           ],
         },
@@ -112,6 +118,27 @@ export default {
     this.search();
   },
   methods: {
+    del(item) {
+      this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .XfSysBussinessDelMenu({ idarr: [item.MenuId] })
+            .then((res) => {
+              this.$message.success("删除成功");
+              this.search();
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
     search() {
       this.$api.XfSysBussinessGetMenuList().then((res) => {
         if (res.Data && res.Data.length > 0) {

+ 13 - 1
src/views/System/contentSet/websiteMenu/operation.vue

@@ -65,7 +65,15 @@
             <el-form-item label="菜单状态" prop="Status">
               <el-radio-group v-model="ruleForm.Status">
                 <el-radio :label="1">正常</el-radio>
-                <el-radio :label="-1">停用</el-radio>
+                <el-radio :label="0">停用</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="仅会员可见" prop="IsMenuRead">
+              <el-radio-group v-model="ruleForm.IsMenuRead">
+                <el-radio :label="true">是</el-radio>
+                <el-radio :label="false">否</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -99,6 +107,7 @@ export default {
         Name: "",
         SortNumber: "",
         ShowType: 1,
+        IsMenuRead: false,
         Status: 1,
       },
       rules: {
@@ -109,6 +118,7 @@ export default {
         ShowType: [
           { required: true, message: "请输入用途", trigger: "change" },
         ],
+        IsMenuRead: [{ required: true, message: "请选择", trigger: "change" }],
       },
       loading: false,
     };
@@ -121,6 +131,7 @@ export default {
           Status: 1,
           Type: 1,
           ShowType: 1,
+          IsMenuRead: false,
         };
       } else if (e) {
         this.ruleForm = e;
@@ -132,6 +143,7 @@ export default {
           SortNumber: "",
           ShowType: 1,
           Status: 1,
+          IsMenuRead: false,
         };
       }
       this.dialogVisible = true;

+ 168 - 9
src/views/System/vip/friendshipLink/index.vue

@@ -1,21 +1,180 @@
 <template>
   <div id="">
-    friendshipLink
+    <Search
+      ref="search"
+      :formList="formList"
+      :formData="formData"
+      @onSubmit="search"
+    ></Search>
+    <div style="text-align: right; margin-bottom: 10px">
+      <el-button :size="$store.state.defaultSize" @click="delPL" type="primary"
+        >批量删除</el-button
+      >
+      <el-button :size="$store.state.defaultSize" @click="add" type="primary"
+        >新增</el-button
+      >
+    </div>
+    <Table
+      ref="table"
+      :tableData="tableData"
+      :tableList="tableList"
+      :rowKey="'FriendlinksID'"
+      :check="true"
+      @selectionChange="selectionChange"
+    >
+      <template #right="scope"
+        ><el-button @click="edit(scope.row)" type="text" size="small"
+          >修改</el-button
+        >
+        <el-button @click="del(scope.row)" type="text" size="small"
+          >删除</el-button
+        >
+      </template>
+    </Table>
+    <Pagination
+      :pageindex="formData.pageindex"
+      :pagesize="formData.pagesize"
+      :total="total"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    ></Pagination>
+    <Operation ref="operation"></Operation>
   </div>
 </template>
 
 <script>
+import Search from "@/components/search/index.vue";
+import Table from "@/components/table/index.vue";
+import Operation from "./operation.vue";
+import Pagination from "@/components/pagination/index.vue";
 export default {
-  data () {
+  components: { Search, Table, Pagination, Operation },
+  data() {
     return {
-    }
+      formList: [
+        {
+          label: "关键词:",
+          prop: "Title",
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+      tableData: [],
+      tableList: [
+        {
+          label: "编号",
+          prop: "FriendlinksID",
+        },
+        {
+          label: "标题",
+          prop: "Title",
+        },
+        {
+          label: "链接",
+          prop: "Friendlinks",
+        },
+      ],
+      total: 0,
+      checkbox: [], //当前选中
+    };
+  },
+  created() {
+    this.search();
   },
   methods: {
-
-  }
-}
+    add() {
+      this.$refs.operation.showInit();
+    },
+    edit(item) {
+      this.$refs.operation.showInit(JSON.parse(JSON.stringify(item)));
+    },
+    selectionChange(e) {
+      this.checkbox = e;
+    },
+    search(e) {
+      if (e === "init") {
+        this.formData = { pageindex: 1, pagesize: 10 };
+        this.clearCheck();
+      }
+      this.$api
+        .XfSysBussinessGetWebFriendlinksList(this.formData)
+        .then((res) => {
+          this.tableData = res.Data.List || [];
+          this.total = res.Data.TotalCount;
+        });
+    },
+    clearCheck() {
+      this.checkbox = [];
+      this.$refs.table.$refs.table.clearSelection();
+    },
+    delPL() {
+      if (this.checkbox.length > 0) {
+        this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            let array = this.checkbox.map((item) => {
+              return item.FriendlinksID;
+            });
+            this.$api
+              .XfSysBussinessDelWebFriendlinks({ idarr: array })
+              .then((res) => {
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                });
+                this.clearCheck();
+                this.search();
+              });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$message.error("请勾选需要删除的数据");
+        return;
+      }
+    },
+    del(item) {
+      this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .XfSysBussinessDelWebFriendlinks({ idarr: [item.FriendlinksID] })
+            .then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    handleCurrentChange(e) {
+      this.formData.pageindex = e;
+      this.search();
+    },
+    handleSizeChange(e) {
+      this.formData.pageindex = 1;
+      this.formData.pagesize = e;
+      this.search();
+    },
+  },
+};
 </script>
 
-<style lang="scss" scoped>
-
-</style>
+<style lang="scss" scoped></style>

+ 108 - 0
src/views/System/vip/friendshipLink/operation.vue

@@ -0,0 +1,108 @@
+<template>
+  <div id="">
+    <el-dialog
+      :close-on-click-modal="false"
+      title="友情链接"
+      :visible.sync="dialogVisible"
+      width="600px"
+    >
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="标题" prop="Title">
+              <el-input v-model.trim="ruleForm.Title"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="友情链接" prop="Friendlinks">
+              <el-input v-model.trim="ruleForm.Friendlinks"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="close">取 消</el-button>
+        <el-button
+          size="small"
+          type="primary"
+          @click="submit('ruleForm')"
+          :loading="loading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Editor from "@/components/Editor";
+export default {
+  components: { Editor },
+  data() {
+    return {
+      dialogVisible: false,
+      ruleForm: {
+        Title: "",
+        Friendlinks: "",
+      },
+      rules: {
+        Title: [{ required: true, message: "请输入标题", trigger: "blur" }],
+        Friendlinks: [
+          { required: true, message: "请输入友情链接", trigger: "blur" },
+        ],
+      },
+      loading: false,
+    };
+  },
+  methods: {
+    showInit(e) {
+      if (e) {
+        this.ruleForm = e;
+      } else {
+        this.ruleForm = {
+          Title: "",
+          Friendlinks: "",
+        };
+      }
+      this.dialogVisible = true;
+    },
+    close() {
+      this.loading = false;
+      this.$refs["ruleForm"].resetFields();
+      this.dialogVisible = false;
+    },
+    submit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          this.$api
+            .XfSysBussinessSaveWebFriendlinks(this.ruleForm)
+            .then((res) => {
+              this.close();
+              this.$parent.search();
+            });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btn {
+  border: 1px solid #666;
+  padding: 4px 6px;
+  border-radius: 8px;
+  cursor: pointer;
+  user-select: none;
+  margin-left: 18px;
+}
+</style>

+ 164 - 9
src/views/System/vip/suggestion/index.vue

@@ -1,21 +1,176 @@
 <template>
   <div id="">
-    suggestion
+    <Search
+      ref="search"
+      :formList="formList"
+      :formData="formData"
+      @onSubmit="search"
+    ></Search>
+    <div style="text-align: right; margin-bottom: 10px">
+      <el-button :size="$store.state.defaultSize" @click="delPL" type="primary"
+        >批量删除</el-button
+      >
+    </div>
+    <Table
+      ref="table"
+      :tableData="tableData"
+      :tableList="tableList"
+      :rowKey="'WebProposeId'"
+      :check="true"
+      @selectionChange="selectionChange"
+    >
+      <template #right="scope"
+        >
+        <el-button @click="del(scope.row)" type="text" size="small"
+          >删除</el-button
+        >
+      </template>
+    </Table>
+    <Pagination
+      :pageindex="formData.pageindex"
+      :pagesize="formData.pagesize"
+      :total="total"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    ></Pagination>
   </div>
 </template>
 
 <script>
+import Search from "@/components/search/index.vue";
+import Table from "@/components/table/index.vue";
+import Pagination from "@/components/pagination/index.vue";
 export default {
-  data () {
+  components: { Search, Table, Pagination },
+  data() {
     return {
-    }
+      formList: [
+        {
+          label: "留言关键词:",
+          prop: "proposeContent",
+        },
+      ],
+      formData: { pageindex: 1, pagesize: 10 },
+      tableData: [],
+      tableList: [
+        {
+          label: "编号",
+          prop: "WebProposeId",
+        },
+        {
+          label: "会员姓名/游客",
+          prop: "MemberName",
+        },
+        {
+          label: "手机号",
+          prop: "Mobile",
+        },
+        {
+          label: "留言/建议",
+          prop: "ProposeContent",
+        },
+        {
+          label: "时间",
+          prop: "CreateTime",
+          scope: "time",
+        },
+        {
+          label: "IP地址",
+          prop: "Remark",
+        },
+      ],
+      total: 0,
+      checkbox: [], //当前选中
+    };
+  },
+  created() {
+    this.search();
   },
   methods: {
-
-  }
-}
+    selectionChange(e) {
+      this.checkbox = e;
+    },
+    search(e) {
+      if (e === "init") {
+        this.formData = { pageindex: 1, pagesize: 10 };
+        this.clearCheck();
+      }
+      this.$api.XfSysBussinessGetWebProposeList(this.formData).then((res) => {
+        this.tableData = res.Data.List || [];
+        this.total = res.Data.TotalCount;
+      });
+    },
+    clearCheck() {
+      this.checkbox = [];
+      this.$refs.table.$refs.table.clearSelection();
+    },
+    delPL() {
+      if (this.checkbox.length > 0) {
+        this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            let array = this.checkbox.map((item) => {
+              return item.WebProposeId;
+            });
+            this.$api.XfSysBussinessDelWebPropose({ idarr: array }).then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+          })
+          .catch(() => {
+            this.$message({
+              type: "info",
+              message: "已取消删除",
+            });
+          });
+      } else {
+        this.$message.error("请勾选需要删除的数据");
+        return;
+      }
+    },
+    del(item) {
+      this.$confirm("此操作将永久删除该数据, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .XfSysBussinessDelWebPropose({ idarr: [item.WebProposeId] })
+            .then((res) => {
+              this.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+              this.clearCheck();
+              this.search();
+            });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    handleCurrentChange(e) {
+      this.formData.pageindex = e;
+      this.search();
+    },
+    handleSizeChange(e) {
+      this.formData.pageindex = 1;
+      this.formData.pagesize = e;
+      this.search();
+    },
+  },
+};
 </script>
 
-<style lang="scss" scoped>
-
-</style>
+<style lang="scss" scoped></style>

+ 6 - 2
src/views/menuList/index.vue

@@ -16,7 +16,7 @@
             :key="index"
             class="hyLi"
             :class="{ active_hyLi: active == item.MenuId }"
-            @click="jump(item.MenuId, item.ParentId)"
+            @click="jump(item.MenuId, item.ParentId, item.WebUrl)"
           >
             {{ item.Name }}
           </li>
@@ -124,7 +124,11 @@ export default {
         this.total = res.Data.TotalCount;
       });
     },
-    jump(MenuId, ParentId) {
+    jump(MenuId, ParentId, url) {
+      if (url) {
+        window.open(url, "_blank");
+        return;
+      }
       this.$router.push({
         path: "menuList",
         query: {