谢杰标 пре 2 година
родитељ
комит
b94fe293f3

+ 19 - 0
src/api/upload/index.js

@@ -0,0 +1,19 @@
+import request from "@/utils/request";
+export function getPolicy(data) {
+  return request({
+    url: "/aliyun/oss/policy",
+    method: "get",
+    // noToken: true,
+    params: data,
+  });
+}
+//回调
+export function uploadFile(url, data) {
+  return request({
+    url: url,
+    method: "post",
+    data,
+    changeHeaders: true,
+    noToken: true,
+  });
+}

+ 8 - 2
src/assets/styles/element-ui.scss

@@ -69,7 +69,7 @@
 // dropdown
 .el-dropdown-menu {
   a {
-    display: block
+    display: block;
   }
 }
 
@@ -89,4 +89,10 @@
   > .el-submenu__title
   .el-submenu__icon-arrow {
   display: none;
-}
+}
+
+.el-button--text {
+  span {
+    color: #0098ED;
+  }
+}

+ 7 - 0
src/assets/styles/index.scss

@@ -57,6 +57,12 @@ html {
   justify-content: space-between;
 }
 
+.fl_a {
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+}
+
 .fl_c {
   display: flex;
   align-items: center;
@@ -120,6 +126,7 @@ html {
   }
 }
 
