Bladeren bron

优化显示

lex-xin 3 jaren geleden
bovenliggende
commit
eeaaae7c60

+ 1 - 1
public/index.html

@@ -10,7 +10,7 @@
   <title><%= webpackConfig.name %></title>
 </head>
 
-<body>
+<body id="body">
   <noscript>
     <strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it
       to continue.</strong>

+ 7 - 1
src/api/specialSetting.js

@@ -32,9 +32,15 @@ export function branchUpdate (data) {
 
 // 根据父节点查询下一级子节点列表(不递归)
 export function areaQueryChild (data) {
-  return request({
+  // return request({
+  //   url: api + '/area/queryChild',
+  //   method: 'get',
+  //   params: data
+  // })
+  return request2({
     url: api + '/area/queryChild',
     method: 'get',
+    hideLoading: true,
     params: data
   })
 }

+ 6 - 0
src/constant/index.js

@@ -273,6 +273,12 @@ export const ProbationPeriodStatus = {
 export const clientType = {
   STUDENT: '学生端',
   TEACHER: '老师端',
+  EDUCATION: '教务端'
+}
+
+export const clientTypeFilter = {
+  STUDENT: '学生端',
+  TEACHER: '老师端',
   EDUCATION: '教务端',
   SYSTEM: '教务端'
 }

+ 1 - 1
src/styles/sidebar.scss

@@ -1,4 +1,4 @@
-#app, #app.adenGreen {
+#body, #body.adenGreen {
   .sidebar-container {
     background-color: $menuBg;
     // menu hover

+ 1 - 1
src/styles/theme/berlinBlue.scss

@@ -12,7 +12,7 @@ $bluesubMenuHover:#EDF6FF; // 侧边栏二级鼠标滑动样式
 $bluesubMenuActiveBg:#EDF6FF; // 侧边栏二级选中样式
 $bluemenuActiveAfter: #2B78CC;
 
-#app.berlinBlue {
+#body.berlinBlue {
   .sidebar-container {
     background-color: $bluemenuBg;
     .submenu-title-noDropdown,

+ 8 - 1
src/styles/theme/cloudAshes.scss

@@ -12,7 +12,7 @@ $ashessubMenuHover:#F3F4F7; // 侧边栏二级鼠标滑动样式
 $ashessubMenuActiveBg:#F3F4F7; // 侧边栏二级选中样式
 $ashesmenuActiveAfter: #444D5C;
 
-#app.cloudAshes {
+#body.cloudAshes {
   .sidebar-container {
     background-color: $ashesmenuBg;
     .submenu-title-noDropdown,
@@ -83,4 +83,11 @@ $ashesmenuActiveAfter: #444D5C;
       background-color: $ashesmenuActiveBg !important;
     }
   }
+
+  .el-loading-spinner {
+    .path, .el-loading-text {
+      color: #000;
+      stroke: #000;
+    }
+  }
 }

+ 1 - 1
src/styles/theme/volcanicRed.scss

@@ -12,7 +12,7 @@ $redsubMenuHover:#FBF3F3; // 侧边栏二级鼠标滑动样式
 $redsubMenuActiveBg:#FBF3F3; // 侧边栏二级选中样式
 $redmenuActiveAfter: #BC3030;
 
-#app.volcanicRed {
+#body.volcanicRed {
   .sidebar-container {
     background-color: $redmenuBg;
     .submenu-title-noDropdown,

+ 13 - 12
src/utils/setTheme.js

@@ -51,7 +51,7 @@ let chalk = ''
 
 // 设置主题色
 export const setTheme = async (params) => { // 是否显示加载样式
-  const { themeColor, theme, isLoading } = params
+  const { themeColor, theme, isLoading, saveTheme = true } = params
   if(themeColor) {
     const oldVal = ORIGINAL_THEME
     if (typeof themeColor !== 'string') return
@@ -103,20 +103,21 @@ export const setTheme = async (params) => { // 是否显示加载样式
   }
   // 修改主题
   if(theme) {
-    document.querySelector("#app").className = theme
+    document.querySelector("#body").className = theme
   }
 
-  // 修改存的主题色
-  let tenantConfig = sessionStorage.getItem('tenantConfig')
-  tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
-  if(themeColor) {
-    tenantConfig.themeColor = themeColor
-  }
-  if(theme) {
-    tenantConfig.theme = theme
+  if(saveTheme) {
+    // 修改存的主题色
+    let tenantConfig = sessionStorage.getItem('tenantConfig')
+    tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
+    if(themeColor) {
+      tenantConfig.themeColor = themeColor
+    }
+    if(theme) {
+      tenantConfig.theme = theme
+    }
+    sessionStorage.setItem('tenantConfig', JSON.stringify(tenantConfig))
   }
-  sessionStorage.setItem('tenantConfig', JSON.stringify(tenantConfig))
-
   if(isLoading) {
     tryHideFullScreenLoading()
   }

+ 1 - 1
src/utils/vueFilter.js

@@ -194,7 +194,7 @@ Vue.filter('userPaymentTypeFormat', val => constant.userPaymentType[val])
 Vue.filter('courseTypeFormat', val => constant.courseType[val])
 // 格式化签到签退记录 updateAttendanceEnum
 Vue.filter('updateAttendanceEnum', val => constant.updateAttendanceEnum[val])
-Vue.filter('clientTypeFilter',val=>constant.clientType[val])
+Vue.filter('clientTypeFilter',val=>constant.clientTypeFilter[val])
 // 机构状态
 Vue.filter('organState',val=>constant.organState[val])
 // 机构缴费状态

+ 7 - 0
src/views/organManager/api.js

@@ -40,3 +40,10 @@ export const areaQueryTree = (data) => request2({
   params: data
 })
 
+// 根据手机号获取学生信息
+export const checkStudentPhone = (data) => request2({
+  url: '/api-web/studentManage/queryUserByPhone',
+  method: 'get',
+  params: data,
+  hideLoading: true
+})

+ 6 - 19
src/views/organManager/components/memberSetting.vue

@@ -68,23 +68,7 @@
             <div slot="append">元/年/人</div>
           </el-input>
         </el-form-item>
-        <el-form-item label="可用教材" prop="teachingMaterialId"
-          :rules="[{ required: true, message: '请选择可用教材', trigger: 'change' }]">
-          <!-- <el-select
-            v-model.trim="form.teachingMaterialId"
-            :disabled="isDisabled"
-            v-show="!isDisabled"
-            multiple
-            filterable
-            collapse-tags
-            clearable
-            @change="onChange"
-            placeholder="请选择可用教材"
-            style="width: 238px !important"
-          >
-            <el-option v-for="(item, index) in teachList" :key="index"
-              :label="item.name" :value="item.id"></el-option>
-          </el-select> -->
+        <el-form-item label="可用教材" prop="teachingMaterialId">
           <el-cascader
             v-model.trim="form.teachingMaterialId"
             :disabled="isDisabled"
@@ -152,7 +136,6 @@ export default {
     if(this.data) {
       const { config, teachingMaterialId } = this.data
       const tmpConfig = config ? JSON.parse(config) : {}
-      console.log(teachingMaterialId)
       let tempIdArr = []
       if(teachingMaterialId) {
         const tempIds = teachingMaterialId.split(',').map(i => Number(i))
@@ -190,6 +173,7 @@ export default {
             childList.forEach(child => {
               child.label = child.name
               child.value = child.id
+              child.sysMusicScoreCategoriesList = []
               children.push(child)
             })
           }
@@ -254,7 +238,10 @@ export default {
 .el-tag + .el-tag {
   margin-left: 10px;
 }
-.el-input, .el-select {
+.el-input, .el-select, .el-cascader__dropdown {
   width: 300px !important;
 }
+.el-cascader-menu {
+  width: 100%;
+}
 </style>

+ 1 - 1
src/views/organManager/components/openService.vue

@@ -71,8 +71,8 @@
           :rules="[{ required: true, message: '请输入有效期', trigger: 'blur' }]">
           <el-input
             :disabled="isDisabled"
+            @input="(val)=>{form.expiryCount = val.replace(/[^\d]/g, '')}"
             type="number"
-            @input="e => (form.cloud_room_up_limit = isNumber(e))"
             v-model="form.expiryCount"
             placeholder="请输入有效期"
           >

+ 56 - 5
src/views/organManager/components/organInfo.vue

@@ -138,14 +138,28 @@
           ></el-input>
         </el-form-item>
         <el-form-item label="联系人手机号" prop="phone"
+          :error="errorPhone"
           :rules="[{ required: true, message: '请输入联系人手机号', trigger: 'blur' },
-            { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]">
+            { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' },
+            { validator: validatePhone, trigger: 'blur'}]">
+          <template #label>
+            联系人手机号
+            <el-tooltip placement="top"  popper-class="mTooltip">
+            <div slot="content">
+              该手机号为机构管理员登录账号
+            </div>
+            <i class="el-icon-question micon el-tooltip"
+              style="font-size: 18px; color: #F56C6C"
+              v-permission="'export/teacherSalary'"></i>
+          </el-tooltip>
+          </template>
           <el-input
             v-model.trim="form.phone"
             :max="11"
             :disabled="isDisabled"
             type="number"
             oninput="if(value.length > 11)value=value.slice(0, 11)"
+            @blur="checkPhone"
             style="width: 187px"
             placeholder="请输入联系人手机号"
           ></el-input>
@@ -175,11 +189,13 @@
 
 <script>
 import { getToken } from "@/utils/auth";
+import { checkStudentPhone } from "../api";
 import {
   areaQueryChild,
   getParentArea,
 } from "@/api/specialSetting";
 import ThemePicker from '@/components/ThemePicker'
+import { setTheme } from '@/utils/setTheme'
 export default {
   props: ['type', 'data', 'tenantInfo'],
   components: { ThemePicker },
@@ -225,6 +241,7 @@ export default {
         theme: 'adenGreen',
         themeColor: '#00A79D'
       },
+      errorPhone: null, // 手机号存在错误信息
       payState: null,
       imageWidthM: 72,
       imageHeightM: 72,
@@ -283,14 +300,41 @@ export default {
       item.selected = true
       this.form.theme = item.value
       this.form.themeColor = item.color
+
+      let baseTenantId = sessionStorage.getItem('baseTenantId')
+      if(baseTenantId > 0) {
+        setTheme({
+          themeColor: item.color,
+          theme: item.value,
+          saveTheme: false
+        })
+      }
     },
     onSubmit() {
       let state = false
       this.$refs.form.validate(_ => {
+        console.log(_)
         state = _
       })
       return state
     },
+    async checkPhone() {
+      const phone = this.form.phone
+      try {
+        const regu = /^1[3456789]\d{9}$/;
+        console.log(phone, regu)
+        const re = new RegExp(regu);
+        if (re.test(phone)) {
+          let res = await checkStudentPhone({ mobile: phone })
+          console.log(res)
+          if(res.data?.id) {
+            this.errorPhone = '输入手机号已存在'
+          } else {
+            this.errorPhone = null
+          }
+        }
+      } catch(e) {}
+    },
     onChangeProvince(val) {
       this.form.city = null;
       this.getAreaList(val);
@@ -374,6 +418,13 @@ export default {
       );
       return isImage && isLt2M && isSize;
     },
+    validatePhone (rule, value, callback) {
+      if (this.errorPhone) {
+        callback(new Error('输入手机号已存在'));
+      } else {
+        callback();
+      }
+    }
   },
 };
 </script>
@@ -404,8 +455,8 @@ export default {
   display: block;
 }
 .themeColor-block {
-  width: 20px;
-  height: 20px;
+  width: 30px;
+  height: 30px;
   border-radius: 2px;
   display: inline-block;
   cursor: pointer;
@@ -415,11 +466,11 @@ export default {
     display: flex;
     align-items: center;
     justify-content: center;
-    height: 21px;
+    height: 31px;
     color: white;
   }
 }
 .themeColor-block + .themeColor-block {
-  margin-left: 8px;
+  margin-left: 12px;
 }
 </style>

+ 2 - 2
src/views/organManager/components/roomRules.vue

@@ -13,7 +13,7 @@
           <el-input
             placeholder="请输入云教室人数上限"
             v-model="form.cloud_room_up_limit"
-            @input="e => (form.cloud_room_up_limit = isNumber(e, 7))"
+            @input="(val)=>{form.expiryCount = val.replace(/[^\d]/g, '')}"
             :disabled="isDisabled"
             @blur="onUpLimitChange"
             type="number"
@@ -40,7 +40,7 @@
                 v-model="scope.row.price"
                 type="number"
               >
-                <div slot="append">元</div>
+                <div slot="append">元/分钟</div>
               </el-input>
             </template>
           </el-table-column>

+ 3 - 0
src/views/organManager/index.vue

@@ -77,6 +77,9 @@
         <el-table-column align="center" label="服务" prop="serveName">
         </el-table-column>
         <el-table-column align="center" label="人数" prop="studentUpLimit">
+          <template slot-scope="scope">
+            {{ scope.row.studentCount }}/{{ scope.row.studentUpLimit }}
+          </template>
         </el-table-column>
         <el-table-column align="center" label="有效期到期时间" prop="expireDate">
         </el-table-column>

+ 1 - 3
src/views/organManager/organOperation.vue

@@ -127,12 +127,10 @@ export default {
         try {
           if(this.payType == 'create') {
             const res = await tenantInfoAdd(params)
-            console.log(res)
             this.$message.success('新增机构成功')
             this.onCancel()
           } else if(this.payType == 'update') {
             const res = await tenantInfoUpdate(params)
-            console.log(res)
             this.$message.success('修改机构成功')
             this.onCancel()
           }
@@ -181,7 +179,7 @@ export default {
     //             return true;
     //           }
     //         });
-  },
+  }
 };
 </script>
 <style lang='scss' scoped>

+ 1 - 0
src/views/resetTeaming/components/giveMemberList.vue

@@ -175,6 +175,7 @@ export default {
     },
     onReSet() {
       this.searchForm = { search: "", subjectId: "" };
+      this.search()
     },
     addMember(){
       if(this.selectStudentList.length <= 0) {

+ 27 - 6
src/views/resetTeaming/components/payInfoDetail.vue

@@ -659,10 +659,21 @@ export default {
     submitForm() {
       this.$refs.form.validate(async (isok,obj) => {
         if (isok) {
-          const preViewData = this.formatPreviewData()
-          this.preViewData = preViewData
-          await this.onPreview()
-          // let obj = this.fommatDate();
+          // 学校缴费没有预览
+          if(this.$route.query.payUserType == "SCHOOL") {
+            this.$confirm('是否创建缴费?', '提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            }).then(() => {
+              this.onSubmit()
+            }).catch(() => {
+            });
+          } else {
+            const preViewData = this.formatPreviewData()
+            this.preViewData = preViewData
+            await this.onPreview()
+          }
         }else {
 
           this.$nextTick(() => {
@@ -744,13 +755,23 @@ export default {
         })
       }
       // console.log(memberObj, 'memberObj', activeList)
-
+      let tempCourseList = form.eclass?.length > 0 ? form.eclass : []
+      let courseList = []
+      if(tempCourseList.length > 0) {
+        tempCourseList.forEach(course => {
+          if(course.courseType) {
+            course.isStudentOptional = true
+            courseList.push(course)
+          }
+        })
+      }
+      console.log(courseList)
       return {
         payUserType: this.$route.query.payUserType,
         musicGroup: this.musicGroup,
         paymentCalender: {
           activity: [...activeList], // 小班课
-          course: form.eclass?.length > 0 ? form.eclass : [], // 课程
+          course: courseList, // 课程
           member: memberObj, // 团练宝
           memberPrivilegesItemList: [], // 会员基本内容
           repair: form.leBaoList?.length > 0 ? { ...form.leBaoList[0], optionalFlag: false } : null, // 乐保

+ 5 - 13
src/views/resetTeaming/modals/subject-preview.vue

@@ -197,11 +197,10 @@ export default {
       });
     },
     __dataFormat(tempResult) {
-      // console.log(this.preViewData, 'sffwef')
-      // console.log(tempResult, 'tempResult')
       const preViewData = this.preViewData ? JSON.parse(JSON.stringify(this.preViewData)) : null
       this.courseViewType = tempResult.musicGroup.courseViewType || 0;
       this.organId = tempResult.musicGroup.organId;
+      const musicGroupStatus = tempResult.musicGroup.status
       this.cloudTeacherFee = tempResult.cloudTeacherFee || 0;
       this.cloudTeacherPlusFee = tempResult.cloudTeacherPlusFee || 0;
 
@@ -229,10 +228,8 @@ export default {
           ).format("YYYY/MM/DD");
       }
       const paymentCalender =  preViewData ? preViewData.paymentCalender : (tempResult.paymentCalender || null)
-      console.log(paymentCalender, 'paymentCalender')
       let tempInfo = paymentCalender && paymentCalender.course ? paymentCalender.course : [];
 
-
       let memberPrivilegesItemList = tempResult.memberPrivilegesItemList
         ? tempResult.memberPrivilegesItemList
         : [];
@@ -249,21 +246,17 @@ export default {
       });
       // 团练宝
       const member = paymentCalender && paymentCalender.member ? paymentCalender.member : {}
-      member.isStatus = member.optionalFlag ? true : false
+      member.isStatus = true
       this.toolsPackage = member.actualAmount ? [member] : []
       // 乐器保养
       const repair = paymentCalender && paymentCalender.repair ? paymentCalender.repair : {}
       repair.name = '乐器保养'
-      repair.isStatus = repair.optionalFlag ? true : false // 默认不选择乐器保养
+      repair.isStatus = true // 默认不选择乐器保养
       this.instrumentRepair = repair.actualAmount ? [repair] : []
       // 小班课
       const activity = paymentCalender && paymentCalender.activity ? paymentCalender.activity : []
       activity.map(i => {
-        if(i.optionalFlag) {
-          i.isStatus = true
-        } else {
-          i.isStatus = false
-        }
+        i.isStatus = true
       })
       this.activityList = [...activity]
 
@@ -284,8 +277,7 @@ export default {
       this.musicGroupSubject = tempResult.musicGroupSubjectPlan || [];
       let instrumentInfo = {};
       let tempInstrument = [];
-      console.log(this.preViewData, 'preViewData')
-      let musicGroupSubjectGoodsGroupList = this.preViewData?.payUserType == "SCHOOL" ? [] : tempResult.musicGroupSubjectGoodsGroupList
+      let musicGroupSubjectGoodsGroupList = this.preViewData?.payUserType == "SCHOOL" || musicGroupStatus == 'PROGRESS' ? [] : tempResult.musicGroupSubjectGoodsGroupList
       musicGroupSubjectGoodsGroupList?.forEach((item) => {
         if (item.type == "INSTRUMENT") {
           // 获取乐器所有提供方式

+ 2 - 17
src/views/studentManager/studentGroupPractice.vue

@@ -14,22 +14,6 @@
         ></el-input>
       </el-form-item>
       <el-form-item>
-        <el-select
-          v-model.trim="searchForm.subjectId"
-          style="width: 180px"
-          clearable
-          filterable
-          placeholder="请选择声部"
-        >
-          <el-option
-            v-for="(item, index) in soundList"
-            :key="index"
-            :label="item.name"
-            :value="item.id"
-          ></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
         <el-button @click="search" type="danger">搜索</el-button>
         <el-button @click="onReSet" type="primary">重置</el-button>
       </el-form-item>
@@ -37,7 +21,7 @@
     <!-- <div class="newBand"
          @click="resetPays"
          v-permission="'musicGroupStudentFee/batchUpdateCourseFee'">修改缴费金额</div> -->
-    <el-button @click="addMember" v-if="$helpers.permission('cloudTeacherOrder/pay')" type="primary" style="margin-bottom: 20px">激活会员</el-button>
+    <el-button @click="addMember" v-if="$helpers.permission('cloudTeacherOrder/pay/student')" type="primary" style="margin-bottom: 20px">激活会员</el-button>
 
     <div class="tableWrap">
       <el-table
@@ -168,6 +152,7 @@ export default {
     },
     onReSet() {
       this.searchForm = { search: "", subjectId: "" };
+      this.search()
     },
     addMember(){
       if(this.selectStudentList.length <= 0) {

+ 22 - 5
src/views/tenantSetting/tenantInfo.vue

@@ -17,7 +17,7 @@
   </div>
 </template>
 <script>
-import { tenantInfoInfo, tenantInfoUpdate } from "../organManager/api";
+import { tenantInfoAdd, tenantInfoInfo, tenantInfoUpdate } from "../organManager/api";
 import organInfo from '../organManager/components/organInfo'
 import { setTheme } from '@/utils/setTheme'
 export default {
@@ -38,10 +38,7 @@ export default {
   methods: {
     async __init() {
       try {
-        let tenantConfig = sessionStorage.getItem('tenantConfig')
-        tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
-        console.log(tenantConfig, tenantConfig.tenantId)
-        const res = await tenantInfoInfo({ id: tenantConfig.tenantId })
+        const res = await tenantInfoInfo({ id: this.$helpers.tenantId })
         this.status = true
         const { config, productInfo, ...other } = res.data
         const { theme, themeColor, id, ...con } = config
@@ -72,10 +69,30 @@ export default {
               theme,
               themeColor
             })
+            // 重新设置样式
+            let tenantConfig = sessionStorage.getItem('tenantConfig')
+            tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
+            sessionStorage.setItem('tenantConfig', JSON.stringify({
+              ...tenantConfig,
+              theme,
+               themeColor
+            }))
           }
         } catch(e) {}
     }
   },
+  async beforeDestroy() {
+    let tenantConfig = sessionStorage.getItem('tenantConfig')
+    tenantConfig = tenantConfig ? JSON.parse(tenantConfig) : {}
+    const organData = await this.$refs.organInfo.getValues()
+    const { theme, themeColor } = organData
+    if(theme != tenantConfig.theme) {
+      setTheme({
+        theme: tenantConfig.theme,
+        themeColor: tenantConfig.themeColor
+      })
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 6 - 6
src/views/tenantSetting/tenantTradeManager.vue

@@ -62,10 +62,10 @@
         <el-date-picker
           v-model.trim="searchForm.createTimer"
           type="daterange"
-          value-format="yyyy-MM-dd"
           range-separator="至"
-          start-placeholder="入驻开始时间"
-          end-placeholder="入驻结束时间"
+          start-placeholder="订单开始时间"
+          :default-time="['00:00:00', '23:59:59']"
+          end-placeholder="订单结束时间"
           :picker-options="{ firstDayOfWeek: 1 }"
         ></el-date-picker>
       </el-form-item>
@@ -86,8 +86,8 @@
         </el-table-column>
         <el-table-column align="center" label="订单时间" prop="createdTime">
         </el-table-column>
-        <el-table-column align="center" label="机构编号" prop="tenantId">
-        </el-table-column>
+        <!-- <el-table-column align="center" label="机构编号" prop="tenantId">
+        </el-table-column> -->
         <el-table-column align="center" label="机构名称" prop="tenantName">
         </el-table-column>
         <el-table-column align="center" label="交易类型">
@@ -181,7 +181,7 @@ export default {
         let { createTimer, ...reset } = this.searchForm;
         const res = await tenantOrderRecordQueryPage({
           ...reset,
-          ...getTimes(createTimer, ["startDate", "endDate"], "YYYY-MM-DD"),
+          ...getTimes(createTimer, ["startDate", "endDate"], "YYYY-MM-DD HH:mm:ss"),
           page: this.pageInfo.page,
           rows: this.pageInfo.limit,
         });