Browse Source

添加机构配置功能

lex-xin 3 năm trước cách đây
mục cha
commit
5e13de1773

+ 1 - 1
src/components/Tooltip/index.vue

@@ -9,7 +9,7 @@
   const padding = 15 // tag's padding
 
   export default {
-    name: 'scrollPane',
+    name: 'Tooltip',
     props: {
       content: {
         required: true,

+ 2 - 0
src/components/install.js

@@ -18,6 +18,7 @@ import autoHeight from '@/components/auto-height'
 import auth from '@/components/Auth'
 import filterSearch from '@/components/filter-search'
 import singeFileUpload from '@/components/singe-file-upload'
+import Tooltip from '@/components/Tooltip'
 export default {
   install(Vue) {
     Vue.component(saveform.name, saveform)
@@ -35,5 +36,6 @@ export default {
     Vue.component(auth.name, auth)
     Vue.component(filterSearch.name, filterSearch)
     Vue.component(singeFileUpload.name, singeFileUpload)
+    Vue.component(Tooltip.name, Tooltip)
   }
 }

+ 2 - 1
src/router/index.js

@@ -470,7 +470,8 @@ export const asyncRoutes = {
   // 产品管理
   productManager: () => import('@/views/platformManager/productManger'),
   // 服务管理
-  serviceManager: () => import('@/views/platformManager/serviceManager')
+  serviceManager: () => import('@/views/platformManager/serviceManager/index'),
+  serviceOperation: () => import('@/views/platformManager/serviceManager/form'),
 }
 
 export default router

+ 26 - 0
src/views/platformManager/productManger/api.js

@@ -0,0 +1,26 @@
+
+import request2 from '@/utils/request2'
+
+export const platformProductAdd = data => request2({
+  url: '/api-web/platformProduct/add',
+  method: 'post',
+  data,
+})
+
+export const platformProductUpdate = data => request2({
+  url: '/api-web/platformProduct/update',
+  method: 'post',
+  data,
+})
+
+export const platformProductDelete = data => request2({
+  url: '/api-web/platformProduct/delete/' + data.id,
+  method: 'get'
+})
+
+
+export const platformProductQueryPage = data => request2({
+  url: '/api-web/platformProduct/queryPage',
+  method: 'get',
+  data,
+})

+ 24 - 23
src/views/platformManager/productManger/index.vue

@@ -22,7 +22,7 @@
         <el-button native-type="reset" type="primary">重置</el-button>
       </el-form-item>
     </save-form>
-    <el-button size="small" style="margin-bottom: 20px;" type="primary" v-permission="'organizationCourseDurationSettings/insert'" @click="openProduct('create')" icon="el-icon-plus">添加</el-button>
+    <el-button size="small" style="margin-bottom: 20px;" type="primary" v-permission="'platformProduct/add'" @click="openProduct('create')" icon="el-icon-plus">添加</el-button>
     <!-- 列表 -->
     <div class="tableWrap">
       <el-table
@@ -30,33 +30,30 @@
         size="small"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
       >
-        <el-table-column align="center" prop="organ.name" label="编号">
+        <el-table-column align="center" label="产品编号" prop="id">
         </el-table-column>
         <el-table-column
           align="center"
-          prop="classGroupTypeName"
+          prop="name"
           label="产品名称"
-        >
+        ></el-table-column>
+        <el-table-column align="center" label="产品描述" prop="remark">
           <template slot-scope="scope">
-            <div>
-              {{ scope.row.courseType | coursesType }}
-            </div>
+            <tooltip :content="scope.row.remark" />
           </template>
         </el-table-column>
-        <el-table-column align="center" label="产品描述" prop="duration">
-        </el-table-column>
         <el-table-column align="center" label="操作">
           <template slot-scope="scope">
             <el-button
-              @click="resetCourseTime(scope.row)"
-              v-permission="'organizationCourseDurationSettings/update'"
+              @click="resetProduct(scope.row)"
+              v-permission="'platformProduct/update'"
               type="text"
               size="small"
               >修改</el-button
             >
             <el-button
-              @click="resetCourseTime(scope.row)"
-              v-permission="'organizationCourseDurationSettings/update'"
+              @click="delProduct(scope.row)"
+              v-permission="'platformProduct/delete'"
               type="text"
               size="small"
               >删除</el-button
@@ -75,7 +72,7 @@
       />
     </div>
     <el-dialog
-      :title="isAdd ? '新增网管课设置' : '修改网管课设置'"
+      :title="isAdd ? '新增产品' : '修改产品'"
       class="courseMask"
       width="500px"
       :visible.sync="courseVisible"
@@ -83,9 +80,8 @@
       <operationModel
         ref="operationModel"
         :activeRow="activeRow"
+        :pageType="pageType"
         v-if="courseVisible"
-        :organList="selects.branchs"
-        :courseType="courseType"
         @close="close"
       />
       <div slot="footer" class="dialog-footer">
@@ -97,8 +93,7 @@
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
-import { musicCourseType } from "@/utils/searchArray";
-import { getOrganizationCourseDurationSettings,delOrganizationCourseDurationSettings } from "@/api/specialSetting";
+import { platformProductQueryPage,platformProductDelete } from "./api";
 import operationModel from "./operationModel";
 const initSearch = {
   search: null
@@ -108,6 +103,7 @@ export default {
   data() {
     return {
       tableList: [],
+      pageType: 'create',
       pageInfo: {
         // 分页规则
         limit: 10, // 限制显示条数
@@ -116,7 +112,6 @@ export default {
         page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
       searchForm: { ...initSearch },
-      courseType: musicCourseType,
       isAdd: true,
       courseVisible: false,
       activeRow: null,
@@ -129,12 +124,13 @@ export default {
   methods: {
     async getList() {
       try {
-        const res = await getOrganizationCourseDurationSettings({
+        const res = await platformProductQueryPage({
           ...this.searchForm,
           page: this.pageInfo.page,
           rows: this.pageInfo.limit,
         });
         this.pageInfo.total = res.data.total;
+        //  res.data.rows
         this.tableList = res.data.rows;
       } catch (e) {}
     },
@@ -148,9 +144,10 @@ export default {
       this.searchForm = { ...initSearch };
       this.search();
     },
-    resetCourseTime(row) {
+    resetProduct(row) {
       this.isAdd = false;
       this.activeRow = row;
+      this.pageType = 'update'
       this.courseVisible = true;
     },
     submitInfo() {
@@ -164,16 +161,17 @@ export default {
     openProduct() {
       this.isAdd = true;
       this.activeRow = null;
+      this.pageType = 'create'
       this.courseVisible = true;
     },
-    async delCourseTime(row) {
+    async delProduct(row) {
       this.$confirm("是否删除?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",
       }).then( async() => {
         try{
-         const res =   await delOrganizationCourseDurationSettings({ id:row.id})
+         const res =   await platformProductDelete({ id:row.id})
          this.$message.success('删除成功')
          this.getList()
         }catch{}
@@ -183,4 +181,7 @@ export default {
 };
 </script>
 <style lang="scss" scoped>
+.courseMask .el-dialog__body {
+  padding-bottom: 0;
+}
 </style>

+ 65 - 42
src/views/platformManager/productManger/operationModel.vue

@@ -1,29 +1,26 @@
 <template>
   <div>
-    <el-form :model="auditionForm" ref="auditionForm" size="small">
+    <el-form :model="productForm" ref="productForm" size="small">
       <el-form-item
         label="分部"
-        prop="organId"
+        prop="name"
         :label-width="formLabelWidth"
         :rules="[{ required: true, message: '产品名称', trigger: 'blur' }]"
       >
-        <el-input clearable placeholder="请输入产品名称" v-model="courseType" />
+        <el-input clearable placeholder="请输入产品名称" v-model="productForm.name" />
       </el-form-item>
       <el-form-item
         label="产品描述"
-        prop="courseType"
+        prop="remark"
         :label-width="formLabelWidth"
-        :rules="[
-          { required: true, message: '请输入产品描述', trigger: 'blur' },
-        ]"
       >
-        <el-input clearable type="textarea" placeholder="请输入产品描述" v-model="courseType" />
+        <el-input clearable type="textarea" placeholder="请输入产品描述" v-model="productForm.remark" />
       </el-form-item>
       <el-alert
           title="产品权限"
           type="info"
           :closable="false"
-          class="vipMsg"
+          style="margin-bottom: 20px"
         ></el-alert>
       <el-form-item label="搜索">
         <el-input style="width:210px"
@@ -34,7 +31,7 @@
         <el-button type="primary"
                     @click="onReSetRole">重置</el-button>
       </el-form-item>
-      <el-form-item label="基本权限">
+      <el-form-item >
         <el-checkbox :indeterminate="isIndeterminate"
                       @change="onCheckAll"
                       v-model.trim="checkAll">全选</el-checkbox>
@@ -61,48 +58,75 @@
   </div>
 </template>
 <script>
-import { resetOrganizationCourseDurationSettings,addOrganizationCourseDurationSettings } from "@/api/specialSetting";
+import { platformProductUpdate,platformProductAdd } from "./api";
 import { getSilder } from '@/api/silder'
 export default {
-  props: ["activeRow", "organList", "courseType"],
+  props: ["activeRow", "pageType"],
   data() {
     return {
-      auditionForm: {
-        organId: "",
-        courseType: "",
-        timer: [],
-        id: "",
+      productForm: {
+        // menuId: "",
+        name: "",
+        remark: "",
+        id: null,
       },
-      inputVisible: false,
+      menuId: [], // 存修改时设置的编号
       formLabelWidth: "80px",
-      
+      isIndeterminate: false,
+      data: [],
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      },
+      result: {
+        roleName: null,
+        roleDesc: null,
+      },
+      checkAll: false,
+      splice: [],
+      silderList: [],
+      allChildIds: [], // 所有子编号
+      slideCount: 0,
+      seachRoleValue: '' //权限搜索字段
     };
   },
   mounted() {
+    const activeRow = this.activeRow
+    if(activeRow) {
+      this.productForm = {
+        name: activeRow.name,
+        remark: activeRow.remark,
+        id: activeRow.id,
+      }
+      this.menuId = activeRow.menuId ? activeRow.menuId.split(',').map(res => Number(res)) : []
+    }
     this.lookSilder()
   },
   methods: {
     async submitInfo(str) {
-      console.log(str);
-      this.$refs.auditionForm.validate(async (_) => {
+      let tempIds = this.$refs.tree.getCheckedKeys()
+      let halfIds = this.$refs.tree.getHalfCheckedKeys()
+      let allIds = [...tempIds, ...halfIds]
+      this.$refs.productForm.validate(async (_) => {
+        console.log(_, str)
         if (_) {
           if (str == "update") {
             try {
-              const res = await resetOrganizationCourseDurationSettings({
-                organId: this.auditionForm.organId,
-                duration: this.dynamicTags.join(","),
-                courseType: this.auditionForm.courseType,
-                id: this.auditionForm.id,
+              const res = await platformProductUpdate({
+                name: this.productForm.name,
+                remark: this.productForm.remark,
+                menuId: allIds.join(','),
+                id: this.productForm.id
               });
                 this.$message.success("修改成功");
                 this.$emit('close')
             } catch {}
           }else if(str == "create"){
-                   try {
-              const res = await addOrganizationCourseDurationSettings({
-                organId: this.auditionForm.organId,
-                duration: this.dynamicTags.join(","),
-                courseType: this.auditionForm.courseType,
+            try {
+              const res = await platformProductAdd({
+                name: this.productForm.name,
+                remark: this.productForm.remark,
+                menuId: allIds.join(',')
               });
                 this.$message.success("新建成功");
                 this.$emit('close')
@@ -123,17 +147,16 @@ export default {
       }
       // console.log(this.pageType)
       if (this.pageType == 'update') {
-        let roleInfo = await getRoleInfo({ id: this.id })
-        if (roleInfo.code == 200) {
-          let roleData = roleInfo.data
-          // 是否是全部选中
-          this.checkAll = roleData.menuIds.length >= this.slideCount
-          // 是否是半选
-          this.isIndeterminate = roleData.menuIds.length > 0 && roleData.menuIds.length < this.slideCount
-          let tSplice = this.getParent(roleData.menuIds, tempData)
-          roleData.menuIds = tSplice
-          this.result = roleData
-        }
+        let roleData = {}
+        // 是否是全部选中
+        this.checkAll = this.menuId.length >= this.slideCount
+        // 是否是半选
+        console.log(this.menuId)
+        this.isIndeterminate = this.menuId.length > 0 && this.menuId.length < this.slideCount
+        let tSplice = this.getParent(this.menuId, tempData)
+        roleData.menuIds = tSplice
+        this.result = roleData
+        console.log(this.result)
       } else {
         this.onReSet()
       }

+ 436 - 0
src/views/platformManager/serviceManager/form.vue

@@ -0,0 +1,436 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <el-page-header @back="onCancel"
+                      :content="(payType == 'create' ? '创建账号' : '修改账号')"></el-page-header>
+    </h2>
+    <div class="m-core"
+         style="overflow: hidden">
+      <el-col :span="10">
+        <el-form :model="form"
+                 :rules="rules"
+                 ref="accountForm"
+                 size="small"
+                 label-position="right"
+                 label-width="180px">
+          <el-form-item label="商户号"
+                        prop="memberId">
+            <el-input v-model="form.memberId"
+                      :disabled="payType == 'update' ? true : false"
+                      placeholder="请输入商户号"></el-input>
+          </el-form-item>
+          <el-form-item label="公司名称"
+                        prop="name">
+            <el-input v-model="form.name"
+                      placeholder="请输入公司名称"></el-input>
+          </el-form-item>
+          <el-form-item label="公司法人"
+                        prop="legalPerson">
+            <el-input v-model="form.legalPerson"
+                      placeholder="请输入公司法人"></el-input>
+          </el-form-item>
+          <el-form-item label="公司法人手机号"
+                        prop="legalMp">
+            <el-input v-model="form.legalMp"
+                      placeholder="请输入公司法人手机号"></el-input>
+          </el-form-item>
+          <el-form-item label="法人身份证号"
+                        prop="legalCertId">
+            <el-input v-model="form.legalCertId"
+                      placeholder="请输入法人身份证号"></el-input>
+          </el-form-item>
+          <el-form-item label="身份证有效期"
+                        prop="legalCertIdExpires">
+            <el-date-picker v-model="form.legalCertIdExpires"
+                            :picker-options="{ firstDayOfWeek:1 }"
+                            value-format="yyyyMMdd"
+                            type="date"
+                            placeholder="请选择身份证有效期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="银行卡号"
+                        prop="cardNo">
+            <el-input v-model="form.cardNo"
+                      placeholder="请输入银行卡号"></el-input>
+          </el-form-item>
+          <el-form-item label="所属银行"
+                        prop="bankCode">
+            <el-select v-model="form.bankCode"
+                       placeholder="请选择所属银行">
+              <el-option v-for="(item, index) in backList"
+                         :key="index"
+                         :label="item.title"
+                         :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="省市" required>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item prop="provCode" style="margin-bottom: 0;">
+                  <el-select v-model="form.provCode"
+                             style="width: 98% !important"
+                             @change="onProvChange"
+                             placeholder="请选择省份">
+                    <el-option v-for="(item, index) in cityList"
+                               :key="index"
+                               :label="item.title"
+                               :value="item.value"></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item prop="areaCode" style="margin-bottom: 0;">
+                  <el-select v-model="form.areaCode"
+                             style="width: 100% !important"
+                             placeholder="请选择城市">
+                    <el-option v-for="(item, index) in selectListCity"
+                               :key="index"
+                               :label="item.title"
+                               :value="item.value"></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form-item>
+          <el-form-item label="统一社会信用码"
+                        prop="socialCreditCode">
+            <el-input v-model="form.socialCreditCode"
+                      placeholder="请输入统一社会信用码"></el-input>
+          </el-form-item>
+          <el-form-item label="统一社会信用码有效期"
+                        prop="socialCreditCodeExpires">
+            <el-date-picker v-model="form.socialCreditCodeExpires"
+                            :picker-options="{ firstDayOfWeek:1 }"
+                            value-format="yyyyMMdd"
+                            type="date"
+                            placeholder="请选择统一社会信用码有效期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="经营范围"
+                        prop="businessScope">
+            <!-- <el-input v-model="form.businessScope" placeholder="请输入经营范围"></el-input> -->
+            <el-input type="textarea"
+                      :rows="3"
+                      v-model="form.businessScope"
+                      placeholder="请输入经营范围"></el-input>
+          </el-form-item>
+          <el-form-item label="公司地址"
+                        prop="address">
+            <el-input v-model="form.address"
+                      placeholder="请输入公司地址"></el-input>
+          </el-form-item>
+          <el-form-item label="证照文件"
+                        prop="multipartFile">
+            <!-- <el-input type="file" class="uploadFile" v-model="form.multipartFile"></el-input> -->
+            <el-upload class="avatar-upload"
+                       ref="upload"
+                       action="/api-web/uploadFile"
+                       :on-preview="handlePreview"
+                       :on-remove="handleRemove"
+                       :on-change="handleChange"
+                       :file-list="fileList"
+                       :multiple="false"
+                       :limit="1"
+                       :auto-upload="false">
+              <el-button slot="trigger"
+                         type="primary">选取文件</el-button>
+              <!-- ,且不超过500kb -->
+              <div slot="tip"
+                   style="display: inline; padding-left: 20px;"
+                   class="el-upload__tip">只能上传一个文件</div>
+            </el-upload>
+            <!-- <el-upload class="avatar-uploader"
+                            action="/api-web/uploadFile"
+                            :headers="headers"
+                            :show-file-list="false"
+                            :on-success="handleAvatarSuccess"
+                            :before-upload="beforeAvatarUpload">
+                            <img v-if="form.multipartFile"
+                                :src="form.coverImg"
+                                class="avatar" />
+                            <i v-else
+                            class="el-icon-plus avatar-uploader-icon"></i>
+                        </el-upload> -->
+          </el-form-item>
+          <el-form-item label="邮编"
+                        prop="zipCode">
+            <el-input v-model="form.zipCode"
+                      placeholder="请输入邮编"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" size="small"
+                       @click="onSubmit('accountForm')">确 定</el-button>
+            <el-button @click="onCancel" size="small">取 消</el-button>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </div>
+  </div>
+</template>
+
+<script>
+// import { cityJson } from "./cityJson";
+// import { bankJson } from "./bankJson";
+import { getToken } from "@/utils/auth";
+import load from '@/utils/loading'
+// import { createMember, updateMember } from './api.js'
+import { isvalidPhone } from '@/utils/validate'
+let validPhone = (rule, value, callback) => {
+  if (!value) {
+    callback(new Error('请输入公司法人手机号'))
+  } else if (!isvalidPhone(value)) {
+    callback(new Error('请输入正确的11位手机号码'))
+  } else {
+    callback()
+  }
+}
+export default {
+  name: 'ADaPayAccount',
+  data () {
+    const query = this.$route.query
+    return {
+      payType: query.type,
+      row: query.row ? JSON.parse(query.row) : {},
+      backList: bankJson,
+      cityList: cityJson,
+      selectListCity: [],
+      headers: {
+        Authorization: getToken()
+      },
+      fileList: [],
+      files: null, // 上传对象
+      id: null, // 编号
+      form: {
+        memberId: null,
+        name: null,
+        legalPerson: null,
+        legalMp: null,
+        legalCertId: null,
+        legalCertIdExpires: null,
+        cardNo: null,
+        bankCode: null,
+        provCode: null,
+        areaCode: null,
+        socialCreditCode: null,
+        socialCreditCodeExpires: null,
+        businessScope: null,
+        address: null,
+        multipartFile: null,
+        zipCode: null
+      },
+      rules: {
+        memberId: [{ required: true, message: '请输入商户号', trigger: 'blur' }],
+        name: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
+        legalPerson: [{ required: true, message: '请输入公司法人', trigger: 'blur' }],
+        legalMp: [{ type: 'number', required: true, validator: validPhone, trigger: 'blur' }],
+        legalCertId: [{ required: true, message: '请输入法人身份证号', trigger: 'blur' }],
+        legalCertIdExpires: [{ required: true, message: '请选择身份证有效期', trigger: 'change' }],
+        cardNo: [{ required: true, message: '请输入银行卡号', trigger: 'blur' }],
+        bankCode: [{ required: true, message: '请选择所属银行', trigger: 'change' }],
+        provCode: [{ required: true, message: '请选择省份', trigger: 'change' }],
+        areaCode: [{ required: true, message: '请选择城市', trigger: 'change' }],
+        socialCreditCode: [{ required: true, message: '请输入统一社会信用码', trigger: 'blur' }],
+        socialCreditCodeExpires: [{ required: true, message: '请选择统一社会信用码有效期', trigger: 'change' }],
+        businessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }],
+        address: [{ required: true, message: '请输入公司地址', trigger: 'blur' }],
+        multipartFile: [{ required: true, message: '请上传证照文件', trigger: 'change' }],
+        zipCode: [{ required: true, message: '请输入邮编', trigger: 'blur' }]
+      }
+    };
+  },
+  mounted () {
+    this.__init()
+  },
+  methods: {
+    __init () {
+      const query = this.$route.query
+      this.payType = query.type
+      this.row = query.row ? JSON.parse(query.row) : {}
+      this.files = null
+      this.fileList = []
+      this.form.multipartFile = null
+      if (this.payType == 'update') {
+        const row = this.row
+        this.id = row.id
+        this.form = {
+          memberId: row.memberId,
+          name: row.name,
+          legalPerson: row.legalPerson,
+          legalMp: row.legalMp,
+          legalCertId: row.legalCertId,
+          legalCertIdExpires: row.legalCertIdExpires,
+          cardNo: row.cardNo,
+          bankCode: row.bankCode,
+          provCode: row.provCode,
+          areaCode: row.areaCode,
+          socialCreditCode: row.socialCreditCode,
+          socialCreditCodeExpires: row.socialCreditCodeExpires,
+          businessScope: row.businessScope,
+          address: row.address,
+          multipartFile: row.multipartFile,
+          zipCode: row.zipCode
+        }
+        this.cityList.forEach(item => {
+          if (item.value == row.provCode) {
+            this.selectListCity = item.cities
+          }
+        })
+      } else if (this.payType == 'create') {
+        // this.form = {
+        //     memberId: null,
+        //     name: null,
+        //     legalPerson: null,
+        //     legalMp: null,
+        //     legalCertId: null,
+        //     legalCertIdExpires: null,
+        //     cardNo: null,
+        //     bankCode: null,
+        //     provCode: null,
+        //     areaCode: null,
+        //     socialCreditCode: null,
+        //     socialCreditCodeExpires: null,
+        //     businessScope: null,
+        //     address: null,
+        //     multipartFile: null,
+        //     zipCode: null
+        // }
+        this.$refs["accountForm"].resetFields()
+      }
+    },
+    async onSubmit (formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          const form = this.form
+          let formData = new FormData()
+          formData.append("memberId", form.memberId)
+          formData.append("name", form.name)
+          formData.append("legalPerson", form.legalPerson)
+          formData.append("legalMp", form.legalMp)
+          formData.append("legalCertId", form.legalCertId)
+          formData.append("legalCertIdExpires", form.legalCertIdExpires)
+          formData.append("cardNo", form.cardNo)
+          formData.append("bankCode", form.bankCode)
+          formData.append("provCode", form.provCode)
+          formData.append("areaCode", form.areaCode)
+          formData.append("socialCreditCode", form.socialCreditCode)
+          formData.append("socialCreditCodeExpires", form.socialCreditCodeExpires)
+          formData.append("businessScope", form.businessScope)
+          formData.append("address", form.address)
+          formData.append("multipartFile", form.multipartFile)
+          formData.append("zipCode", form.zipCode)
+          if (this.payType == 'create') {
+            createMember(formData).then(res => {
+              if (res.code == 200) {
+                this.$message.success('保存成功')
+                this.onCancel()
+              } else {
+                this.$message.error(res.msg)
+              }
+            })
+          } else if (this.payType == 'update') {
+            formData.append('id', this.id)
+            updateMember(formData).then(res => {
+              if (res.code == 200) {
+                this.$message.success('保存成功')
+                this.onCancel()
+              } else {
+                this.$message.error(res.msg)
+              }
+            })
+          }
+        } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
+          return false;
+        }
+      });
+    },
+    handleChange (file) {
+      this.files = file
+      this.form.multipartFile = file.raw
+      this.$refs["accountForm"].validateField('multipartFile')
+    },
+    handleRemove (file, fileList) {
+      this.files = null
+      this.form.multipartFile = null
+    },
+    handlePreview (file) {
+      //  (file);
+    },
+    onProvChange (value) {
+      this.form.areaCode = null
+      this.cityList.forEach(item => {
+        if (item.value == value) {
+          this.selectListCity = item.cities
+        }
+      })
+    },
+    onCancel () {
+      this.files = null
+      this.fileList = []
+      this.form.multipartFile = null
+      this.$store.dispatch('delVisitedViews', this.$route)
+      this.$router.push({
+        path: "/sysBasics/adapayManager"
+      });
+    }
+  },
+};
+</script>
+<style lang='scss' scoped>
+.el-input,
+.el-textarea,
+.el-select {
+  width: 100% !important;
+}
+.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.avatar-uploader {
+  .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+    &:hover {
+      border-color: #409eff;
+    }
+  }
+}
+.uploadFile {
+  /deep/.el-input__inner {
+    padding: 0;
+    height: 40px;
+    line-height: 32px;
+  }
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>

+ 177 - 0
src/views/platformManager/serviceManager/index.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      服务管理
+    </h2>
+    <save-form
+      :inline="true"
+      class="searchForm"
+      ref="searchForm"
+      @submit="search"
+      @reset="reset"
+      size="small"
+      :saveKey="'platformProductManager'"
+      :model.sync="searchForm"
+    >
+      <el-form-item :rules="[]">
+        <el-input v-model="searchForm.search" placeholder="服务名称"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="danger">搜索</el-button>
+        <el-button native-type="reset" type="primary">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <el-button size="small" style="margin-bottom: 20px;" type="primary" v-permission="'organizationCourseDurationSettings/insert'" @click="openService('create')" icon="el-icon-plus">新增服务</el-button>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        size="small"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column align="center" prop="organ.name" label="编号">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="classGroupTypeName"
+          label="服务编号"
+        >
+          <template slot-scope="scope">
+            <div>
+              {{ scope.row.courseType }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="服务名称" prop="duration">
+        </el-table-column>
+        <el-table-column align="center" label="产品服务" prop="duration">
+        </el-table-column>
+        <el-table-column align="center" label="操作">
+          <template slot-scope="scope">
+            <el-button
+              @click="resetCourseTime(scope.row)"
+              v-permission="'organizationCourseDurationSettings/update'"
+              type="text"
+              size="small"
+              >修改</el-button
+            >
+            <el-button
+              @click="resetCourseTime(scope.row)"
+              v-permission="'organizationCourseDurationSettings/update'"
+              type="text"
+              size="small"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+       :saveKey="'platformProductManager'"
+        sync
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { getOrganizationCourseDurationSettings,delOrganizationCourseDurationSettings } from "@/api/specialSetting";
+const initSearch = {
+  search: null
+};
+export default {
+  components: { pagination },
+  data() {
+    return {
+      tableList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      searchForm: { ...initSearch },
+      isAdd: true,
+      courseVisible: false,
+      activeRow: null,
+    };
+  },
+  mounted() {
+    this.$store.dispatch("setBranchs");
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      try {
+        const res = await getOrganizationCourseDurationSettings({
+          ...this.searchForm,
+          page: this.pageInfo.page,
+          rows: this.pageInfo.limit,
+        });
+        this.pageInfo.total = res.data.total;
+        //  res.data.rows
+        this.tableList = [];
+      } catch (e) {}
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.$refs.searchForm.save(this.searchForm);
+      this.$refs.searchForm.save(this.pageInfo, "page");
+      this.getList();
+    },
+    reset() {
+      this.searchForm = { ...initSearch };
+      this.search();
+    },
+    resetCourseTime(row) {
+      this.isAdd = false;
+      this.activeRow = row;
+      this.courseVisible = true;
+    },
+    submitInfo() {
+      const str = this.isAdd ? "create" : "update";
+      this.$refs.operationModel.submitInfo(str);
+    },
+    close() {
+      this.courseVisible = false;
+      this.getList();
+    },
+    openService(type, row) {
+      const tagTitle = type == 'update' ? '修改' : '创建'
+      this.$router.push({
+        path: '/serviceOperation',
+        query: {
+          type: type,
+          row: JSON.stringify(row)
+        }
+      }, (route) => {
+        route.meta.title = tagTitle + '服务'
+      })
+    },
+    async delCourseTime(row) {
+      this.$confirm("是否删除?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then( async() => {
+        try{
+         const res =   await delOrganizationCourseDurationSettings({ id:row.id})
+         this.$message.success('删除成功')
+         this.getList()
+        }catch{}
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.courseMask .el-dialog__body {
+  padding-bottom: 0;
+}
+</style>

+ 2 - 2
vue.config.js

@@ -16,10 +16,10 @@ const name = defaultSettings.title || '管乐迷后台管理系统' // page titl
 // http://47.99.212.176:8000
 // //  https://online.dayaedu.com
 // let target = 'https://online.dayaedu.com' //线上
-// let target = 'http://192.168.3.139:8000' // 箭河
+let target = 'http://192.168.3.227:8000' // 何国威
 // let target = 'http://192.168.3.124:8000' //邹璇
 // let target = 'http://192.168.3.112:8000' //勇哥
-let target = 'http://dev.dayaedu.com' // 开发环境
+// let target = 'http://dev.dayaedu.com' // 开发环境
 // let target = 'https://test.dayaedu.com' //测试环境
 // let target = 'http://192.168.3.134:8000' // 乔
 // All configuration item explanations can be find in https://cli.vuejs.org/config/