+
 a:focus,
 a:active {
   outline: none;

+ 9 - 9
src/components/BaseDialog.vue

@@ -90,7 +90,6 @@ export default {
 
   watch: {
     visible(val) {
-      // 在此做显示与隐藏的交互
       if (val === false) {
         // 重置操作
       } else {
@@ -104,19 +103,22 @@ export default {
 <style scoped lang="scss">
 /deep/.el-dialog {
   border-radius: 8px;
+  padding: 24px 24px 34px;
+  .el-dialog__body {
+    padding: 0;
+    padding-top: 34px;
+  }
   .el-dialog__header {
     padding: 0;
     .hearders {
-      height: 40px;
+      // height: 40px;
       display: flex;
       align-items: center;
       justify-content: space-between;
-      padding: 0px 18px 0px 20px;
-      border-bottom: 1px solid #e2e2e2;
       .leftTitle {
-        font-size: 14px;
+        font-size: 16px;
         font-weight: bold;
-        color: #2f4378;
+        color: #4d4d4d;
       }
       .rightBoxs {
         display: flex;
@@ -132,10 +134,8 @@ export default {
   }
   .el-dialog__footer {
     padding: 0;
+    margin-top: 50px;
     .dialog-footer {
-      padding: 0px 40px;
-      height: 70px;
-      border-top: 1px solid #e2e2e2;
       display: flex;
       align-items: center;
       justify-content: flex-end;

+ 103 - 29
src/components/FileUpload/index.vue

@@ -1,40 +1,59 @@
 <template>
   <div class="upload-file">
     <el-upload
-      :action="uploadFileUrl"
+      action="#"
+      :http-request="requestUpload"
       :before-upload="handleBeforeUpload"
       :file-list="fileList"
+      :show-file-list="true"
       :limit="limit"
       :on-error="handleUploadError"
       :on-exceed="handleExceed"
       :on-success="handleUploadSuccess"
-      :show-file-list="false"
-      :headers="headers"
+      :on-preview="handlePictureCardPreview"
+      :before-remove="beforeRemove"
+      list-type="picture-card"
       class="upload-file-uploader"
       ref="upload"
     >
       <!-- 上传按钮 -->
-      <el-button size="mini" type="primary">选取文件</el-button>
+
+      <i v-if="isPlus" style="font-size: 20px" class="el-icon-plus"></i>
+
+      <el-button v-else size="mini" type="primary">选取文件</el-button>
       <!-- 上传提示 -->
-      <div class="el-upload__tip" slot="tip" v-if="showTip">
-        请上传
-        <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
-        <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
-        的文件
-      </div>
     </el-upload>
-
+    <div class="el-upload__tips" slot="tip" v-if="showTip">
+      *建议尺寸800x800像素,大小10M以下
+    </div>
+    <el-dialog :visible.sync="dialogVisible">
+      <img width="100%" :src="dialogImageUrl" alt="" />
+    </el-dialog>
     <!-- 文件列表 -->
-    <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
-      <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
-        <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
+    <!-- <transition-group
+      class="upload-file-list el-upload-list el-upload-list--text"
+      name="el-fade-in-linear"
+      tag="ul"
+    >
+      <li
+        :key="file.uid"
+        class="el-upload-list__item ele-upload-list__item-content"
+        v-for="(file, index) in fileList"
+      >
+        <el-link
+          :href="`${baseUrl}${file.url}`"
+          :underline="false"
+          target="_blank"
+        >
           <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
         </el-link>
         <div class="ele-upload-list__item-content-action">
-          <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
+          <el-link :underline="false" @click="handleDelete(index)" type="danger"
+            >删除</el-link
+          >
         </div>
       </li>
-    </transition-group>
+    </transition-group> -->
   </div>
 </template>
 
@@ -56,16 +75,20 @@ export default {
       type: Number,
       default: 5,
     },
-    // 文件类型, 例如['png', 'jpg', 'jpeg']
+    // 文件类型, 例如['png', 'jpg', 'jpeg'] ["doc", "xls", "ppt", "txt", "pdf"],
     fileType: {
       type: Array,
-      default: () => ["doc", "xls", "ppt", "txt", "pdf"],
+      default: () => ["png", "jpg", "jpeg"],
     },
     // 是否显示提示
     isShowTip: {
       type: Boolean,
-      default: true
-    }
+      default: true,
+    },
+    isPlus: {
+      type: Boolean,
+      default: true,
+    },
   },
   data() {
     return {
@@ -75,6 +98,8 @@ export default {
         Authorization: "Bearer " + getToken(),
       },
       fileList: [],
+      dialogVisible: false,
+      dialogImageUrl: "",
     };
   },
   watch: {
@@ -83,9 +108,9 @@ export default {
         if (val) {
           let temp = 1;
           // 首先将值转为数组
-          const list = Array.isArray(val) ? val : this.value.split(',');
+          const list = Array.isArray(val) ? val : this.value.split(",");
           // 然后将数组转为对象数组
-          this.fileList = list.map(item => {
+          this.fileList = list.map((item) => {
             if (typeof item === "string") {
               item = { name: item, url: item };
             }
@@ -98,8 +123,8 @@ export default {
         }
       },
       deep: true,
-      immediate: true
-    }
+      immediate: true,
+    },
   },
   computed: {
     // 是否显示提示
@@ -108,6 +133,21 @@ export default {
     },
   },
   methods: {
+    beforeRemove(file, fileList) {
+      console.log(file, fileList);
+      this.fileList = fileList;
+    },
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+    },
+    requestUpload(file) {
+      this.$upload.upload(file, 0).then((res) => {
+        const url = this.$methodsTools.splitImgHost(res);
+        this.fileList.push({ name: url, url: url });
+        this.$emit("input", this.listToString(this.fileList));
+      });
+    },
     // 上传前校检格式和大小
     handleBeforeUpload(file) {
       // 校检文件类型
@@ -122,7 +162,9 @@ export default {
           return false;
         });
         if (!isTypeOk) {
-          this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
+          this.$message.error(
+            `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
+          );
           return false;
         }
       }
@@ -170,9 +212,9 @@ export default {
       for (let i in list) {
         strs += list[i].url + separator;
       }
-      return strs != '' ? strs.substr(0, strs.length - 1) : '';
-    }
-  }
+      return strs != "" ? strs.substr(0, strs.length - 1) : "";
+    },
+  },
 };
 </script>
 
@@ -195,4 +237,36 @@ export default {
 .ele-upload-list__item-content-action .el-link {
   margin-right: 10px;
 }
-</style>
+// .uploladBtn {
+//   width: 72px;
+//   height: 72px;
+//   background: #f5f6f7;
+//   border-radius: 8px;
+//   font-size: 20px;
+// }
+.el-upload__tips {
+  color: #999999;
+  font-size: 12px;
+  height: 0;
+  margin-bottom: 20px;
+}
+/deep/ .el-upload--picture-card {
+  width: 72px;
+  height: 72px;
+  background: #f5f6f7;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+/deep/ {
+  .upload-file-uploader {
+    display: flex;
+  }
+  .el-upload-list {
+    .el-upload-list__item {
+      width: 72px;
+      height: 72px;
+    }
+  }
+}
+</style>

+ 24 - 3
src/components/common/container.vue

@@ -1,14 +1,14 @@
 <template>
-  <div class="mian">
+  <div class="mian" :style="style">
     <h1 class="contain-title">{{ title }}</h1>
     <div>
       <slot> </slot>
     </div>
-    <div>
+    <div class="fixd-right-btn">
       <!-- <template v-slot:header>
               <h1>v-slot需要放置在template中</h1>
             </template> -->
-      <slot name="header"> </slot>
+      <slot name="btn"> </slot>
     </div>
   </div>
 </template>
@@ -21,6 +21,10 @@ export default {
       type: String,
       default: "123",
     },
+    height: {
+      type: String,
+      default: "110",
+    },
   },
   data() {
     return {};
@@ -29,6 +33,13 @@ export default {
   mounted() {},
 
   methods: {},
+  computed: {
+    style() {
+      return {
+        minHeight: `calc(100vh - ${this.height}px)`,
+      };
+    },
+  },
 };
 </script>
 
@@ -38,5 +49,15 @@ export default {
   padding: 16px;
   border-radius: 8px;
   height: 100%;
+  // min-height: calc(100vh - 110px);
+  position: relative;
+  .contain-title {
+    margin-bottom: 20px;
+  }
+  .fixd-right-btn {
+    position: absolute;
+    right: 20px;
+    top: 16px;
+  }
 }
 </style>

+ 24 - 711
src/components/searchBoxNew.vue

@@ -1,77 +1,6 @@
 <template>
   <div id="searchBoxNew">
-    <div class="inputListBox" v-if="pendingType">
-      <div class="fon_s">审核状态:</div>
-      <div>
-        <el-button
-          :type="formData.periodStatus === item.value ? 'primary' : ''"
-          :size="size"
-          v-for="(item, index) in pendlists"
-          :key="index"
-          @click="topPendingType(item.value)"
-          >{{ item.label }}</el-button
-        >
-      </div>
-    </div>
-    <div class="inputListBox" v-if="classStatus">
-      <div class="fon_s">开班状态:</div>
-      <div>
-        <el-button
-          :type="formData.classStatus === item.value ? 'primary' : ''"
-          :size="size"
-          v-for="(item, index) in classType"
-          :key="index"
-          @click="topClassType(item.value)"
-          >{{ item.label }}</el-button
-        >
-      </div>
-    </div>
-    <div class="inputListBox" v-if="shType">
-      <div class="fon_s">审核状态:</div>
-      <div>
-        <el-button
-          :type="formData.status === item.value ? 'primary' : ''"
-          :size="size"
-          v-for="(item, index) in lists5"
-          :key="index"
-          @click="topSearchsh(item.value)"
-          >{{ item.label }}</el-button
-        >
-      </div>
-    </div>
-    <div class="inputListBox" v-if="hoursType">
-      <div class="fon_s">审核状态:</div>
-      <div>
-        <el-button
-          :type="formData.periodStatus === item.value ? 'primary' : ''"
-          :size="size"
-          v-for="(item, index) in lists6"
-          :key="index"
-          @click="topHoursSearchsh(item.value)"
-          >{{ item.label }}</el-button
-        >
-      </div>
-    </div>
-    <!-- <div class="inputListBox" v-if="classType">
-      <div>
-        <el-button
-          :type="formData.goodsType === item.value ? 'primary' : ''"
-          :size="size"
-          v-for="(item, index) in classLists"
-          :key="index"
-          @click="classSearch(item.value)"
-          >{{ item.label }}</el-button
-        >
-      </div>
-    </div> -->
     <div class="inputListBoxs">
-      <div
-        class="fon_s"
-        style="padding-top: 10px; width: 70px; text-align: end"
-        v-if="!redIcon"
-      >
-        筛选:
-      </div>
       <el-form
         @submit.native.prevent="() => {}"
         :inline="true"
@@ -83,263 +12,10 @@
           :key="index"
           :label="item.label"
         >
-          <!-- 教育类型 -->
-          <el-select
-            v-if="item.scope === 'educationType'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-            @change="changeEducationType"
-          >
-            <el-option
-              v-for="(items, indexs) in educationType"
-              v-show="
-                !item.filter ||
-                (item.filter && items.educationName === '继续教育')
-              "
-              :key="indexs"
-              :label="items.educationName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 项目类型 -->
-          <el-select
-            v-else-if="item.scope === 'projectLevel'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in newProjectLevel"
-              :key="indexs"
-              :label="items.projectName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 业务层次 -->
-          <el-select
-            v-else-if="item.scope === 'businessLevel'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-            @change="changeBusinessLevel($event)"
-          >
-            <el-option
-              v-for="(items, indexs) in newBusinessLevel"
-              :key="indexs"
-              v-show="
-                !item.filter ||
-                (item.filter &&
-                  (items.projectName === '造价师' ||
-                    items.projectName === '建造师') &&
-                  items.businessName === '二级')
-              "
-              :label="items.projectName + '-' + items.businessName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 机构列表 -->
-          <el-select
-            v-else-if="item.scope === 'systemtenantlist'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-            clearable
-          >
-            <el-option
-              v-for="(items, indexs) in systemtenantlist"
-              :key="indexs"
-              :label="items.tenantName"
-              :value="items.tenantId"
-            ></el-option>
-          </el-select>
-          <!-- 院校 -->
-          <el-select
-            v-else-if="item.scope === 'schoolList'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in newSchoolList"
-              :key="indexs"
-              :label="items.schoolName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 专业-根据教育类型筛选 -->
-          <el-select
-            v-else-if="item.scope === 'Professional'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in newProfessional"
-              :key="indexs"
-              :label="items.categoryName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-
-          <!-- 专业 -->
-          <el-select
-            v-else-if="item.scope === 'ProfessionalList'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in Professional"
-              :key="indexs"
-              :label="items.categoryName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 科目 -->
-          <el-select
-            v-else-if="item.scope === 'sujectType'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in newSujectType"
-              :key="indexs"
-              :label="items.subjectName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 题目类型 -->
-          <el-select
-            v-else-if="item.scope === 'selectBank'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in optionsBank"
-              :key="indexs"
-              :label="items.label"
-              :value="items.value"
-            ></el-option>
-          </el-select>
-          <!-- 试卷类型 -->
-          <el-select
-            v-else-if="item.scope === 'paperType'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in paperType"
-              :key="indexs"
-              :label="items.label"
-              :value="items.value"
-            ></el-option>
-          </el-select>
-          <!-- 证书类型 -->
-          <el-select
-            v-else-if="item.scope === 'certificate'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in certificate"
-              :key="indexs"
-              :label="items.certificateName"
-              :value="items.id"
-            ></el-option>
-          </el-select>
-          <!-- 考试标题 -->
-          <el-select
-            v-else-if="item.scope === 'examLists'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in examLists"
-              :key="indexs"
-              :label="items.applyName"
-              :value="items.applyId"
-            ></el-option>
-          </el-select>
-          <!-- 考试标题:只显示已启用 -->
-          <el-select
-            v-else-if="item.scope === 'examList'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in examList"
-              :key="indexs"
-              :label="items.applyName"
-              :value="items.applyId"
-            ></el-option>
-          </el-select>
-          <!-- 考试地点 -->
-          <el-select
-            v-else-if="item.scope === 'applySiteAddress'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in applySiteAddress"
-              :key="indexs"
-              :label="items.siteAddress"
-              :value="item.getType === 1 ? items.siteAddress : items.siteId"
-            ></el-option>
-          </el-select>
-          <!-- 考试地点:手动过滤 -->
-          <el-select
-            v-else-if="item.scope === 'applySiteAddressX'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in applySiteAddressX"
-              :key="indexs"
-              :label="items.siteAddress"
-              :value="item.getType === 1 ? items.siteAddress : items.siteId"
-            ></el-option>
-          </el-select>
-          <!-- 前培标题:只显示启用 -->
-          <el-select
-            v-else-if="item.scope === 'beforeList'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in beforeList"
-              :key="indexs"
-              :label="items.beforeName"
-              :value="items.beforeId"
-            ></el-option>
-          </el-select>
-          <!-- 前培标题 -->
-          <el-select
-            v-else-if="item.scope === 'beforeLists'"
-            v-model="formData[item.prop]"
-            :placeholder="item.placeholder"
-            :size="size"
-          >
-            <el-option
-              v-for="(items, indexs) in beforeLists"
-              :key="indexs"
-              :label="items.beforeName"
-              :value="items.beforeId"
-            ></el-option>
-          </el-select>
           <!-- 自定义select -->
           <el-select
             :clearable="item.noClear === false ? false : true"
-            v-else-if="item.scope === 'select'"
+            v-if="item.scope === 'select'"
             v-model="formData[item.prop]"
             :placeholder="item.placeholder"
             :size="size"
@@ -422,8 +98,8 @@
           ></el-cascader>
           <el-date-picker
             v-else-if="item.scope === 'datePicker'"
-            v-model="formData[item.prop]"
-            type="datetimerange"
+            v-model="formData[item.prop || item.scope]"
+            :type="item.type || 'datetimerange'"
             :picker-options="pickerOptions"
             range-separator="至"
             start-placeholder="开始日期"
@@ -431,6 +107,11 @@
             align="right"
             :size="size"
             value-format="timestamp"
+            @change="
+              (val) => {
+                change3(val, item);
+              }
+            "
           >
           </el-date-picker>
           <el-date-picker
@@ -493,162 +174,11 @@
 </template>
 
 <script>
-import { mapGetters } from "vuex";
 export default {
-  props: [
-    "formList",
-    "topType",
-    "pendingType",
-    "formData",
-    "shType",
-    "hoursType",
-    "redIcon",
-    "advanced",
-    "advancedName",
-    "classStatus",
-  ], //参考文档 component.md
+  props: ["formList", "formData", "advanced", "advancedName"], //参考文档 component.md
   data() {
     return {
-      tireStatus: "", //当前选择的教育类型tireStatus
-      lists: [
-        {
-          label: "全部",
-          value: "",
-        },
-        {
-          label: "视频",
-          value: 1,
-        },
-        {
-          label: "题库",
-          value: 2,
-        },
-        {
-          label: "补考",
-          value: 3,
-        },
-        {
-          label: "前培",
-          value: 4,
-        },
-      ],
-      classType: [
-        {
-          label: "全部",
-          value: "",
-        },
-        {
-          label: "已开班",
-          value: 1,
-        },
-        {
-          label: "预报名(未开班)",
-          value: 0,
-        },
-      ],
-      pendlists: [
-        {
-          label: "初审",
-          value: 0,
-        },
-        {
-          label: "复审",
-          value: "1,2",
-        },
-        {
-          label: "不通过",
-          value: "-1,-2",
-        },
-        {
-          label: "已通过",
-          value: 3,
-        },
-      ],
-      lists5: [
-        {
-          label: "全部",
-          value: "",
-        },
-        {
-          label: "待审核",
-          value: 2,
-        },
-        {
-          label: "不通过",
-          value: 3,
-        },
-        {
-          label: "通过",
-          value: 1,
-        },
-      ],
-      lists6: [
-        {
-          label: "待审核",
-          value: 2,
-        },
-        {
-          label: "审核中",
-          value: 3,
-        },
-      ],
-      // classLists: [
-      //   {
-      //     label: "全部",
-      //     value: "",
-      //   },
-      //   {
-      //     label: "二建继教",
-      //     value: 1,
-      //   },
-      //   {
-      //     label: "七大员继教",
-      //     value: 2,
-      //   },
-      //   {
-      //     label: "七大员新考",
-      //     value: 3,
-      //   },
-      // ],
-      paperType: [
-        {
-          label: "发布",
-          value: 1,
-        },
-        {
-          label: "未发布",
-          value: 0,
-        },
-      ],
-      optionsBank: [
-        {
-          label: "单选题",
-          value: 1,
-        },
-        {
-          label: "多选题",
-          value: 2,
-        },
-        {
-          label: "判断题",
-          value: 3,
-        },
-        {
-          label: "案例题",
-          value: 4,
-        },
-        {
-          label: "简答题",
-          value: 5,
-        },
-      ], //题目类型
       size: "small", //输入框尺寸类型
-      newProjectLevel: [], //项目类型-筛选后的数据
-      newBusinessLevel: [], //业务层次-筛选后的数据
-      newSchoolList: [], //院校-筛选后的数据
-      newProfessional: [], //专业-筛选后的数据
-      newSujectType: [], //科目-筛选后的数据
-      applySiteAddressX: [], //考试地点-根据考试计划过滤而来
       pickerOptions: {
         //日期选择器近期功能
         shortcuts: [
@@ -684,17 +214,6 @@ export default {
     };
   },
   computed: {
-    ...mapGetters([
-      "educationType",
-      "Professional",
-      "examList",
-      "examLists",
-      "beforeList",
-      "beforeLists",
-      "applySiteAddress",
-      "certificate",
-      "systemtenantlist",
-    ]),
     /**
      * @remarks 过滤选择器列表
      */
@@ -702,105 +221,15 @@ export default {
       return function (item) {
         var newOption = JSON.parse(JSON.stringify(item));
         const arrsy = newOption.filter((items) => {
-          if (
-            items.scope === "businessLevel" ||
-            items.scope === "schoolList" ||
-            items.scope === "Professional" ||
-            items.scope === "sujectType"
-          ) {
-            if (!this.formData[items.edu]) {
-            } else {
-              if (this.educationType) {
-                const indexType = this.educationType.findIndex((its) => {
-                  return its.id === this.formData[items.edu];
-                });
-                if (
-                  items.scope === "businessLevel" &&
-                  this.educationType[indexType].tireStatus.indexOf("2") !== -1
-                ) {
-                  return items;
-                }
-                if (
-                  items.scope === "schoolList" &&
-                  this.educationType[indexType].tireStatus.indexOf("3") !==
-                    -1 &&
-                  this.formData["businessId"]
-                ) {
-                  return items;
-                }
-                if (
-                  items.scope === "Professional" &&
-                  this.educationType[indexType].tireStatus.indexOf("4") !==
-                    -1 &&
-                  this.formData["businessId"]
-                ) {
-                  return items;
-                }
-                if (
-                  items.scope === "sujectType" &&
-                  this.formData["businessId"]
-                ) {
-                  return items;
-                }
-              }
-            }
-          } else {
-            if (items.diff === "gfxs") {
-              if (
-                this.formData["studyStatus"] == 2 &&
-                this.formData["periodStatus"] == 1
-              ) {
-                return items;
-              }
-            } else if (items.diff === "ksdd") {
-              if (this.formData["applyId"]) {
-                return items;
-              }
-            } else if (items.scope === "projectLevel") {
-              if (this.formData["educationId"]) {
-                return items;
-              }
-            } else {
-              return items;
-            }
-          }
+          return items;
         });
+
         return arrsy;
       };
     },
   },
-  watch: {
-    /**
-     *
-     * @param {Number} val
-     * @remards 考试计划监听-获取对应考试地点
-     */
-    "formData.applyId"(val) {
-      const Astatus = this.formList.some((item) => {
-        return item.scope === "applySiteAddressX";
-      });
-      if (Astatus) {
-        this.getChangeAdress(val);
-        if (this.formData.applySiteAddress) {
-          this.formData.applySiteAddress = "";
-        }
-      }
-    },
-  },
+  watch: {},
   methods: {
-    /**
-     * 手动过滤考试地点
-     */
-    getChangeAdress(id) {
-      this.$api
-        .inquirepayservesiteInfo({
-          applyId: id,
-          addressStatus: 1,
-        })
-        .then((res) => {
-          this.applySiteAddressX = res.rows;
-        });
-    },
     /**
      * @remark 高级搜索
      */
@@ -841,50 +270,15 @@ export default {
         }
       }
     },
-    /**
-     *
-     * @param {int} status
-     * @remark 顶部定制按钮-根据商品类型点击快速搜索
-     */
-    topSearch(status) {
-      this.formData.goodsType = status;
-      this.$emit("search", 3);
-    },
-    /**
-     *
-     * @param {int} status
-     * @remark 顶部定制按钮-根据审核状态类型点击快速搜索
-     */
-    topPendingType(status) {
-      this.formData.periodStatus = status;
-      this.$emit("search", 4);
-    },
-    /**
-     *
-     * @param {int} status
-     * @remark 顶部定制按钮-根据审核状态类型点击快速搜索
-     */
-    topClassType(status) {
-      this.formData.classStatus = status;
-      this.$emit("search", 4);
-    },
-    /**
-     *
-     * @param {int} status
-     * @remark 顶部定制按钮-根据审核状态点击快速搜索
-     */
-    topSearchsh(types) {
-      this.formData.status = types;
-      this.$emit("search", 3);
-    },
-    /**
-     *
-     * @param {int} status
-     * @remark 顶部定制按钮-根据学时审核状态点击快速搜索
-     */
-    topHoursSearchsh(types) {
-      this.formData.periodStatus = types;
-      this.$emit("search", 2);
+    change3(val, { prop1, prop2 }) {
+      console.log(val, prop1, prop2);
+      if (val) {
+        this.formData[prop1] = val[0];
+        this.formData[prop2] = val[1];
+      } else {
+        this.formData[prop1] = undefined;
+        this.formData[prop2] = undefined;
+      }
     },
     /**
      * @remark 搜索
@@ -911,95 +305,14 @@ export default {
         }
       }
     },
-    /**
-     *
-     * @param {int} id
-     * @param {bool} status1 //是否不清空业务层级
-     * @remark 点击教育类型触发事件
-     */
-    changeEducationType(id, status1) {
-      if (!id) {
-        return;
-      }
-      const indexs = this.educationType.findIndex((item) => {
-        return item.id === id;
-      });
-      this.tireStatus = this.educationType[indexs].tireStatus;
-      if (!status1) {
-        if (this.formData.projectId) {
-          this.formData.projectId = "";
-        }
-        if (this.formData.businessId) {
-          this.formData.businessId = "";
-        }
-      }
-      if (this.formData.subjectId) {
-        this.formData.subjectId = "";
-      }
-      this.$api
-        .inquireCourseProjectType({ status: 1, educationId: id })
-        .then((res) => {
-          this.newProjectLevel = res.rows;
-        });
-      this.$api
-        .inquirebusinessList({ status: 1, educationId: id })
-        .then((res) => {
-          this.newBusinessLevel = res.rows;
-        });
-      if (!status1) {
-        this.$api
-          .inquireCourseSubject({ status: 1, educationId: id })
-          .then((res) => {
-            this.newSujectType = res.rows;
-          });
-      }
-    },
-    /**
-     *
-     * @param {int} id
-     * @remark 点击业务层次触发事件
-     */
-    changeBusinessLevel(v) {
-      if (this.formData.schoolId) {
-        this.formData.schoolId = "";
-      }
-      this.$api.inquireUserSchool({ status: 1, businessId: v }).then((res) => {
-        this.newSchoolList = res.rows;
-      });
-      if (this.formData.majorId) {
-        this.formData.majorId = "";
-      }
-      this.$api.inquireCourseMajor({ status: 1, businessId: v }).then((res) => {
-        this.newProfessional = res.rows;
-      });
-      if (this.formData.subjectId) {
-        this.formData.subjectId = "";
-      }
-      this.$api
-        .inquireCourseSubject({ status: 1, businessId: v })
-        .then((res) => {
-          this.newSujectType = res.rows;
-        });
-    },
-    /**
-     * 外部调用-商品新增编辑页
-     */
-    changeSuject(v) {
-      if (v) {
-        this.$api
-          .inquireCourseSubject({ status: 1, projectId: v })
-          .then((res) => {
-            this.newSujectType = res.rows;
-          });
-      } else {
-        this.newSujectType = [];
-      }
-    },
   },
 };
 </script>
 
 <style lang="less" scoped>
+#searchBoxNew {
+  margin-bottom: 20px;
+}
 .fon_s {
   font-size: 14px;
   color: #6b6b6b;

Разлика између датотеке није приказан због своје велике величине
+ 6 - 969
src/components/tableList.vue


+ 66 - 53
src/main.js

@@ -1,69 +1,82 @@
-import Vue from 'vue'
+import Vue from "vue";
 
-import Cookies from 'js-cookie'
+import Cookies from "js-cookie";
 
-import Element from 'element-ui'
-import AFTableColumn from 'af-table-column'
-import './assets/fonts/iconfont.css'
-import './assets/styles/element-variables.scss'
+import Element from "element-ui";
+import AFTableColumn from "af-table-column";
+import "./assets/fonts/iconfont.css";
+import "./assets/styles/element-variables.scss";
 
-import '@/assets/styles/index.scss' // global css
-import '@/assets/styles/ruoyi.scss' // ruoyi css
-import App from './App'
-import store from './store'
-import api from '@/api/api'
-import gsap from 'gsap'
-import upload from '@/utils/uploadFile'
-import router from './router'
-import directive from './directive' //directive
-import plugins from './plugins' // plugins
-import './assets/icons' // icon
-import './permission' // permission control
-import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
+import "@/assets/styles/index.scss"; // global css
+import "@/assets/styles/ruoyi.scss"; // ruoyi css
+import App from "./App";
+import store from "./store";
+import api from "@/api/api";
+import gsap from "gsap";
+import upload from "@/utils/uploadFile";
+import router from "./router";
+import directive from "./directive"; //directive
+import plugins from "./plugins"; // plugins
+import "./assets/icons"; // icon
+import "./permission"; // permission control
+import {
+  parseTime,
+  resetForm,
+  clearForm,
+  addDateRange,
+  selectDictLabel,
+  selectDictLabels,
+  handleTree,
+} from "@/utils/ruoyi";
 // 通用弹窗
 import BaseDialog from "@/components/BaseDialog";
 // 分页组件
 import Pagination from "@/components/Paginations";
 // 自定义表格工具组件
-import RightToolbar from "@/components/RightToolbar"
+import RightToolbar from "@/components/RightToolbar";
 // 文件上传组件
-import FileUpload from "@/components/FileUpload"
+import FileUpload from "@/components/FileUpload";
 // 字典标签组件
-import DictTag from '@/components/DictTag'
+import DictTag from "@/components/DictTag";
 // 通用容器
-import container from "@/components/common/container"
-import methodsTools from '@/utils/methodsTool'
+import container from "@/components/common/container";
+import methodsTools from "@/utils/methodsTool";
 // 全局方法挂载
+import TableList from "@/components/tableList";
+import SearchBoxNew from "@/components/searchBoxNew";
 
-Vue.prototype.$store = store
-Vue.prototype.parseTime = parseTime
-Vue.prototype.resetForm = resetForm
-Vue.prototype.addDateRange = addDateRange
-Vue.prototype.selectDictLabel = selectDictLabel
-Vue.prototype.selectDictLabels = selectDictLabels
-Vue.prototype.handleTree = handleTree
-Vue.prototype.$api = api
-Vue.prototype.$upload = upload
-Vue.prototype.$methodsTools = methodsTools
-Vue.prototype.gsap = gsap
+Vue.prototype.$store = store;
+Vue.prototype.parseTime = parseTime;
+Vue.prototype.resetForm = resetForm;
+Vue.prototype.clearForm = clearForm;
+Vue.prototype.addDateRange = addDateRange;
+Vue.prototype.selectDictLabel = selectDictLabel;
+Vue.prototype.selectDictLabels = selectDictLabels;
+Vue.prototype.handleTree = handleTree;
+Vue.prototype.$api = api;
+Vue.prototype.$upload = upload;
+Vue.prototype.$methodsTools = methodsTools;
+Vue.prototype.gsap = gsap;
 
 // 全局组件挂载
-Vue.component('DictTag', DictTag)
-Vue.component('Container', container)
-Vue.component('Pagination', Pagination)
-Vue.component('BaseDialog', BaseDialog)
-Vue.component('RightToolbar', RightToolbar)
-Vue.component('FileUpload', FileUpload)
+Vue.component("DictTag", DictTag);
+Vue.component("Container", container);
+Vue.component("Pagination", Pagination);
+Vue.component("BaseDialog", BaseDialog);
+Vue.component("RightToolbar", RightToolbar);
+Vue.component("FileUpload", FileUpload);
+Vue.component("TableList", TableList);
+Vue.component("SearchBoxNew", SearchBoxNew);
 const fontRate = {
   CHAR_RATE: 1.1, // 汉字比率
   NUM_RATE: 0.65, // 数字
-  OTHER_RATE: 0.8 // 除汉字和数字以外的字符的比率
-}
-const fontSize = 16
+  OTHER_RATE: 0.8, // 除汉字和数字以外的字符的比率
+};
+const fontSize = 16;
 // 注册组件
-Vue.use(AFTableColumn, { fontRate, fontSize })
-Vue.use(directive)
-Vue.use(plugins)
+Vue.use(AFTableColumn, { fontRate, fontSize });
+Vue.use(directive);
+Vue.use(plugins);
 
 /**
  * If you don't want to use mock-server
@@ -75,14 +88,14 @@ Vue.use(plugins)
  */
 
 Vue.use(Element, {
-  size: Cookies.get('size') || 'medium' // set element-ui default size
-})
+  size: Cookies.get("size") || "medium", // set element-ui default size
+});
 
-Vue.config.productionTip = false
+Vue.config.productionTip = false;
 
 new Vue({
-  el: '#app',
+  el: "#app",
   router,
   store,
-  render: h => h(App)
-})
+  render: (h) => h(App),
+});

+ 80 - 34
src/router/index.js

@@ -1,10 +1,10 @@
-import Vue from 'vue'
-import Router from 'vue-router'
+import Vue from "vue";
+import Router from "vue-router";
 
-Vue.use(Router)
+Vue.use(Router);
 
 /* Layout */
-import Layout from '@/layout'
+import Layout from "@/layout";
 
 /**
  * Note: 路由配置项
@@ -25,56 +25,102 @@ import Layout from '@/layout'
     activeMenu: '/system/user'      // 当路由设置了该属性,则会高亮相对应的侧边栏。
   }
  */
-const originalPush = Router.prototype.push
+const originalPush = Router.prototype.push;
 Router.prototype.push = function push(location, onResolve, onReject) {
-  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
-  return originalPush.call(this, location).catch(err => err)
-}
+  if (onResolve || onReject)
+    return originalPush.call(this, location, onResolve, onReject);
+  return originalPush.call(this, location).catch((err) => err);
+};
 // 公共路由
 export const constantRoutes = [
   {
-    path: '/redirect',
+    path: "/redirect",
     component: Layout,
     hidden: true,
     children: [
       {
-        path: '/redirect/:path(.*)',
-        component: (resolve) => require(['@/views/redirect'], resolve)
-      }
-    ]
+        path: "/redirect/:path(.*)",
+        component: (resolve) => require(["@/views/redirect"], resolve),
+      },
+    ],
   },
   {
-    path: '/login',
-    component: (resolve) => require(['@/views/login'], resolve),
-    hidden: true
+    path: "/login",
+    component: (resolve) => require(["@/views/login"], resolve),
+    hidden: true,
   },
   {
-    path: '/404',
-    component: (resolve) => require(['@/views/error/404'], resolve),
-    hidden: true
+    path: "/404",
+    component: (resolve) => require(["@/views/error/404"], resolve),
+    hidden: true,
   },
   {
-    path: '/401',
-    component: (resolve) => require(['@/views/error/401'], resolve),
-    hidden: true
+    path: "/401",
+    component: (resolve) => require(["@/views/error/401"], resolve),
+    hidden: true,
   },
   {
-    path: '',
+    path: "",
     component: Layout,
-    redirect: 'index',
+    redirect: "index",
     children: [
       {
-        path: 'index',
-        component: (resolve) => require(['@/views/index'], resolve),
-        name: 'Index',
-        meta: { title: '工作台', icon: 'dashboard', affix: true }
-      }
-    ]
+        path: "index",
+        component: (resolve) => require(["@/views/index"], resolve),
+        name: "Index",
+        meta: { title: "工作台", icon: "dashboard", affix: true },
+      },
+    ],
+  },
+  {
+    path: "",
+    component: Layout,
+    redirect: "index",
+    children: [
+      {
+        path: "record",
+        component: (resolve) =>
+          require(["@/views/writeOffMag/record"], resolve),
+        name: "record",
+        meta: { title: "核销管理", icon: "dashboard", affix: true },
+      },
+      {
+        path: "/memberMag",
+        component: (resolve) => require(["@/views/memberMag/index"], resolve),
+        name: "memberMag",
+        meta: { title: "会员管理", icon: "dashboard", affix: true },
+      },
+      {
+        path: "/strikeBalance",
+        component: (resolve) =>
+          require(["@/views/strikeBalanceMag/index"], resolve),
+        name: "strikeBalance",
+        meta: { title: "冲账管理", icon: "dashboard", affix: true },
+      },
+      {
+        path: "/staffMag",
+        component: (resolve) => require(["@/views/staffMag/index"], resolve),
+        name: "staffMag",
+        meta: { title: "店员管理", icon: "dashboard", affix: true },
+      },
+      {
+        path: "/classify",
+        component: (resolve) => require(["@/views/goodsMag/classify"], resolve),
+        name: "classify",
+        meta: { title: "商品分类", icon: "dashboard", affix: true },
+      },
+      {
+        path: "/goodsMag",
+        component: (resolve) => require(["@/views/goodsMag/index"], resolve),
+        name: "goodsMag",
+        meta: { title: "商品管理", icon: "dashboard", affix: true },
+      },
+    ],
   },
-]
+];
 
 export default new Router({
-  mode: 'history', // 去掉url中的#
+  mode: "history", // 去掉url中的#
   scrollBehavior: () => ({ y: 0 }),
-  routes: constantRoutes
-})
+  routes: constantRoutes,
+});

+ 0 - 1
src/store/modules/permission.js

@@ -66,7 +66,6 @@ const permission = {
           const sidebarRoutes = filterAsyncRouter(sdata);
           const rewriteRoutes = filterAsyncRouter(rdata, false, true);
           console.log("rewriteRoutes", rewriteRoutes);
-          // rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
           commit("SET_ROUTES", rewriteRoutes);
           commit("SET_SIDEBAR_ROUTERS", constantRoutes.concat(sidebarRoutes));
           commit("SET_DEFAULT_ROUTES", sidebarRoutes);

+ 7 - 0
src/utils/ruoyi.js

@@ -51,6 +51,13 @@ export function resetForm(refName) {
 	}
 }
 
+// 校验清除
+export function clearForm(refName) {
+	if (this.$refs[refName]) {
+		this.$refs[refName].clearValidate();
+	}
+}
+
 // 添加日期范围
 export function addDateRange(params, dateRange, propName) {
 	let search = params;

+ 0 - 81
src/utils/uopladFile.js

@@ -1,81 +0,0 @@
-import PlvVideoUpload from '@polyv/vod-upload-js-sdk'
-import api from '@/api/api'
-import { Message } from 'element-ui';
-// import md5 from 'js-md5'
-
-// 此方法主要用于加密一些保利威的专用参数 如果是后端传递的 可以打掉
-function getToken(videoUpload, array) {
-    const ptime = array.ptime
-    const userid = 'd5f6d309fe'
-    // const secretkey = 'xpPrYdcbA1'
-    // const writeToken = '8f14a371-9d02-4ec1-922d-54d7b4f79dca'
-    const hash = array.hash
-    const sign = array.sign
-    //     const hash = md5(ptime + writeToken)
-    //   const sign = md5(secretkey + ptime)
-    videoUpload.updateUserData({ ptime, hash, sign, userid })
-    videoUpload.startAll()
-}
-
-// 由于保利威的一些机制 你需要三分钟就重新加密你的 ptime 如果你打掉了就不行
-function autoUpdateUserData(timer, videoUpload, array) {
-    getToken(videoUpload, array)
-    if (timer) {
-        clearTimeout(timer)
-        timer = null
-    }
-    timer = setTimeout(() => {
-        autoUpdateUserData(timer, videoUpload, array)
-    }, 3 * 50 * 1000)
-}
-
-/**
- * @param: files -> 一个文件的数组 注意 是【数组】
- * @param: fileSetting -> 主要是用来传递给保利威的属性
- * @param: callback -> 上传进度,成功,失败 的回调 tips:回调太多 我就拿了这三个比较有用的
- */
-export function uploadFile(files, fileSetting, callback) {
-    const videoUpload = new PlvVideoUpload({
-        region: 'line1', // (可选)上传线路, 默认line1
-        events: {
-            Error: (err) => {  // 错误事件回调
-                console.log(err);
-            },
-            UploadComplete: () => { }  // 全部上传任务完成回调
-        }
-    })
-    new Promise((resolve, reject) => {
-        api.inquirepolyvvideogetPolyvUpload().then(res => {
-            resolve(res)
-        })
-    }).then(res => {
-        autoUpdateUserData(null, videoUpload, res.data)
-        const uploader = videoUpload.addFile(files, {
-            FileStarted: function (uploadInfo) { // 文件开始上传回调
-                console.log("文件上传开始: " + uploadInfo.fileData.title);
-            },
-            FileProgress: function (uploadInfo) { // 文件上传过程返回上传进度信息回调
-                console.log("文件上传中: " + (uploadInfo.progress * 100).toFixed(2) + '%');
-            },
-            FileStopped: function (uploadInfo) { // 文件暂停上传回调
-                console.log("文件上传停止: " + uploadInfo.fileData.title);
-            },
-            FileSucceed: ({ fileData }) => {// 上传视频成功的回调
-                Message.success({ message: "视频已上传成功,待审核中,等待审核通过后才可使用。如未自动填充时长,请手动填写!", duration: 6000, showClose: true })
-                callback(fileData)
-            },
-            FileFailed: ({ errData }) => {// 上传视频失败的回调
-                Message.error({ message: "文件上传失败" })
-                callback("文件上传失败: " + errData)
-            }
-        }, fileSetting)
-
-    })
-    /**
-     * 这里的调用是上传全部
-     * 本来我也是一个一个调的
-     * 但是考虑到对于有多选上传不是很友好
-     * 就无论你传递几个视频 这里都统一一起上传
-     * */
-
-}

+ 36 - 34
src/utils/uploadFile.js

@@ -1,37 +1,39 @@
-import api from '@/api/api'
+import { getPolicy, uploadFile } from "../api/upload/index";
 export default {
-    // 上传图片标识 0头像 1身份证 2题库 3指南指引图片 4广告图片 5身份证或学信网图片 6文件excel,word,zip等
-    //file: 类似this.$refs.file.files[0]
-    upload: function (file, int) {
-        return new Promise((resolve, reject) => {
-            var datas = {
-                imageStatus: int
-            }
-            api.getPolicy(datas).then(res => {
-                var ossToken = res.data.resultContent
-                // const filename = file.name;
-                // const fileExtension = filename.split('.').pop().toLowerCase()
-                let formData = new FormData()
-                // formData.append('key', ossToken.dir + "." + fileExtension); //存储在oss的文件路径
-                formData.append('key', ossToken.dir); //存储在oss的文件路径
-                formData.append('OSSAccessKeyId', ossToken.accessid); //accessKeyId
-                formData.append('policy', ossToken.policy); //policy
-                formData.append('Signature', ossToken.signature); //签名
-                formData.append('callback', ossToken.callback); //回调
-                formData.append('success_action_status', 200); //成功后返回的操作码
-                //如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
-                formData.append("file", file);
-                api.uploadFile(ossToken.host, formData).then(resp => {
-                    resolve(ossToken.dir)
-                    // resolve(ossToken.host + '/' + ossToken.dir)
-                }).catch(error => {
-                    reject(error)
-                })
-
-            }).catch(err => {
-                reject(err)
+  // 上传图片标识 0头像 1身份证 2题库 3指南指引图片 4广告图片 5身份证或学信网图片 6文件excel,word,zip等
+  //file: 类似this.$refs.file.files[0]
+  upload: function (file, int) {
+    return new Promise((resolve, reject) => {
+      var datas = {
+        imageStatus: int,
+      };
+      getPolicy(datas)
+        .then((res) => {
+          var ossToken = res.data.resultContent;
+          // const filename = file.name;
+          // const fileExtension = filename.split('.').pop().toLowerCase()
+          let formData = new FormData();
+          // formData.append('key', ossToken.dir + "." + fileExtension); //存储在oss的文件路径
+          formData.append("key", ossToken.dir); //存储在oss的文件路径
+          formData.append("OSSAccessKeyId", ossToken.accessid); //accessKeyId
+          formData.append("policy", ossToken.policy); //policy
+          formData.append("Signature", ossToken.signature); //签名
+          formData.append("callback", ossToken.callback); //回调
+          formData.append("success_action_status", 200); //成功后返回的操作码
+          //如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
+          formData.append("file", file);
+          uploadFile(ossToken.host, formData)
+            .then((resp) => {
+              resolve(ossToken.dir);
+              // resolve(ossToken.host + '/' + ossToken.dir)
             })
+            .catch((error) => {
+              reject(error);
+            });
         })
-
-    },
-}
+        .catch((err) => {
+          reject(err);
+        });
+    });
+  },
+};

+ 34 - 65
src/views/components/index/goodsList.vue

@@ -1,38 +1,36 @@
 <template>
   <container title="商品列表">
-    <div class="goods-ward">
-      <div class="input-box">
-        <el-input
-          prefix-icon="el-icon-search"
-          placeholder="输入产品名称"
-          v-model="input1"
-        >
-        </el-input>
+    <div>
+      <el-input
+        prefix-icon="el-icon-search"
+        placeholder="输入产品名称"
+        v-model="input1"
+      >
+      </el-input>
+    </div>
+    <div class="good-main">
+      <div class="good-category">
+        <el-tree
+          highlight-current
+          :data="data"
+          :props="defaultProps"
+          :render-content="renderContent"
+        ></el-tree>
       </div>
-      <div class="good-main">
-        <div class="good-category">
-          <el-tree
-            highlight-current
-            :data="data"
-            :props="defaultProps"
-            :render-content="renderContent"
-          ></el-tree>
-        </div>
-        <div class="good-list scrollbar">
-          <div
-            class="good-list-item"
-            :class="{ actived: activeIds.includes(item) }"
-            @click="select(item)"
-            v-for="item in 10"
-            :key="item"
-          >
-            <p class="item-title line2">
-              鲁花花生油鲁花花生油最多两行鲁花花生油鲁花花生油最多两行
-            </p>
-            <span class="text-21f">2000积分</span>
-            <div class="cb22 item-money">¥2243.00</div>
-            <p class="c99">原价:<span class="text-line">3223.00</span>元</p>
-          </div>
+      <div class="good-list scrollbar">
+        <div
+          class="good-list-item"
+          :class="{ actived: activeIds.includes(item) }"
+          @click="select(item)"
+          v-for="item in 10"
+          :key="item"
+        >
+          <p class="item-title line2">
+            鲁花花生油鲁花花生油最多两行鲁花花生油鲁花花生油最多两行
+          </p>
+          <span class="text-21f">2000积分</span>
+          <div class="cb22 item-money">¥2243.00</div>
+          <p class="c99">原价:<span class="text-line">3223.00</span>元</p>
         </div>
       </div>
     </div>
@@ -137,19 +135,11 @@ export default {
         this.selectedList.push({ id: item });
       }
     },
-    aaa(node, data, store) {
-      console.log(node, data, store, 789);
-    },
     renderContent(h, { node, data, store }) {
-      this.aaa(node, data, store);
       let rgba = "rgba(0, 0, 0,  " + (node.level - 1) * 0.08 + ")";
       return (
         <span class="custom-tree-node fl_b" style={{ background: rgba }}>
           <span class="custom-tree-text line1">{node.label}</span>
-          <span
-            class="el-icon-caret-right"
-            style={{ display: node.childNodes.length ? "block" : "none" }}
-          ></span>
         </span>
       );
     },
@@ -163,15 +153,10 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.input-box {
-  margin: 18px 0 16px;
-}
-.goods-ward {
-  height: calc(100vh - 180px);
-}
 .good-main {
   height: 100%;
   display: flex;
+  margin-top: 16px;
   .good-category {
     height: calc(100% - 50px);
     background: #f6f7f9;
@@ -179,16 +164,14 @@ export default {
     width: 120px;
     /deep/ {
       .el-tree-node__expand-icon {
-        display: none;
+        position: absolute;
+        right: 0;
+        font-size: 16px;
       }
       .el-tree {
         background: #f6f7f9;
         border-radius: 8px;
       }
-
-      .el-tree-node__label {
-        // padding-right: 16px;
-      }
       .el-tree-node__content {
         height: 48px;
         color: #4a4a4b;
@@ -208,20 +191,6 @@ export default {
         .custom-tree-text {
           width: 86px;
         }
-        .el-icon-caret-right {
-          cursor: pointer;
-          color: #c0c4cc !important;
-          font-size: 12px;
-          transform: rotate(90deg);
-        }
-      }
-
-      .is-expanded {
-        & .custom-tree-node > .el-icon-caret-right {
-          transform: rotate(0) !important;
-          transition: transform 0.3s ease-in-out !important,
-            -webkit-transform 0.3s ease-in-out !important;
-        }
       }
     }
   }

+ 64 - 49
src/views/components/index/payContain.vue

@@ -1,56 +1,62 @@
 <template>
   <container title="支付">
-    <div class="pay-ward">
-      <div class="pay-top">
-        <p class="pay-title">已选商品</p>
-        <div class="good-list scrollbar">
-          <div class="good-item fl_c" v-for="(item, i) in list" :key="i">
-            <img
-              src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
-              alt=""
-            />
-            <div class="good-info">
-              <div class="line1">
-                鲁花花生油鲁花花生油最多一行鲁花花生油鲁花花生油最多一行
-              </div>
-              <div>
-                <span class="cb22">¥2243.00</span>
-                <span class="text-line c99">¥2243.00</span>
-                <span class="text-21f">¥2243.00</span>
-              </div>
+    <div class="pay-top">
+      <p class="pay-title">已选商品</p>
+      <div class="good-list scrollbar">
+        <div class="good-item fl_c" v-for="(item, i) in list" :key="i">
+          <img
+            src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
+            alt=""
+          />
+          <div class="good-info">
+            <div class="line1">
+              鲁花花生油鲁花花生油最多一行鲁花花生油鲁花花生油最多一行
             </div>
-            <div class="good-btn fl_c" @click="del(i)">
-              <i class="el-icon-delete"></i>
+            <div>
+              <span class="cb22">¥2243.00</span>
+              <span class="text-line c99">¥2243.00</span>
+              <span class="text-21f">¥2243.00</span>
             </div>
           </div>
+          <div class="good-btn fl_c" @click="del(i)">
+            <i class="el-icon-delete"></i>
+          </div>
         </div>
       </div>
-      <div class="pay-bom">
-        <p class="pay-title">商品价格</p>
-        <div class="input-ward fl">
-          ¥
-          <input placeholder="请输入金额" v-model="money" />
-        </div>
-        <div class="discount">
-          <el-checkbox v-model="checked">折扣商品</el-checkbox>
-          <span class="mr">该商品最多可抵扣</span>
-          <input type="text" />
-          <span class="text-21f">(2000积分)</span>
-        </div>
-        <div class="pay-bom-item c48">折扣金额:233元</div>
-        <div class="pay-bom-item c48">
-          实付金额:<span class="money">¥2243.00</span>
-        </div>
-        <div class="pay-bom-item fl c48">
-          支付方式:
-          <div
-            class="wechart fl_c"
-            :class="{ actived: active }"
-            @click="active = !active"
-          >
-            <img src="../../../assets//images//icon_wechat.png" alt="" />
-            <span>微信支付</span>
-          </div>
+    </div>
+    <div class="pay-bom">
+      <p class="pay-title">商品价格</p>
+      <div class="input-ward fl">
+        ¥
+        <input
+          @focus="$emit('changeFocusType', 'money')"
+          placeholder="请输入金额"
+          v-model="from.money"
+        />
+      </div>
+      <div class="discount">
+        <el-checkbox v-model="checked">折扣商品</el-checkbox>
+        <span class="mr">该商品最多可抵扣</span>
+        <input
+          type="text"
+          v-model="from.discount"
+          @focus="$emit('changeFocusType', 'discount')"
+        />
+        <span class="text-21f">(2000积分)</span>
+      </div>
+      <div class="pay-bom-item c48">折扣金额:233元</div>
+      <div class="pay-bom-item c48">
+        实付金额:<span class="money">¥2243.00</span>
+      </div>
+      <div class="pay-bom-item fl c48">
+        支付方式:
+        <div
+          class="wechart fl_c"
+          :class="{ actived: active }"
+          @click="active = !active"
+        >
+          <img src="../../../assets//images//icon_wechat.png" alt="" />
+          <span>微信支付</span>
         </div>
       </div>
     </div>
@@ -67,6 +73,15 @@ export default {
         return [];
       },
     },
+    from: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+    type: {
+      type: [Number, String],
+    },
   },
   data() {
     return {
@@ -82,6 +97,9 @@ export default {
     del(index) {
       this.list.splice(index, 1);
     },
+    focus(type) {
+      this.$emit("update:type", type);
+    },
   },
   watch: {
     list: {
@@ -100,9 +118,6 @@ export default {
   font-size: 14px;
   color: #4a4a4b;
 }
-.pay-ward {
-  height: calc(100vh - 180px);
-}
 .pay-top {
   margin-bottom: 50px;
   .good-list {

+ 22 - 32
src/views/components/index/scan.vue

@@ -3,13 +3,17 @@
     <div class="scan-ward">
       <div class="scan-top">
         <div class="input-box">
-          <el-input placeholder="请扫描会员卡" v-model="input1">
+          <el-input
+            @focus="$emit('changeFocusType', 'cardNum')"
+            placeholder="请扫描会员卡"
+            v-model="user.cardNum"
+          >
             <img src="../../../assets/images/icon_scan.png" slot="suffix" />
           </el-input>
         </div>
         <div class="code">
           <vue-barcode
-            :value="value1"
+            :value="user.code"
             line-color="#222222"
             width="2"
             marginBottom="1"
@@ -31,9 +35,9 @@
       <div class="keyboard-box">
         <div class="line"></div>
         <key-board
-          @change="valChange"
-          @backspace="backspace"
-          @comfirm="comfirm"
+          @change="change"
+          @backspace="$emit('backspace')"
+          @comfirm="$emit('comfirm')"
         ></key-board>
       </div>
     </div>
@@ -45,36 +49,23 @@ import keyBoard from "./keyboard";
 import VueBarcode from "vue-barcode";
 export default {
   name: "SaasScan",
+  props: {
+    user: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
   data() {
-    return {
-      value: "",
-      value1: "1111111111111111",
-      input1: "",
-    };
+    return {};
   },
 
   mounted() {},
 
   methods: {
-    tab(value) {
-      const index = this.actives.findIndex((e) => e == value);
-      if (index == -1) {
-        this.actives.push(value);
-      } else {
-        this.actives.splice(index, 1);
-      }
-    },
-    valChange(val) {
-      this.value += val;
-    },
-    backspace() {
-      if (this.value.length) {
-        console.log(123);
-        this.value = this.value.substr(0, this.value.length - 1);
-      }
-    },
-    comfirm() {
-      console.log("确认");
+    change(val) {
+      this.$emit("change", val);
     },
   },
   components: {
@@ -92,13 +83,13 @@ export default {
 .scan-top {
   width: 100%;
   .input-box {
-    margin: 18px 0 16px;
     img {
       margin: 8px 8px 0 0;
     }
   }
   .code {
     display: flex;
+    margin-top: 16px;
     /deep/ {
       & > div {
         margin: 0 auto;
@@ -121,12 +112,11 @@ export default {
   }
   .info {
     width: 100%;
-    padding-top: 26px;
     color: #4a4a4b;
     font-size: 15px;
     p {
       margin: 0;
-      margin-bottom: 18px;
+      line-height: 36px;
       display: inline-block;
       width: 50%;
     }

+ 169 - 0
src/views/goodsMag/classify.vue

@@ -0,0 +1,169 @@
+<template>
+  <container title="商品分类">
+    <template v-slot:btn>
+      <el-button type="primary" @click="dialogVisible = true"
+        >添加分类</el-button
+      >
+      <el-button @click="batchDel">批量删除</el-button>
+    </template>
+    <search-box-new
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      rowKey="id"
+      :loading="loading"
+    >
+      <template slot="status" slot-scope="props">
+        <el-switch
+          v-model="props.scope.row.status"
+          active-color="#13ce66"
+          inactive-color="#ff4949"
+          :active-value="1"
+          :inactive-value="0"
+          @change="statusChange($event, props.scope.row)"
+        >
+        </el-switch>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="handelClick(2, props.scope.row.tpId)"
+          >编辑</el-button
+        >
+        <el-button type="text" @click="resetPass(props.scope.row.tpId)"
+          >添加</el-button
+        >
+        <el-button type="text" @click="handelDel(props.scope.row.tpId)"
+          >删除</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize.sync="formData.pageSize"
+      :currentPage.sync="formData.pageNum"
+      @search="search"
+    />
+    <class-set-dlg :dialogVisible.sync="dialogVisible"></class-set-dlg>
+  </container>
+</template>
+
+<script>
+import ClassSetDlg from "./components/ClassSetDlg";
+export default {
+  name: "SaasMemberRecord",
+
+  data() {
+    return {
+      loading: false,
+      navText: {
+        index: 0,
+        num: true,
+        choice: true,
+        addHide: true,
+        openCheckMore: true,
+        custom: false,
+      },
+      formData: {},
+      tableSet: [
+        {
+          label: "分类名称",
+          prop: "tpName",
+        },
+        {
+          label: "启动状态",
+          prop: "tpName",
+          scope: "solt",
+          soltName: "status",
+        },
+        {
+          label: "创建时间",
+          prop: "tpName",
+        },
+      ],
+      tableData: [{}],
+      total: 0,
+      formList: [
+        {
+          prop: "name",
+          placeholder: "请输分类名称",
+        },
+      ],
+      dialogVisible: true,
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    search(v) {
+      console.log(this.formData, 789);
+    },
+    init() {
+      this.search();
+    },
+    del(id) {
+      this.$confirm("确定删除吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {})
+        .catch(() => {});
+    },
+    resetPass(id) {
+      this.$confirm("确定恢复为初始密码吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {})
+        .catch(() => {});
+    },
+    batchDel() {
+      let len = this.$refs.tableList.allCheckData.length;
+      if (!len) {
+        return this.$message.warning("请先勾选店员");
+      }
+      this.$confirm(`此操作将永久删除所勾选的${len}条店员, 是否继续?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          const ids = this.$refs.tableList.allCheckData.map(
+            (item) => item.moduleExamId
+          );
+          moduleVolumeBatchDel({
+            status: -1,
+            ids,
+          }).then((res) => {
+            this.$message.success("批量删除成功");
+            this.$refs.tableList.clearMoreActive();
+            this.search(1);
+          });
+        })
+        .catch(() => {});
+    },
+    statusChange(e, row) {
+      //   this.$api
+      //     .editmallstore({ storeId: row.storeId, status: e })
+      //     .then((res) => {
+      //       this.$message.success("操作成功");
+      //       row.status = e;
+      //     })
+      //     .catch(() => {
+      //       return (row.status = e ? 0 : 1);
+      //     });
+    },
+  },
+  components: { ClassSetDlg },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 155 - 0
src/views/goodsMag/components/ClassSetDlg.vue

@@ -0,0 +1,155 @@
+<template>
+  <Base-dialog
+    :title="form.id ? '编辑分类' : '添加分类'"
+    :isShow.sync="isShow"
+    @close="close"
+    :isShowFooter="false"
+    width="450px"
+  >
+    <el-form
+      label-width="80px"
+      label-position="left"
+      :model="form"
+      hide-required-asterisk
+      :rules="rules"
+      ref="form"
+    >
+      <el-form-item label="上级分类:" prop="parent">
+        <el-cascader
+          :options="options"
+          :props="{ checkStrictly: true }"
+          v-model="form.parent"
+        ></el-cascader>
+      </el-form-item>
+      <el-form-item label="分类名称:" prop="userName">
+        <el-input v-model.Number="form.userName" placeholder="请输入提现金额">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <div class="btns clearfix">
+      <el-button @click="visible = false">取消</el-button>
+      <el-button type="primary" @click="submitForm">启用</el-button>
+      <el-button type="info">保存</el-button>
+    </div>
+  </Base-dialog>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      form: {},
+      rules: {
+        name: [{ required: true, message: "请输入真实姓名", trigger: "blur" }],
+        parent: [
+          { required: true, message: "请选择启动状态", trigger: "change" },
+        ],
+      },
+      options: [
+        {
+          value: "zhinan",
+          label: "指南",
+          children: [
+            {
+              value: "shejiyuanze",
+              label: "设计原则",
+              children: [
+                {
+                  value: "yizhi",
+                  label: "一致",
+                },
+                {
+                  value: "fankui",
+                  label: "反馈",
+                },
+                {
+                  value: "xiaolv",
+                  label: "效率",
+                },
+                {
+                  value: "kekong",
+                  label: "可控",
+                },
+              ],
+            },
+          ],
+        },
+      ],
+    };
+  },
+  methods: {
+    resetForm() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        parent: undefined,
+      };
+      this.clearForm("form");
+    },
+    submitForm() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          withdrawal(this.form).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("提现申请成功");
+              this.isShow = false;
+              this.$emit("getSellerInfo");
+            }
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    close() {
+      //   this.isShow = false;
+      this.clearForm("form");
+    },
+  },
+  computed: {
+    isShow: {
+      get() {
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+    ...mapGetters(["roleList"]),
+  },
+  created() {},
+  components: {},
+  watch: {
+    dialogVisible: {
+      handler(val) {
+        if (val) {
+          this.resetForm();
+        }
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btns {
+  .el-button {
+    margin-top: 20px;
+    float: right;
+    margin-left: 14px;
+  }
+}
+/deep/ {
+  .el-cascader {
+    width: 100%;
+  }
+}
+</style>

+ 171 - 0
src/views/goodsMag/components/GoodSetDlg.vue

@@ -0,0 +1,171 @@
+<template>
+  <Base-dialog
+    :title="form.id ? '编辑分类' : '添加分类'"
+    :isShow.sync="isShow"
+    @close="close"
+    :isShowFooter="false"
+    width="600px"
+  >
+    <el-form
+      label-width="90px"
+      label-position="left"
+      :model="form"
+      hide-required-asterisk
+      :rules="rules"
+      ref="form"
+    >
+      <el-form-item label="商品分类:" prop="parent">
+        <el-cascader
+          :options="options"
+          :props="{ checkStrictly: true }"
+          v-model="form.parent"
+        ></el-cascader>
+      </el-form-item>
+      <el-form-item label="产品名称:" prop="userName">
+        <el-input v-model.Number="form.userName" placeholder="请输入产品名称">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="商品主图:" prop="userName">
+        <file-upload></file-upload>
+      </el-form-item>
+      <el-form-item label="产品原价:" prop="userName">
+        <el-input v-model.Number="form.userName" placeholder="请输入产品原价">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="会员优惠价:" prop="userName">
+        <el-input v-model.Number="form.userName" placeholder="请输入会员优惠价">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="可抵扣积分:" prop="userName">
+        <el-input v-model.Number="form.userName" placeholder="请输入可抵扣积分">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <div class="btns clearfix">
+      <el-button @click="visible = false">取消</el-button>
+      <el-button type="primary" @click="submitForm">启用</el-button>
+      <el-button type="info">保存</el-button>
+    </div>
+  </Base-dialog>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import FileUpload from "../../../components/FileUpload/index.vue";
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      form: {},
+      rules: {
+        name: [{ required: true, message: "请输入真实姓名", trigger: "blur" }],
+        parent: [
+          { required: true, message: "请选择启动状态", trigger: "change" },
+        ],
+      },
+      options: [
+        {
+          value: "zhinan",
+          label: "指南",
+          children: [
+            {
+              value: "shejiyuanze",
+              label: "设计原则",
+              children: [
+                {
+                  value: "yizhi",
+                  label: "一致",
+                },
+                {
+                  value: "fankui",
+                  label: "反馈",
+                },
+                {
+                  value: "xiaolv",
+                  label: "效率",
+                },
+                {
+                  value: "kekong",
+                  label: "可控",
+                },
+              ],
+            },
+          ],
+        },
+      ],
+    };
+  },
+  methods: {
+    resetForm() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        parent: undefined,
+      };
+      this.clearForm("form");
+    },
+    submitForm() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          withdrawal(this.form).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("提现申请成功");
+              this.isShow = false;
+              this.$emit("getSellerInfo");
+            }
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    close() {
+      //   this.isShow = false;
+      this.clearForm("form");
+    },
+  },
+  computed: {
+    isShow: {
+      get() {
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+    ...mapGetters(["roleList"]),
+  },
+  created() {},
+  components: { FileUpload },
+  watch: {
+    dialogVisible: {
+      handler(val) {
+        if (val) {
+          this.resetForm();
+        }
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btns {
+  .el-button {
+    margin-top: 20px;
+    float: right;
+    margin-left: 14px;
+  }
+}
+/deep/ {
+  .el-cascader {
+    width: 100%;
+  }
+}
+</style>

+ 191 - 0
src/views/goodsMag/index.vue

@@ -0,0 +1,191 @@
+<template>
+  <container title="商品管理">
+    <template v-slot:btn>
+      <el-button type="primary" @click="dialogVisible = true"
+        >添加产品</el-button
+      >
+      <el-button @click="batchDel">批量删除</el-button>
+      <el-button @click="batchDel">导出excel</el-button>
+    </template>
+    <search-box-new
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      rowKey="id"
+      :loading="loading"
+    >
+      <template slot="status" slot-scope="props">
+        <el-switch
+          v-model="props.scope.row.status"
+          active-color="#13ce66"
+          inactive-color="#ff4949"
+          :active-value="1"
+          :inactive-value="0"
+          @change="statusChange($event, props.scope.row)"
+        >
+        </el-switch>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="handelClick(2, props.scope.row.tpId)"
+          >编辑</el-button
+        >
+
+        <el-button type="text" @click="handelDel(props.scope.row.tpId)"
+          >删除</el-button
+        >
+        <el-button type="text" @click="resetPass(props.scope.row.tpId)"
+          >记录</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize.sync="formData.pageSize"
+      :currentPage.sync="formData.pageNum"
+      @search="search"
+    />
+    <good-set-dlg :dialogVisible.sync="dialogVisible"></good-set-dlg>
+  </container>
+</template>
+
+<script>
+import GoodSetDlg from "./components/GoodSetDlg";
+export default {
+  name: "SaasMemberRecord",
+
+  data() {
+    return {
+      loading: false,
+      navText: {
+        index: 0,
+        num: true,
+        choice: true,
+        addHide: true,
+        openCheckMore: true,
+        custom: false,
+      },
+      formData: {},
+      tableSet: [
+        {
+          label: "商品名称",
+          prop: "tpName",
+        },
+        {
+          label: "商品主题",
+          prop: "tpName",
+        },
+        {
+          label: "创建时间",
+          prop: "tpName",
+        },
+        {
+          label: "可抵扣积分",
+          prop: "tpName",
+        },
+        {
+          label: "商品原价",
+          prop: "tpName",
+        },
+        {
+          label: "会员优惠价",
+          prop: "tpName",
+        },
+        {
+          label: "上架状态",
+          prop: "tpName",
+          scope: "solt",
+          soltName: "status",
+        },
+        {
+          label: "录入时间",
+          prop: "tpName",
+        },
+      ],
+      tableData: [{}],
+      total: 0,
+      formList: [
+        {
+          prop: "name",
+          placeholder: "请输分类名称",
+        },
+      ],
+      dialogVisible: true,
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    search(v) {
+      console.log(this.formData, 789);
+    },
+    init() {
+      this.search();
+    },
+    del(id) {
+      this.$confirm("确定删除吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {})
+        .catch(() => {});
+    },
+    resetPass(id) {
+      this.$confirm("确定恢复为初始密码吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {})
+        .catch(() => {});
+    },
+    batchDel() {
+      let len = this.$refs.tableList.allCheckData.length;
+      if (!len) {
+        return this.$message.warning("请先勾选店员");
+      }
+      this.$confirm(`此操作将永久删除所勾选的${len}条店员, 是否继续?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          const ids = this.$refs.tableList.allCheckData.map(
+            (item) => item.moduleExamId
+          );
+          moduleVolumeBatchDel({
+            status: -1,
+            ids,
+          }).then((res) => {
+            this.$message.success("批量删除成功");
+            this.$refs.tableList.clearMoreActive();
+            this.search(1);
+          });
+        })
+        .catch(() => {});
+    },
+    statusChange(e, row) {
+      //   this.$api
+      //     .editmallstore({ storeId: row.storeId, status: e })
+      //     .then((res) => {
+      //       this.$message.success("操作成功");
+      //       row.status = e;
+      //     })
+      //     .catch(() => {
+      //       return (row.status = e ? 0 : 1);
+      //     });
+    },
+  },
+  components: { GoodSetDlg },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 43 - 5
src/views/index.vue

@@ -5,10 +5,20 @@
         <goods-list :selectedList="selectedGoodList"></goods-list>
       </el-col>
       <el-col :span="8">
-        <pay-contain :list="selectedGoodList"></pay-contain>
+        <pay-contain
+          @changeFocusType="changeFocusType"
+          :list="selectedGoodList"
+          :from="payForm"
+        ></pay-contain>
       </el-col>
       <el-col :span="8">
-        <scan></scan>
+        <scan
+          :user="user"
+          @comfirm="comfirm"
+          @change="inputBoard"
+          @backspace="backspace"
+          @changeFocusType="changeFocusType"
+        ></scan>
       </el-col>
     </el-row>
   </div>
@@ -21,13 +31,41 @@ export default {
   name: "Index",
   data() {
     return {
-      user: {},
-      selectedGoodList: [],
+      user: { code: 123, cardNum: 123 },
+      selectedGoodList: [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }],
+      payForm: {
+        money: 0,
+        discount: 0,
+      },
+      inputFocusType: "",
     };
   },
   computed: {},
   created() {},
-  methods: {},
+  methods: {
+    comfirm() {
+      console.log("确认");
+    },
+    backspace() {
+      const _t = this.inputFocusType;
+      if (!_t) {
+        return;
+      }
+      const key = _t == "cardNum" ? "user" : "payForm";
+      this[key][_t] = this[key][_t].substr(0, this[key][_t].length - 1);
+    },
+    inputBoard(val) {
+      const _t = this.inputFocusType;
+      if (!_t) {
+        return;
+      }
+      val = val.toString();
+      this[_t == "cardNum" ? "user" : "payForm"][_t] += val;
+    },
+    changeFocusType(type) {
+      this.inputFocusType = type;
+    },
+  },
   components: {
     scan,
     goodsList,

+ 129 - 0
src/views/memberMag/index.vue

@@ -0,0 +1,129 @@
+<template>
+  <container title="会员管理">
+    <template v-slot:btn>
+      <el-button>导出excel</el-button>
+    </template>
+    <search-box-new
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="handelClick(2, props.scope.row.tpId)"
+          >复制</el-button
+        >
+        <el-button type="text" @click="handelClick(1, props.scope.row.tpId)"
+          >修改</el-button
+        >
+        <el-button type="text" @click="handelDel(props.scope.row.tpId)"
+          >删除</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize.sync="formData.pageSize"
+      :currentPage.sync="formData.pageNum"
+      @search="search"
+    />
+  </container>
+</template>
+
+<script>
+export default {
+  name: "SaasMemberRecord",
+
+  data() {
+    return {
+      countList: [
+        {
+          lebel: "订单金额(元)",
+          key: "",
+        },
+        {
+          lebel: "已付金额(元)",
+          key: "",
+        },
+        {
+          lebel: "抵扣金额(元)",
+          key: "",
+        },
+        {
+          lebel: "抵扣积分",
+          key: "",
+        },
+        {
+          lebel: "退款金额(元)",
+          key: "",
+        },
+        {
+          lebel: "商品金额(元)",
+          key: "",
+        },
+      ],
+      loading: false,
+      navText: {
+        index: 0,
+        num: true,
+        choice: false,
+        addHide: true,
+        openCheckMore: true,
+        custom: false,
+      },
+      formData: { datePicker: [] },
+      tableSet: [
+        {
+          label: "卡号",
+          prop: "tpName",
+        },
+        {
+          label: "会员姓名",
+          prop: "tpName",
+        },
+        {
+          label: "会员手机号",
+          prop: "tpName",
+        },
+        {
+          label: "总消费金额(元)",
+          prop: "tpName",
+        },
+        {
+          label: "剩余积分",
+          prop: "tpName",
+        },
+      ],
+      tableData: [],
+      total: 0,
+      formList: [
+        {
+          prop: "name",
+          placeholder: "请输产品名称",
+        },
+      ],
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    search(v) {
+      console.log(this.formData, 789);
+    },
+    init() {
+      this.search();
+    },
+  },
+  components: {},
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 172 - 0
src/views/staffMag/components/StaffSetDlg.vue

@@ -0,0 +1,172 @@
+<template>
+  <Base-dialog
+    :title="form.id ? '成员编辑' : '成员新增'"
+    :isShow.sync="isShow"
+    @close="close"
+    :isShowFooter="false"
+    width="450px"
+  >
+    <el-form
+      label-width="80px"
+      label-position="left"
+      :model="form"
+      hide-required-asterisk
+      :rules="rules"
+      ref="form"
+    >
+      <el-form-item label="身份:" prop="type">
+        <el-radio-group v-model="form.type">
+          <el-radio :label="1">店长</el-radio>
+          <el-radio :label="2">店员</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="真实姓名:" prop="userName">
+        <el-input v-model.Number="form.userName" placeholder="请输入提现金额">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="联系电话:" prop="phone">
+        <el-input v-model.Number="form.phone" placeholder="请输入提现金额">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="密码:" prop="password">
+        <el-input v-model.Number="form.password" placeholder="请输入密码">
+        </el-input>
+      </el-form-item>
+      <el-form-item label="角色名称" prop="roleIds">
+        <el-select
+          multiple
+          v-model="form.roleIds"
+          placeholder="请选择角色名称"
+          clearable
+          :style="{ width: '100%' }"
+        >
+          <el-option
+            v-for="(item, index) in roleList"
+            :key="index"
+            :label="item.roleName"
+            :value="item.roleId"
+            :disabled="item.disabled"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="启动状态:" prop="ststus">
+        <el-radio-group v-model="form.ststus">
+          <el-radio :label="1">启动</el-radio>
+          <el-radio :label="2">暂停</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <div class="btns clearfix">
+      <el-button @click="visible = false">取消</el-button>
+      <el-button type="primary" @click="submitForm">启用</el-button>
+      <el-button type="info">保存</el-button>
+    </div>
+  </Base-dialog>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      form: {},
+      rules: {
+        type: [{ required: true, message: "请选择身份", trigger: "change" }],
+        ststus: [
+          { required: true, message: "请选择启动状态", trigger: "change" },
+        ],
+        userName: [
+          { required: true, message: "请输入真实姓名", trigger: "blur" },
+        ],
+        phone: [
+          { required: true, message: "手机号必填", trigger: "blur" },
+          {
+            pattern: /^1[3456789]\d{9}$/,
+            message: "手机号码格式不正确",
+            trigger: "blur",
+          },
+        ],
+        roleIds: [
+          {
+            required: true,
+            message: "请选择角色名称",
+            trigger: "change",
+          },
+        ],
+      },
+    };
+  },
+  methods: {
+    resetForm() {
+      this.form = {
+        id: undefined,
+        type: undefined,
+        status: undefined,
+        phone: undefined,
+        userName: undefined,
+        password: undefined,
+        roleIds: [],
+      };
+      this.clearForm("form");
+    },
+    submitForm() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          withdrawal(this.form).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("提现申请成功");
+              this.isShow = false;
+              this.$emit("getSellerInfo");
+            }
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    close() {
+      //   this.isShow = false;
+      this.clearForm("form");
+    },
+  },
+  computed: {
+    isShow: {
+      get() {
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+    ...mapGetters(["roleList"]),
+  },
+  created() {},
+  components: {},
+  watch: {
+    dialogVisible: {
+      handler(val) {
+        if (val) {
+          this.resetForm();
+        }
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.btns {
+  .el-button {
+    margin-top: 20px;
+    float: right;
+    margin-left: 14px;
+  }
+}
+</style>

+ 178 - 0
src/views/staffMag/index.vue

@@ -0,0 +1,178 @@
+<template>
+  <container title="会员管理">
+    <template v-slot:btn>
+      <el-button type="primary" @click="dialogVisible = true"
+        >新增店员</el-button
+      >
+      <el-button @click="batchDel">批量删除</el-button>
+      <el-button>导出excel</el-button>
+    </template>
+    <search-box-new
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+    />
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      rowKey="id"
+      :loading="loading"
+    >
+      <template slot="status" slot-scope="props">
+        <el-switch
+          v-model="props.scope.row.status"
+          active-color="#13ce66"
+          inactive-color="#ff4949"
+          :active-value="1"
+          :inactive-value="0"
+          @change="statusChange($event, props.scope.row)"
+        >
+        </el-switch>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="handelClick(2, props.scope.row.tpId)"
+          >编辑</el-button
+        >
+        <el-button type="text" @click="resetPass(props.scope.row.tpId)"
+          >密码恢复</el-button
+        >
+        <el-button type="text" @click="handelDel(props.scope.row.tpId)"
+          >删除</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize.sync="formData.pageSize"
+      :currentPage.sync="formData.pageNum"
+      @search="search"
+    />
+    <Staff-set-dlg :dialogVisible.sync="dialogVisible"></Staff-set-dlg>
+  </container>
+</template>
+
+<script>
+import StaffSetDlg from "./components/StaffSetDlg";
+export default {
+  name: "SaasMemberRecord",
+
+  data() {
+    return {
+      loading: false,
+      navText: {
+        index: 0,
+        num: true,
+        choice: true,
+        addHide: true,
+        openCheckMore: true,
+        custom: false,
+      },
+      formData: {},
+      tableSet: [
+        {
+          label: "真实姓名",
+          prop: "tpName",
+        },
+        {
+          label: "权限",
+          prop: "tpName",
+        },
+        {
+          label: "手机号码",
+          prop: "tpName",
+        },
+        {
+          label: "启动状态",
+          prop: "tpName",
+          scope: "solt",
+          soltName: "status",
+        },
+        {
+          label: "剩余积分",
+          prop: "tpName",
+        },
+      ],
+      tableData: [{}],
+      total: 0,
+      formList: [
+        {
+          prop: "name",
+          placeholder: "请输产品名称",
+        },
+      ],
+      dialogVisible: false,
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    search(v) {
+      console.log(this.formData, 789);
+    },
+    init() {
+      this.search();
+    },
+    del(id) {
+      this.$confirm("确定删除吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {})
+        .catch(() => {});
+    },
+    resetPass(id) {
+      this.$confirm("确定恢复为初始密码吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {})
+        .catch(() => {});
+    },
+    batchDel() {
+      let len = this.$refs.tableList.allCheckData.length;
+      if (!len) {
+        return this.$message.warning("请先勾选店员");
+      }
+      this.$confirm(`此操作将永久删除所勾选的${len}条店员, 是否继续?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          const ids = this.$refs.tableList.allCheckData.map(
+            (item) => item.moduleExamId
+          );
+          moduleVolumeBatchDel({
+            status: -1,
+            ids,
+          }).then((res) => {
+            this.$message.success("批量删除成功");
+            this.$refs.tableList.clearMoreActive();
+            this.search(1);
+          });
+        })
+        .catch(() => {});
+    },
+    statusChange(e, row) {
+      //   this.$api
+      //     .editmallstore({ storeId: row.storeId, status: e })
+      //     .then((res) => {
+      //       this.$message.success("操作成功");
+      //       row.status = e;
+      //     })
+      //     .catch(() => {
+      //       return (row.status = e ? 0 : 1);
+      //     });
+    },
+  },
+  components: { StaffSetDlg },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 180 - 0
src/views/strikeBalanceMag/index.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="record-ward">
+    <div class="record-ward-top mb20">
+      <div v-for="(item, index) in countList" :key="index">
+        <p>67678</p>
+        <p>{{ item.lebel }}</p>
+      </div>
+    </div>
+    <container title="核销管理" height="252">
+      <template v-slot:btn>
+        <el-button>导出excel</el-button>
+      </template>
+      <search-box-new
+        :formData="formData"
+        :formList="formList"
+        @search="search"
+        @init="init"
+      />
+      <table-list
+        ref="tableList"
+        :tableSets="tableSet"
+        :tableData="tableData"
+        :navText="navText"
+        :loading="loading"
+      >
+        <template slot="btn" slot-scope="props">
+          <el-button type="text" @click="handelClick(2, props.scope.row.tpId)"
+            >复制</el-button
+          >
+          <el-button type="text" @click="handelClick(1, props.scope.row.tpId)"
+            >修改</el-button
+          >
+          <el-button type="text" @click="handelDel(props.scope.row.tpId)"
+            >删除</el-button
+          >
+        </template>
+      </table-list>
+      <pagination
+        :total="total"
+        :pageSize.sync="formData.pageSize"
+        :currentPage.sync="formData.pageNum"
+        @search="search"
+      />
+    </container>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "SaasMemberRecord",
+
+  data() {
+    return {
+      countList: [
+        {
+          lebel: "冲账已付金额(元)",
+          key: "",
+        },
+        {
+          lebel: "冲账抵扣金额(元)",
+          key: "",
+        },
+        {
+          lebel: "冲账抵扣积分",
+          key: "",
+        },
+      ],
+      loading: false,
+      navText: {
+        index: 0,
+        num: true,
+        choice: false,
+        addHide: true,
+        openCheckMore: true,
+        custom: false,
+      },
+      formData: { datePicker: [] },
+      tableSet: [
+        {
+          label: "冲账时间",
+          prop: "tpName",
+        },
+        {
+          label: "冲账人",
+          prop: "tpName",
+        },
+        {
+          label: "会员手机号",
+          prop: "tpName",
+        },
+        {
+          label: "会员名称",
+          prop: "tpName",
+        },
+        {
+          label: "订单号",
+          prop: "tpName",
+        },
+        {
+          label: "冲账已付金额(元)",
+          prop: "tpName",
+        },
+        {
+          label: "冲账抵扣积分",
+          prop: "tpName",
+        },
+        {
+          label: "积分规则",
+          prop: "tpName",
+        },
+        {
+          label: "退款方式",
+          prop: "tpName",
+        },
+      ],
+      tableData: [],
+      total: 0,
+      formList: [
+        {
+          prop1: "classStartTime",
+          prop2: "classEndTime",
+          scope: "datePicker",
+          type: "daterange",
+        },
+        {
+          lable: "姓名",
+          prop: "name",
+          placeholder: "请输产品名称",
+        },
+      ],
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    search(v) {
+      console.log(this.formData, 789);
+    },
+    init() {
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.record-ward {
+  .record-ward-top {
+    background: #ffffff;
+    border-radius: 12px;
+    height: 122px;
+    display: flex;
+    align-items: center;
+    div {
+      padding: 0 74px;
+      border-right: 1px solid #e8e8e8;
+      &:nth-last-of-type(1) {
+        border: 0;
+      }
+      p {
+        text-align: center;
+        &:nth-of-type(1) {
+          font-size: 25px;
+          color: #222222;
+          margin-bottom: 4px;
+        }
+        &:nth-of-type(2) {
+          font-size: 14px;
+          color: #57576d;
+        }
+      }
+    }
+  }
+}
+</style>

+ 191 - 0
src/views/writeOffMag/record.vue

@@ -0,0 +1,191 @@
+<template>
+  <div class="record-ward">
+    <div class="record-ward-top fl_b mb20">
+      <div v-for="(item, index) in countList" :key="index">
+        <p>67678</p>
+        <p>{{ item.lebel }}</p>
+      </div>
+    </div>
+    <container title="核销管理" height="252">
+      <template v-slot:btn>
+        <el-button>导出excel</el-button>
+      </template>
+      <search-box-new
+        :formData="formData"
+        :formList="formList"
+        @search="search"
+        @init="init"
+      />
+      <table-list
+        ref="tableList"
+        :tableSets="tableSet"
+        :tableData="tableData"
+        :navText="navText"
+        :loading="loading"
+      >
+        <template slot="btn" slot-scope="props">
+          <el-button type="text" @click="handelClick(2, props.scope.row.tpId)"
+            >复制</el-button
+          >
+          <el-button type="text" @click="handelClick(1, props.scope.row.tpId)"
+            >修改</el-button
+          >
+          <el-button type="text" @click="handelDel(props.scope.row.tpId)"
+            >删除</el-button
+          >
+        </template>
+      </table-list>
+      <pagination
+        :total="total"
+        :pageSize.sync="formData.pageSize"
+        :currentPage.sync="formData.pageNum"
+        @search="search"
+      />
+    </container>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "SaasMemberRecord",
+
+  data() {
+    return {
+      countList: [
+        {
+          lebel: "订单金额(元)",
+          key: "",
+        },
+        {
+          lebel: "已付金额(元)",
+          key: "",
+        },
+        {
+          lebel: "抵扣金额(元)",
+          key: "",
+        },
+        {
+          lebel: "抵扣积分",
+          key: "",
+        },
+        {
+          lebel: "退款金额(元)",
+          key: "",
+        },
+        {
+          lebel: "商品金额(元)",
+          key: "",
+        },
+      ],
+      loading: false,
+      navText: {
+        index: 0,
+        num: true,
+        choice: false,
+        addHide: true,
+        openCheckMore: true,
+        custom: false,
+      },
+      formData: { datePicker: [] },
+      tableSet: [
+        {
+          label: "模板名称1",
+          prop: "tpName",
+        },
+        {
+          label: "核销日期",
+          prop: "tpName",
+        },
+        {
+          label: "核销人",
+          prop: "tpName",
+        },
+        {
+          label: "会员手机号",
+          prop: "tpName",
+        },
+        {
+          label: "会员名称",
+          prop: "tpName",
+        },
+        {
+          label: "订单号",
+          prop: "tpName",
+        },
+        {
+          label: "已付金额(元)",
+          prop: "tpName",
+        },
+        {
+          label: "抵扣金额(元)",
+          prop: "tpName",
+        },
+        {
+          label: "抵扣积分",
+          prop: "tpName",
+        },
+        {
+          label: "退款金额(元)",
+          prop: "tpName",
+        },
+      ],
+      tableData: [],
+      total: 0,
+      formList: [
+        {
+          prop1: "classStartTime",
+          prop2: "classEndTime",
+          scope: "datePicker",
+          type: "daterange",
+        },
+        {
+          lable: "姓名",
+          prop: "name",
+          placeholder: "请输产品名称",
+        },
+      ],
+    };
+  },
+
+  mounted() {},
+
+  methods: {
+    search(v) {
+      console.log(this.formData, 789);
+    },
+    init() {
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+p {
+  padding: 0;
+  margin: 0;
+}
+.record-ward {
+  .record-ward-top {
+    background: #ffffff;
+    border-radius: 12px;
+    height: 122px;
+    div {
+      flex: 1;
+      border-right: 1px solid #e8e8e8;
+      p {
+        text-align: center;
+        &:nth-of-type(1) {
+          font-size: 25px;
+          color: #222222;
+          margin-bottom: 4px;
+        }
+        &:nth-of-type(2) {
+          font-size: 14px;
+          color: #57576d;
+        }
+      }
+    }
+  }
+}
+</style>

Неке датотеке нису приказане због велике количине промена