6 Commits ca83ebe5a5 ... 0b8e2c2e1c

Autore SHA1 Messaggio Data
  abpcoder 0b8e2c2e1c voluntary list - use universityNameText 2 mesi fa
  abpcoder 2376dba51c sync with voluntary - #1 major lib #2 voluntary major code 2 mesi fa
  abpcoder 509d367723 support hidden voluntary 2 mesi fa
  abpcoder e203920eaa default value of voluntaryData update 2 mesi fa
  abpcoder c27f23511a score lock update 3 mesi fa
  abpcoder 8e72287def score lock update 3 mesi fa

+ 2 - 0
src/App.vue

@@ -7,9 +7,11 @@
 <script>
 <script>
 import { uaRedirect } from '@/utils/uaredirect'
 import { uaRedirect } from '@/utils/uaredirect'
 import CssVar from '@/assets/styles/variables.scss'
 import CssVar from '@/assets/styles/variables.scss'
+import LoginCheckProvider from "@/views/index/blocks/LoginCheckProvider";
 
 
 export default {
 export default {
   name: 'App',
   name: 'App',
+  mixins: [LoginCheckProvider],
   data() {
   data() {
     return {
     return {
       theme: {
       theme: {

+ 29 - 0
src/assets/styles/common.scss

@@ -881,3 +881,32 @@
   background-size: cover;
   background-size: cover;
   background-position: center center;
   background-position: center center;
 }
 }
+
+
+/* global disabled style */
+.el-input.is-disabled .el-input__inner {
+  color: #666666 !important;
+}
+
+.el-radio__input.is-disabled + span.el-radio__label {
+  color: #666666 !important;
+}
+
+.el-checkbox__input.is-disabled + span.el-checkbox__label {
+  color: #666666 !important;
+}
+
+.el-radio__input.is-disabled.is-checked .el-radio__inner {
+  //border-color: #666666;
+}
+
+.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner {
+  //border-color: #666666;
+}
+
+.el-radio__input.is-disabled.is-checked .el-radio__inner::after {
+  background-color: #999999 !important;
+}
+.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after {
+  border-color: #999999 !important;
+}

+ 28 - 2
src/common/MxConfig.js

@@ -202,8 +202,8 @@ export default {
     }
     }
   },
   },
   studentReleaseQueryCodes: [
   studentReleaseQueryCodes: [
-    { id: 'acceptCount', name: '已录取', isEnroll: true },
-    { id: 'unfinishedCount', name: '未录取', isEnroll: false }
+    {id: 'acceptCount', name: '已录取', isEnroll: true},
+    {id: 'unfinishedCount', name: '未录取', isEnroll: false}
   ],
   ],
   majorDetailOptions: {
   majorDetailOptions: {
     ben: [
     ben: [
@@ -232,6 +232,32 @@ export default {
         prop: 'famousScholar',
         prop: 'famousScholar',
         title: '社会名人'
         title: '社会名人'
       }],
       }],
+    gao_ben: [
+      {
+        prop: 'introduction',
+        title: '专业介绍'
+      }, {
+        prop: 'eduObjective',
+        title: '培养目标'
+      }, {
+        prop: 'eduRequirement',
+        title: '培养要求'
+      }, {
+        prop: 'subjectRequirement',
+        title: '学科要求'
+      }, {
+        prop: 'loreAndAbility',
+        title: '知识能力'
+      }, {
+        prop: 'studyDirection',
+        title: '考研方向'
+      }, {
+        prop: 'mainCourse',
+        title: '主要课程'
+      }, {
+        prop: 'famousScholar',
+        title: '社会名人'
+      }],
     zhuan: [
     zhuan: [
       {
       {
         prop: 'eduObjective',
         prop: 'eduObjective',

+ 8 - 3
src/components/Cache/modules/mx-major-tree-translate-mixin.js

@@ -6,24 +6,29 @@ export default {
     return {
     return {
       masterMajorList: [],
       masterMajorList: [],
       specialtyMajorList: [],
       specialtyMajorList: [],
+      gaozhiMajorList: [],
       masterTreeReady: false,
       masterTreeReady: false,
-      specialtyTreeReady: false
+      specialtyTreeReady: false,
+      gaozhiTreeReady: false
     }
     }
   },
   },
   beforeMount() {
   beforeMount() {
     this.loadMasterMajorTree()
     this.loadMasterMajorTree()
     this.loadSpecialtyMajorTree()
     this.loadSpecialtyMajorTree()
+    this.loadGaozhiMajorTree()
   },
   },
   methods: {
   methods: {
     async loadMasterMajorTree() {
     async loadMasterMajorTree() {
       this.masterMajorList = await this.getMasterMajorTree()
       this.masterMajorList = await this.getMasterMajorTree()
       this.masterTreeReady = true
       this.masterTreeReady = true
-      console.log('master-major-ready')
     },
     },
     async loadSpecialtyMajorTree() {
     async loadSpecialtyMajorTree() {
       this.specialtyMajorList = await this.getSpecialtyMajorTree()
       this.specialtyMajorList = await this.getSpecialtyMajorTree()
       this.specialtyTreeReady = true
       this.specialtyTreeReady = true
-      console.log('specialty-major-ready')
     },
     },
+    async loadGaozhiMajorTree() {
+      this.gaozhiMajorList = await this.getGaozhiMajorTree()
+      this.gaozhiTreeReady = true
+    }
   }
   }
 }
 }

+ 9 - 0
src/components/Cache/mx-cache-mixin.js

@@ -132,6 +132,15 @@ export default {
         res => res.data,
         res => res.data,
         useCache)
         useCache)
     },
     },
+    // 职教本科专业树
+    getGaozhiMajorTree(useCache = true) {
+      return this._getDataByCache('gaozhi_major_tree',
+        _ => allMajor({
+          type: '高职本科'
+        }),
+        res => res.data,
+        useCache)
+    },
     // 职业树
     // 职业树
     getAllVocationTree(useCache = true,type) {
     getAllVocationTree(useCache = true,type) {
       return this._getDataByCache('vocation_tree',
       return this._getDataByCache('vocation_tree',

+ 2 - 1
src/components/Top/index.vue

@@ -73,7 +73,8 @@ export default {
       // return false // 22.11.21 暂不开放
       // return false // 22.11.21 暂不开放
       return !this.isLogin
       return !this.isLogin
     },
     },
-    handleMenuClick(item) {
+    async handleMenuClick(item) {
+      await this.loginCheck()
       this.AccessDeepMenu(item)
       this.AccessDeepMenu(item)
     },
     },
     handleRoleExchange(roleId) {
     handleRoleExchange(roleId) {

+ 5 - 2
src/components/TopNav/index.vue

@@ -36,8 +36,10 @@
 
 
 <script>
 <script>
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
+import LoginCheckInterceptor from "@/views/index/blocks/LoginCheckInterceptor";
 
 
 export default {
 export default {
+  mixins: [LoginCheckInterceptor],
   data() {
   data() {
     return {
     return {
       // 顶部栏初始数
       // 顶部栏初始数
@@ -63,8 +65,9 @@ export default {
     window.removeEventListener('resize', this.setVisibleNumber)
     window.removeEventListener('resize', this.setVisibleNumber)
   },
   },
   methods: {
   methods: {
-    handleClick(data) {
-      this.$store.dispatch('AccessDeepMenu', data)
+    async handleClick(data) {
+      await this.loginCheck()
+      await this.$store.dispatch('AccessDeepMenu', data)
     },
     },
     // 根据宽度计算设置显示栏数
     // 根据宽度计算设置显示栏数
     setVisibleNumber() {
     setVisibleNumber() {

+ 2 - 2
src/store/modules/UserInterceptors.js

@@ -6,12 +6,12 @@ import MxConfig from '@/common/MxConfig'
 const checkMobileBind = async function(state, getters, ignore) {
 const checkMobileBind = async function(state, getters, ignore) {
   // 暂无需求乎略手机号绑定校验
   // 暂无需求乎略手机号绑定校验
   // 卡号登陆需要绑定手机
   // 卡号登陆需要绑定手机
-  const isBinding = window.location.href.endsWith('/bind')
+  const isBinding = window.location.href.endsWith('/login')
   if (!isBinding && !getters.isBind && !getters.isMobileBind) {
   if (!isBinding && !getters.isBind && !getters.isMobileBind) {
     setTimeout(async() => {
     setTimeout(async() => {
       const msg = '您的账号还没有绑定手机,请先完善基础信息'
       const msg = '您的账号还没有绑定手机,请先完善基础信息'
       await MessageBox.alert(msg, { type: 'warning', showClose: false })
       await MessageBox.alert(msg, { type: 'warning', showClose: false })
-      router.push('/bind')
+      router.push('/login')
     }, 200)
     }, 200)
     return false
     return false
   }
   }

+ 16 - 14
src/views/career/LibraryMajor/MajorDetail.vue

@@ -5,6 +5,7 @@
         <el-tabs type="border-card" :value="type" stretch @tab-click="tabClick">
         <el-tabs type="border-card" :value="type" stretch @tab-click="tabClick">
           <el-tab-pane label="本科" name="本科" />
           <el-tab-pane label="本科" name="本科" />
           <el-tab-pane label="专科" name="专科" />
           <el-tab-pane label="专科" name="专科" />
+          <el-tab-pane label="高职本科" name="高职本科" />
           <el-tree
           <el-tree
             ref="tree"
             ref="tree"
             :data="majorList"
             :data="majorList"
@@ -37,14 +38,9 @@
             </div>
             </div>
           </div>
           </div>
           <div class="tabs-wrap mt30">
           <div class="tabs-wrap mt30">
-            <span class="tabs-item" :class="{'bg-primary':tabActive == 0}" @click="tabActive = 0">专业概况</span>
-            <span class="tabs-item" :class="{'bg-primary':tabActive == 1}" @click="tabActive = 1">就业前景</span>
-            <span
-              v-if="true||majorDetail.eduLevel == 'ben'"
-              class="tabs-item"
-              :class="{'bg-primary':tabActive == 2}"
-              @click="tabActive = 2"
-            >开设院校</span>
+            <span class="tabs-item" :class="{'bg-primary':tabActive==0}" @click="tabActive=0">专业概况</span>
+            <span v-if="type!='高职本科'" class="tabs-item" :class="{'bg-primary':tabActive==1}" @click="tabActive=1">就业前景</span>
+            <span v-if="type!='高职本科'" class="tabs-item" :class="{'bg-primary':tabActive==2}" @click="tabActive=2">开设院校</span>
           </div>
           </div>
           <div class="line" />
           <div class="line" />
           <div
           <div
@@ -78,6 +74,7 @@ import { addConcernMajor, removeConcernedMajor } from '@/api/webApi/career-other
 import MajorIntroduceInfo from '@/views/career/plan/components/major-introduce-info'
 import MajorIntroduceInfo from '@/views/career/plan/components/major-introduce-info'
 import MajorIntroduceJob from '@/views/career/plan/components/major-introduce-job'
 import MajorIntroduceJob from '@/views/career/plan/components/major-introduce-job'
 import IndexCard from '@/views/login/components/modules/shared/IndexCard'
 import IndexCard from '@/views/login/components/modules/shared/IndexCard'
+import MxTransferMixin from '@/components/mx-transfer-mixin'
 
 
 export default {
 export default {
   name: 'MajorDetail',
   name: 'MajorDetail',
@@ -87,7 +84,7 @@ export default {
     MajorIntroduceInfo,
     MajorIntroduceInfo,
     OpenCollege
     OpenCollege
   },
   },
-  mixins: [MxMajorTreeTranslateMixin],
+  mixins: [MxMajorTreeTranslateMixin, MxTransferMixin],
   data() {
   data() {
     return {
     return {
       desc: '',
       desc: '',
@@ -98,10 +95,10 @@ export default {
         children: 'children',
         children: 'children',
         label: 'name'
         label: 'name'
       },
       },
-      type: '本科',
       majorDetail: {
       majorDetail: {
         name: '',
         name: '',
-        code: ''
+        code: '',
+        eduLevel: ''
       }, // 概况
       }, // 概况
       prospects: {
       prospects: {
         vocationalDistribution: [],
         vocationalDistribution: [],
@@ -113,9 +110,15 @@ export default {
     }
     }
   },
   },
   computed: {
   computed: {
+    type() {
+      const { eduLevel } = this.majorDetail
+      const types = { 'ben': '本科', 'zhuan': '专科', 'gao_ben': '高职本科' }
+      return types[eduLevel] || types.ben
+    },
     majorList() {
     majorList() {
       if (this.type == '本科') return this.masterMajorList
       if (this.type == '本科') return this.masterMajorList
       if (this.type == '专科') return this.specialtyMajorList
       if (this.type == '专科') return this.specialtyMajorList
+      if (this.type == '高职本科') return this.gaozhiMajorList
       return []
       return []
     }
     }
   },
   },
@@ -129,9 +132,8 @@ export default {
     }
     }
   },
   },
   created() {
   created() {
-    this.code = this.$route.query.code
-    this.type = this.$route.query.type || '本科'
-    if (this.$route.query.code) {
+    this.code = this.$route.query.code || this.prevData.code
+    if (this.code) {
       this.getOverView()
       this.getOverView()
     }
     }
   },
   },

+ 30 - 29
src/views/career/LibraryMajor/MajorIndex.vue

@@ -1,41 +1,41 @@
 <template>
 <template>
-  <div ref="vocation" class="bg-page fx-column fx-cen-cen majorlib app-container">
-    <career-title-card name="专业库" english="MAJOR LIBRARY"/>
-    <index-card>
-      <div slot="title" class="fx-1">
-        <span class="tabs-item" :class="{'bg-primary':type == '本科'}" @click="type = '本科'">本科</span>
-        <span class="tabs-item" :class="{'bg-primary':type == '专科'}" @click="type = '专科'">专科</span>
-        <div class="line"/>
-        <div class="tags-wrap">
-          <a v-for="item in levelOne" :key="item.code" class="tag" @click="returnTop(item.code)">{{ item.name }}</a>
+    <div ref="vocation" class="bg-page fx-column fx-cen-cen majorlib">
+      <career-title-card name="专业库" english="MAJOR LIBRARY" />
+      <index-card>
+        <div slot="title" class="fx-1">
+          <span class="tabs-item" :class="{'bg-primary':type == '本科'}" @click="type = '本科'">本科</span>
+          <span class="tabs-item" :class="{'bg-primary':type == '专科'}" @click="type = '专科'">专科</span>
+          <span class="tabs-item" :class="{'bg-primary':type == '高职本科'}" @click="type = '高职本科'">高职本科</span>
+          <div class="line" />
+          <div class="tags-wrap">
+            <a v-for="item in levelOne" :key="item.code" class="tag" @click="returnTop(item.code)">{{ item.name }}</a>
+          </div>
         </div>
         </div>
-      </div>
-      <div class="list-wrap">
-        <!--  一级 -->
-        <div v-for="item in majorList" :id="`#${item.code}`" :key="item.code" class="levelOne">
-          <!--   一级专业title-->
-          <p class="voca-title mt10 mb10"><span class="primaryColor bold">{{
+        <div class="list-wrap">
+          <!--  一级 -->
+          <div v-for="item in majorList" :id="`#${item.code}`" :key="item.code" class="levelOne">
+            <!--   一级专业title-->
+            <p class="voca-title mt10 mb10"><span class="primaryColor bold">{{
               `${item.name} (${item.code}) `
               `${item.name} (${item.code}) `
-            }} </span><span class="f14 f-666">{{ `${item.childCount}个专业类,${item.grandchildCount}个专业` }}</span>
-          </p>
-          <div v-for="subLevel in item.children" :key="subLevel.code" class="last-level">
-            <!--  二级专业 -->
-            <p class="sub-title">{{ `${subLevel.name} (${subLevel.code}) ` }}</p>
-            <!--  三级专业 -->
-            <div v-if="subLevel.children.length > 0" class="last-children-wrap">
+            }} </span><span class="f14 f-666">{{ `${item.childCount}个专业类,${item.grandchildCount}个专业` }}</span></p>
+            <div v-for="subLevel in item.children" :key="subLevel.code" class="last-level">
+              <!--  二级专业 -->
+              <p class="sub-title">{{ `${subLevel.name} (${subLevel.code}) ` }}</p>
+              <!--  三级专业 -->
+              <div v-if="subLevel.children.length > 0" class="last-children-wrap">
                 <span
                 <span
                   v-for="vocation in subLevel.children"
                   v-for="vocation in subLevel.children"
                   :key="vocation.code"
                   :key="vocation.code"
                   class="last-children"
                   class="last-children"
                   @click="goDetail(vocation.code)"
                   @click="goDetail(vocation.code)"
                 >{{ vocation.name }}</span>
                 >{{ vocation.name }}</span>
+              </div>
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>
-      </div>
-      <scroll-top/>
-    </index-card>
-  </div>
+        <scroll-top />
+      </index-card>
+    </div>
 </template>
 </template>
 
 
 <script>
 <script>
@@ -46,7 +46,7 @@ import ScrollTop from '@/components/ScrollTop/index'
 
 
 export default {
 export default {
   name: 'MajorIndex',
   name: 'MajorIndex',
-  components: {ScrollTop, IndexCard, CareerTitleCard},
+  components: { ScrollTop, IndexCard, CareerTitleCard },
   mixins: [MxMajorTreeTranslateMixin],
   mixins: [MxMajorTreeTranslateMixin],
   data() {
   data() {
     return {
     return {
@@ -65,15 +65,16 @@ export default {
     majorList() {
     majorList() {
       if (this.type == '本科') return this.masterMajorList
       if (this.type == '本科') return this.masterMajorList
       if (this.type == '专科') return this.specialtyMajorList
       if (this.type == '专科') return this.specialtyMajorList
+      if (this.type == '高职本科') return this.gaozhiMajorList
       return []
       return []
     }
     }
   },
   },
   methods: {
   methods: {
     goDetail(code) {
     goDetail(code) {
-      this.$router.push({path: '/career/plan/MajorDetail', query: {type: this.type, code: code}})
+      this.$router.push({ path: '/career/plan/MajorDetail', query: { type: this.type, code: code }})
     },
     },
     returnTop(id) {
     returnTop(id) {
-      this.$scrollTo(document.getElementById(`#${id}`), {offset: 0})
+      this.$scrollTo(document.getElementById(`#${id}`), { offset: 0 })
     }
     }
   }
   }
 }
 }

+ 10 - 2
src/views/career/plan/components/major-introduce-info.vue

@@ -4,7 +4,7 @@
       <div class="info-item">
       <div class="info-item">
         <el-image :src="require('@/assets/images/career/school_icon.png')" fit="contain" />
         <el-image :src="require('@/assets/images/career/school_icon.png')" fit="contain" />
         <div>
         <div>
-          <div class="f18">{{ majorDetail.eduLevel == 'ben' ? '本科' : '专科' }}</div>
+          <div class="f18">{{ eduLevelName }}</div>
           <div class="f14 f-999">学历层次</div>
           <div class="f14 f-999">学历层次</div>
         </div>
         </div>
       </div>
       </div>
@@ -22,7 +22,7 @@
           <div class="f14 f-999">授予学位</div>
           <div class="f14 f-999">授予学位</div>
         </div>
         </div>
       </div>
       </div>
-      <div class="info-item">
+      <div v-if="majorDetail.maleRatio||majorDetail.femaleRatio" class="info-item">
         <el-image :src="require('@/assets/images/career/year_icon.png')" fit="contain" />
         <el-image :src="require('@/assets/images/career/year_icon.png')" fit="contain" />
         <div>
         <div>
           <div class="f18">{{ `${majorDetail.maleRatio}:${majorDetail.femaleRatio}` }}</div>
           <div class="f18">{{ `${majorDetail.maleRatio}:${majorDetail.femaleRatio}` }}</div>
@@ -59,6 +59,14 @@ export default {
         ...opt,
         ...opt,
         content: this.majorDetail[opt.prop]
         content: this.majorDetail[opt.prop]
       }))
       }))
+    },
+    eduLevelName() {
+      const levelNames = {
+        'ben': '本科',
+        'zhuan': '专科',
+        'gao_ben': '高职本科'
+      }
+      return levelNames[this.majorDetail?.eduLevel] || ''
     }
     }
   }
   }
 }
 }

+ 9 - 4
src/views/career/zhiyuan/NewSimulatedVolunteer.vue

@@ -68,6 +68,11 @@ import TransferMixin from '@/components/TransferMixin'
 import SearchMajorProviderMixin from '@/views/career/zhiyuan/components/SearchMajorProviderMixin'
 import SearchMajorProviderMixin from '@/views/career/zhiyuan/components/SearchMajorProviderMixin'
 import VoluntarySaveRouteGuard from '@/views/career/zhiyuan/components/VoluntarySaveRouteGuard'
 import VoluntarySaveRouteGuard from '@/views/career/zhiyuan/components/VoluntarySaveRouteGuard'
 import VoluntaryIdentifierProvider from '@/views/career/zhiyuan/components/VoluntaryIdentifierProvider'
 import VoluntaryIdentifierProvider from '@/views/career/zhiyuan/components/VoluntaryIdentifierProvider'
+import MxConst from "@/common/MxConst";
+import MxConfig from "@/common/MxConfig";
+import {MessageBox} from "element-ui";
+import router from "@/router";
+import {debounce} from "@/utils";
 
 
 export default {
 export default {
   components: {
   components: {
@@ -106,10 +111,10 @@ export default {
       saving: false,
       saving: false,
       //
       //
       tips: [
       tips: [
-        '当系统在非正式志愿模拟填报阶段,您可输入不同分数进行多次志愿智能模拟,找准自己的目标院校和专业。当系统在正式填报阶段,您可以修改和保存一次成绩,但填报次数不受限制。',
-        '期中、期末考试是对阶段性学习成果的考验,也是检验自己的目标院校或专业是否设定合理,请阶段性进行志愿模拟填报以便及时调整目标院校和专业。',
-        '各地的高考政策不同,模拟志愿填报会根据当前注册用户所属地自动匹配。',
-        '模拟填报共有四个步骤。'
+        '2025年招生计划已更新。',
+        '各院校录取数据,参考各省市出版的填报指南以及各本专科院校的官网历年录取数据。',
+        '您可以按系统的重点填报提示选择适合自己的批次模拟,也可直接选择自己关注的批次模拟。',
+        '在正式填报时,以教育考试院公布的最新招生计划为准。'
       ]
       ]
     }
     }
   },
   },

+ 1 - 0
src/views/career/zhiyuan/RecordEdit.vue

@@ -172,6 +172,7 @@ export default {
           id: m.id,
           id: m.id,
           marjorBelongs: m.code,
           marjorBelongs: m.code,
           marjorName: m.name,
           marjorName: m.name,
+          marjorCode: m.marjorCode,
           enrollRatio: m.enrollRatio,
           enrollRatio: m.enrollRatio,
           enrollRatioText: m.enrollRatioText,
           enrollRatioText: m.enrollRatioText,
           enrollFluctuate: m.enrollFluctuate,
           enrollFluctuate: m.enrollFluctuate,

+ 25 - 13
src/views/career/zhiyuan/components/PreferenceCells/CollegeCell.vue

@@ -1,18 +1,30 @@
 <template>
 <template>
   <div>
   <div>
-    <p class="mb10 f-333 f16">
-      <span class="pointer bold" @click="goCollegePage">
-        {{ row.university.name }}
-        <template v-if="row.recruitPlan.group">({{ row.recruitPlan.group }})</template>
-        ({{ row.recruitPlan.collegeCode }})
-      </span>
-      <el-tooltip v-if="row.university.isNew" effect="light" placement="top" content="新增院校">
-        <el-tag size="mini" type="danger" effect="dark" class="ml5">新</el-tag>
-      </el-tooltip>
-    </p>
-    <p v-if="row.specialProject||row.history.sinoforeign" class="f-primary f14">
-      <template v-if="row.specialProject">({{ row.specialProject }})</template>
-    </p>
+    <template v-if="row.recruitPlan.universityNameText">
+      <p class="mb10 f-333 f16">
+        <span class="pointer bold" @click="goCollegePage">
+          {{ row.recruitPlan.universityNameText }}
+        </span>
+        <el-tooltip v-if="row.university.isNew" effect="light" placement="top" content="新增院校">
+          <el-tag size="mini" type="danger" effect="dark" class="ml5">新</el-tag>
+        </el-tooltip>
+      </p>
+    </template>
+    <template v-else>
+      <p class="mb10 f-333 f16">
+        <span class="pointer bold" @click="goCollegePage">
+          {{ row.university.name }}
+          <template v-if="row.recruitPlan.group">({{ row.recruitPlan.group }})</template>
+          ({{ row.recruitPlan.collegeCode }})
+        </span>
+        <el-tooltip v-if="row.university.isNew" effect="light" placement="top" content="新增院校">
+          <el-tag size="mini" type="danger" effect="dark" class="ml5">新</el-tag>
+        </el-tooltip>
+      </p>
+      <p v-if="row.specialProject||row.history.sinoforeign" class="f-primary f14">
+        <template v-if="row.specialProject">({{ row.specialProject }})</template>
+      </p>
+    </template>
     <p class="f-9b f14">{{ row.university.features.split(',').join(' ') }}</p>
     <p class="f-9b f14">{{ row.university.features.split(',').join(' ') }}</p>
     <p class="f-9b f14">{{ row.university.location }} {{ row.university.cityName }}
     <p class="f-9b f14">{{ row.university.location }} {{ row.university.cityName }}
       排名{{ row.university.ranking || '-' }}</p>
       排名{{ row.university.ranking || '-' }}</p>

+ 20 - 2
src/views/career/zhiyuan/components/PreferenceCells/MajorCell.vue

@@ -2,7 +2,11 @@
   <div>
   <div>
     <div class="mb3 fx-row fx-cen-cen">
     <div class="mb3 fx-row fx-cen-cen">
       <span class="bold f-666">
       <span class="bold f-666">
-        <span :class="{'highlight-major': isSearchingMajorFired(row)}">{{ row.marjorName }}</span>
+        <span
+          class="pointer"
+          :class="{'highlight-major': isSearchingMajorFired(row)}"
+          @click="goMajorDetail"
+        >{{ row.marjorName }}</span>
         ({{ row.marjorBelongs }})
         ({{ row.marjorBelongs }})
         <span v-if="row.level" class="f-red">({{ row.level }})</span>
         <span v-if="row.level" class="f-red">({{ row.level }})</span>
       </span>
       </span>
@@ -24,10 +28,24 @@
 <script>
 <script>
 import PreferenceCellData from '@/views/career/zhiyuan/components/PreferenceCells/PreferenceCellData'
 import PreferenceCellData from '@/views/career/zhiyuan/components/PreferenceCells/PreferenceCellData'
 import SearchMajorInjectionMixin from '@/views/career/zhiyuan/components/SearchMajorInjectionMixin'
 import SearchMajorInjectionMixin from '@/views/career/zhiyuan/components/SearchMajorInjectionMixin'
+import MxTransferMixin from '@/components/mx-transfer-mixin'
 
 
 export default {
 export default {
   name: 'MajorCell',
   name: 'MajorCell',
-  mixins: [PreferenceCellData, SearchMajorInjectionMixin]
+  mixins: [PreferenceCellData, SearchMajorInjectionMixin, MxTransferMixin],
+  methods: {
+    goMajorDetail() {
+      const marjorCode = this.row.marjorCode
+      if (!marjorCode) return
+      // majorTreeChildren 2、3级树,匹配的专业有时是2级的
+      const keys = Object.keys(this.majorTreeChildren)
+      const math = keys.find(k => marjorCode.startsWith(k))
+      if (!math) return
+      const code = this.majorTreeChildren[math].includes(marjorCode) ? marjorCode : this.majorTreeChildren[math][0]
+      const path = '/career/plan/MajorDetail'
+      this.transferTo(path, { code }, null, '_blank')
+    }
+  }
 }
 }
 </script>
 </script>
 
 

+ 9 - 9
src/views/career/zhiyuan/components/RecommendFilterMajor.vue

@@ -21,7 +21,7 @@
           <el-button size="mini" type="primary" plain style="padding: 4px 12px" @click="changeAll(!isAllSelected)">{{ isAllSelected? '清除':'全部' }}</el-button>
           <el-button size="mini" type="primary" plain style="padding: 4px 12px" @click="changeAll(!isAllSelected)">{{ isAllSelected? '清除':'全部' }}</el-button>
         </div>
         </div>
         <el-checkbox-group v-model="localCheckedList" :max="10">
         <el-checkbox-group v-model="localCheckedList" :max="10">
-          <el-checkbox v-for="item in childrenMajors" :key="item.name" :label="item.name" class="mb10">{{ item.name }}
+          <el-checkbox v-for="item in childrenMajors" :key="item.code" :label="item.code" class="mb10">{{ item.name }}
           </el-checkbox>
           </el-checkbox>
         </el-checkbox-group>
         </el-checkbox-group>
       </div>
       </div>
@@ -72,15 +72,15 @@ export default {
       return this.majorList.reduce((prev, next) => prev.concat(next.children), [])
       return this.majorList.reduce((prev, next) => prev.concat(next.children), [])
     },
     },
     checkedMajorChildren() {
     checkedMajorChildren() {
-      return this.allMajorChildren.filter(major => this.localCheckedList.includes(major.name))
+      return this.allMajorChildren.filter(major => this.localCheckedList.includes(major.code))
     },
     },
     childrenMajors() {
     childrenMajors() {
       if (!this.currentMajorCode) return []
       if (!this.currentMajorCode) return []
       return this.majorList.find(item => item.code == this.currentMajorCode).children || []
       return this.majorList.find(item => item.code == this.currentMajorCode).children || []
     },
     },
     isAllSelected() {
     isAllSelected() {
-      return this.childrenMajors.every(major => this.localCheckedList.includes(major.name)) ||
-        (this.localCheckedList.length >= this.checkedMax && this.childrenMajors.some(m => this.localCheckedList.includes(m.name)))
+      return this.childrenMajors.every(major => this.localCheckedList.includes(major.code)) ||
+        (this.localCheckedList.length >= this.checkedMax && this.childrenMajors.some(m => this.localCheckedList.includes(m.code)))
     }
     }
   },
   },
   watch: {
   watch: {
@@ -120,19 +120,19 @@ export default {
             limitFlag = true
             limitFlag = true
             return
             return
           }
           }
-          if (!this.localCheckedList.includes(item.name)) this.localCheckedList.push(item.name)
+          if (!this.localCheckedList.includes(item.code)) this.localCheckedList.push(item.code)
         })
         })
         if (limitFlag) this.$message.warning(`最多选择${this.checkedMax}个专业`)
         if (limitFlag) this.$message.warning(`最多选择${this.checkedMax}个专业`)
       } else {
       } else {
         // 移除
         // 移除
-        this.childrenMajors.forEach(item => this.localCheckedList.remove(item.name))
+        this.childrenMajors.forEach(item => this.localCheckedList.remove(item.code))
       }
       }
     },
     },
     checkAndResetCurrentMajor() {
     checkAndResetCurrentMajor() {
       if (!this.localCheckedList.length && this.currentMajorCode) this.currentMajorCode = ''
       if (!this.localCheckedList.length && this.currentMajorCode) this.currentMajorCode = ''
     },
     },
     handleRemoveSubMajor(item) {
     handleRemoveSubMajor(item) {
-      this.localCheckedList.remove(item.name)
+      this.localCheckedList.remove(item.code)
     },
     },
     handleMajorConfirm() {
     handleMajorConfirm() {
       this.checkAndResetCurrentMajor()
       this.checkAndResetCurrentMajor()
@@ -147,8 +147,8 @@ export default {
     _emitChangeWithMajorAndParents() {
     _emitChangeWithMajorAndParents() {
       // 选中的专业以及父级
       // 选中的专业以及父级
       const parents = this.majorList
       const parents = this.majorList
-        .filter(major => major.children.some(c => this.localCheckedList.includes(c.name)))
-        .map(m => m.name)
+        .filter(major => major.children.some(c => this.localCheckedList.includes(c.code)))
+        .map(m => m.code)
       // note: emit the cloned array of localCheckedList
       // note: emit the cloned array of localCheckedList
       this.$emit('change', [...this.localCheckedList], parents)
       this.$emit('change', [...this.localCheckedList], parents)
     }
     }

+ 6 - 6
src/views/career/zhiyuan/components/SearchMajorProviderMixin.js

@@ -16,7 +16,7 @@ export default {
       const result = {}
       const result = {}
       this.majorTree.forEach(category => {
       this.majorTree.forEach(category => {
         category.children.forEach(group => {
         category.children.forEach(group => {
-          result[group.name] = group.children.map(item => item.name)
+          result[group.code] = group.children.map(item => item.code)
         })
         })
       })
       })
       return result
       return result
@@ -59,12 +59,12 @@ export default {
       this.$delete(this.formedMajors, major.id)
       this.$delete(this.formedMajors, major.id)
     },
     },
     isSearchingMajorFired(major) {
     isSearchingMajorFired(major) {
-      return this.checkedList.includes(major.marjorName) ||
-        this.checkedList.some(item => this.majorTreeChildren[item]?.includes(major.marjorName))
+      return this.checkedList.includes(major.marjorCode) ||
+        this.checkedList.some(item => this.majorTreeChildren[item]?.includes(major.marjorCode))
     },
     },
     isFormedMajorFired(major) {
     isFormedMajorFired(major) {
-      return this.formedMajors[major.id]?.includes(major.marjorName) ||
-        this.formedMajors[major.id]?.some(item => this.majorTreeChildren[item]?.includes(major.marjorName))
+      return this.formedMajors[major.id]?.includes(major.marjorCode) ||
+        this.formedMajors[major.id]?.some(item => this.majorTreeChildren[item]?.includes(major.marjorCode))
     },
     },
     ensureMajorFullTree(batch) {
     ensureMajorFullTree(batch) {
       const params = {
       const params = {
@@ -81,7 +81,7 @@ export default {
         group.marjors.forEach(major => {
         group.marjors.forEach(major => {
           // Do not use ===, id is not concerned with type of string or number
           // Do not use ===, id is not concerned with type of string or number
           if (highlighted.some(id => id == major.id)) {
           if (highlighted.some(id => id == major.id)) {
-            results[major.id] = [major.name]
+            results[major.id] = [major.marjorCode]
           }
           }
         })
         })
       })
       })

+ 2 - 2
src/views/career/zhiyuan/components/SimulateScore.vue

@@ -31,7 +31,7 @@
       </el-form-item>
       </el-form-item>
       <el-form v-if="!hiddenRanking" ref="inner" :model="form" :rules="rules" label-width="120px">
       <el-form v-if="!hiddenRanking" ref="inner" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="填写位次" prop="seatInput">
         <el-form-item label="填写位次" prop="seatInput">
-          <el-input v-model="form.seatInput" placeholder="输入成绩单位次(可选)" />
+          <el-input v-model="form.seatInput" placeholder="输入位次(可选)" />
           <el-link type="success" target="_blank" href="/zhiyuan/scoreSegment" class="ml10" :underline="false">查看位次</el-link>
           <el-link type="success" target="_blank" href="/zhiyuan/scoreSegment" class="ml10" :underline="false">查看位次</el-link>
           <div class="f12 f-666 mt5" style="line-height: 16px">
           <div class="f12 f-666 mt5" style="line-height: 16px">
             <i class="el-icon-info" />
             <i class="el-icon-info" />
@@ -69,7 +69,7 @@ export default {
       voluntaryData: {
       voluntaryData: {
         isNewGaokao: false,
         isNewGaokao: false,
         minScore: 0,
         minScore: 0,
-        maxScore: 0,
+        maxScore: 750,
         course0: [],
         course0: [],
         course1: []
         course1: []
       },
       },

+ 1 - 0
src/views/career/zhiyuan/components/recommend.vue

@@ -306,6 +306,7 @@ export default {
             id: major.id,
             id: major.id,
             code: major.marjorBelongs,
             code: major.marjorBelongs,
             name: major.marjorName,
             name: major.marjorName,
+            marjorCode: major.marjorCode,
             pickType: item.pickType,
             pickType: item.pickType,
             submitMajorId: major.history?.id,
             submitMajorId: major.history?.id,
             enrollRatio: major.enrollRatio,
             enrollRatio: major.enrollRatio,

+ 18 - 1
src/views/index/blocks/index-login-check-mixin.js

@@ -1,4 +1,8 @@
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
+import MxConst from "@/common/MxConst";
+import MxConfig from "@/common/MxConfig";
+import {MessageBox} from "element-ui";
+import router from "@/router";
 
 
 export default {
 export default {
   provide() {
   provide() {
@@ -13,7 +17,20 @@ export default {
     loginStatusCheck() {
     loginStatusCheck() {
       // 首页统一注入登陆检测方法,未登陆时直接跳至登陆框
       // 首页统一注入登陆检测方法,未登陆时直接跳至登陆框
       if (this.isLogin) {
       if (this.isLogin) {
-        if (!!this.currentUser?.isBind) return Promise.resolve(true)
+        if (!!this.currentUser?.isBind) {
+
+          const { scoreLock, scoreLockingMsg } = this.currentUser
+          if (scoreLock == MxConst.enum.scoreLock.locking) {
+            setTimeout(async() => {
+              const msg = scoreLockingMsg || MxConfig.scoreLockingTips
+              await MessageBox.alert(msg, { type: 'warning', showClose: false })
+              router.push('/user/info/userinfo')
+            }, 200)
+            return Promise.reject(false)
+          }
+
+          return Promise.resolve(true)
+        }
 
 
         this.dialogVisible = true
         this.dialogVisible = true
         this.$message.error('请先完善信息!')
         this.$message.error('请先完善信息!')

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

@@ -155,6 +155,7 @@ export default {
       this.dialogVisible = !this.currentUser.isBind
       this.dialogVisible = !this.currentUser.isBind
       await this.CheckRoutes(true)
       await this.CheckRoutes(true)
       await this.GetInfo()
       await this.GetInfo()
+      setTimeout(() => this.loginStatusCheck(), 500)
     }
     }
   }
   }
 }
 }

+ 5 - 5
src/views/system/user/profile/index.vue

@@ -64,6 +64,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
+import {mapGetters} from 'vuex'
 import userAvatar from "./userAvatar";
 import userAvatar from "./userAvatar";
 import userInfo from "./userInfo";
 import userInfo from "./userInfo";
 import resetPwd from "./resetPwd";
 import resetPwd from "./resetPwd";
@@ -83,6 +84,9 @@ export default {
       title:''
       title:''
     };
     };
   },
   },
+  computed: {
+    ...mapGetters(['currentUser'])
+  },
   created() {
   created() {
     this.name =  this.$route.name
     this.name =  this.$route.name
     this.title  =  this.$route.meta.title
     this.title  =  this.$route.meta.title
@@ -94,11 +98,7 @@ export default {
   },
   },
   methods: {
   methods: {
     getUser() {
     getUser() {
-      getUserProfile().then(response => {
-        this.user = response.data;
-        this.roleGroup = response.roleGroup;
-        this.postGroup = response.postGroup;
-      });
+      this.user = {...this.currentUser}
     }
     }
   }
   }
 };
 };

+ 60 - 20
src/views/system/user/profile/userInfo.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div>
   <div>
-    <el-form ref="form" :model="user" :rules="rules" label-width="80px">
+    <el-form ref="form" :model="user" :rules="rules" label-width="120px">
       <el-form-item label="用户名称" prop="userName">
       <el-form-item label="用户名称" prop="userName">
         <el-input v-model="user.userName" disabled="disabled" maxlength="50"/>
         <el-input v-model="user.userName" disabled="disabled" maxlength="50"/>
       </el-form-item>
       </el-form-item>
@@ -27,11 +27,21 @@
           <el-radio label="1">女</el-radio>
           <el-radio label="1">女</el-radio>
         </el-radio-group>
         </el-radio-group>
       </el-form-item>
       </el-form-item>
-      <el-form-item>
-        <el-button type="primary" size="mini" @click="submit">保存</el-button>
-        <!--<el-button type="danger" size="mini" @click="close">关闭</el-button>-->
-      </el-form-item>
     </el-form>
     </el-form>
+    <simulate-score
+      v-if="!currentUser.isHiddenVoluntary"
+      ref="score"
+      :form="scoreModel"
+      :disabled="!user.provinceName"
+      :hidden-ranking="true"
+      :province-name="user.provinceName"
+      :disable-required="disableScoreRequired"
+      :keep-value="true"
+      class="scoreForm"
+    />
+    <div class="mb30 ml60 pl60">
+      <el-button type="primary" size="mini" @click="submit">保存</el-button>
+    </div>
     <el-dialog :visible.sync="dialogVisible" title="变更手机号" width="450px">
     <el-dialog :visible.sync="dialogVisible" title="变更手机号" width="450px">
       <reset-mobile-form @cancel="dialogVisible=false" @completed="dialogVisible=false,GetInfo()"></reset-mobile-form>
       <reset-mobile-form @cancel="dialogVisible=false" @completed="dialogVisible=false,GetInfo()"></reset-mobile-form>
     </el-dialog>
     </el-dialog>
@@ -39,46 +49,67 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { updateUserProfile } from '@/api/system/user'
-import { mapActions, mapGetters } from 'vuex'
+import {updateUserProfile} from '@/api/system/user'
+import {mapActions, mapGetters} from 'vuex'
 import ResetMobileForm from '@/views/system/user/profile/components/ResetMobileForm'
 import ResetMobileForm from '@/views/system/user/profile/components/ResetMobileForm'
+import MxConst from "@/common/MxConst";
+import SimulateScore from "@/views/career/zhiyuan/components/SimulateScore.vue";
 
 
 export default {
 export default {
-  components: { ResetMobileForm },
+  components: {SimulateScore, ResetMobileForm},
   props: {
   props: {
     user: {
     user: {
       type: Object
       type: Object
     }
     }
   },
   },
   computed: {
   computed: {
-    ...mapGetters(['isFrontStudent'])
+    ...mapGetters(['isFrontStudent', 'currentUser']),
+    disableScoreRequired() {
+      return this.user.scoreLock == MxConst.enum.scoreLock.unlock
+    }
   },
   },
   data() {
   data() {
     return {
     return {
       dialogVisible: false,
       dialogVisible: false,
+      scoreModel: {
+        score: '',
+        firstSubject: '',
+        lastSubject: ''
+      },
       // 表单校验
       // 表单校验
       rules: {
       rules: {
         nickName: [
         nickName: [
-          { required: true, message: '用户昵称不能为空', trigger: 'blur' }
+          {required: true, message: '用户昵称不能为空', trigger: 'blur'}
         ]
         ]
       }
       }
     }
     }
   },
   },
+  mounted() {
+    const mode = this.user.mode?.split(',') || []
+    this.scoreModel.score = this.user.score
+    this.scoreModel.firstSubject = mode.first() || ''
+    this.scoreModel.lastSubject = mode.length > 1 ? mode.slice(1) : []
+  },
   methods: {
   methods: {
     ...mapActions(['GetInfo']),
     ...mapActions(['GetInfo']),
-    submit() {
-      this.$refs['form'].validate((valid) => {
-        if (valid) {
-          updateUserProfile(this.user).then((response) => {
-            this.msgSuccess('修改成功')
-            this.GetInfo()
-          })
-        }
-      })
+    async submit() {
+      const validates = [this.$refs.form.validate()]
+      if (this.$refs.score) validates.push(this.$refs.score.validate())
+      await Promise.all(validates)
+
+      const mode = [this.scoreModel.firstSubject].concat(this.scoreModel.lastSubject).filter(i => !!i)
+      const commit = {
+        ...this.user,
+        mode: mode.toString(),
+        score: this.scoreModel.score
+      }
+      await updateUserProfile(commit)
+      this.msgSuccess('修改成功')
+      await this.GetInfo()
     },
     },
     close() {
     close() {
       this.$store.dispatch('tagsView/delView', this.$route)
       this.$store.dispatch('tagsView/delView', this.$route)
-      this.$router.push({ path: '/' })
+      this.$router.push({path: '/'})
     }
     }
   }
   }
 }
 }
@@ -91,4 +122,13 @@ export default {
 /deep/ .el-radio {
 /deep/ .el-radio {
   display: inline-block;
   display: inline-block;
 }
 }
+
+.scoreForm.form {
+  padding: 0;
+  width: auto;
+}
+
+.scoreForm.form >>> .el-form-item__label {
+  padding-right: 12px;
+}
 </style>
 </style>