Browse Source

prev-batch sync with VoluntaryUI

abpcoder 1 month ago
parent
commit
cb9c41af93

+ 1 - 1
.env.development

@@ -4,7 +4,7 @@ ENV = 'development'
 # 名学金榜学习系统/生产环境
 #VUE_APP_BASE_API = 'https://www.mingxuejinbang.com/prod-api'
 #VUE_APP_BASE_API = 'http://localhost:8080'
-VUE_APP_BASE_API = 'https://back.mingxuejinbang.com/prod-v2'
+VUE_APP_BASE_API = 'https://www.mingxuejinbang.com/prod-v2'
 
 VUE_APP_MOBILE = "https://www.mingxuejinbang.com/h5"
 

+ 5 - 2
src/store/getters.js

@@ -18,8 +18,11 @@ const getters = {
   isCardBind: (state, getters) => getters.isBind || !getters.isMobileBind,
   scoreLocked: (state) => state.user.scoreLock == MxConst.enum.scoreLock.locked,
   scoreUnlock: (state) => state.user.scoreLock == MxConst.enum.scoreLock.unlock,
-  isPreEnrollSupport: (state, getters) => ['湖南', '江西'].includes(getters.currentUser.provinceName),
-  isPreEnrollFormatted: (state, getters) => true,
+  isPrePlanAsYzy: (state, getters) => true, // 提前批-计划数据结构(v2与yzy相同)
+  isPreEnrollAsYzy: (state, getters) => !['江西'].includes(getters.currentUser.provinceName), // 提前批-投档数据结构(v2与yzy相同)
+  isPrePlanTreeSupport: (state, getters) => true, // 提前批 - yzy模式支持树搜索(计划从书上采集,是标准树,各个省份都是支持的)
+  isPreEnrollTreeSupport: (state, getters) => ['湖南'].includes(getters.currentUser.provinceName), // 投档线 - 按yzy模式支持树搜索(分数有的从官网采集是非标准数据,与计划的树对应不上)
+  isPreEnrollTagSupport: (state, getters) => ['江西'].includes(getters.currentUser.provinceName), // 投档线 - 自行整理了分类,自行提取了搜索条件
   school: state => state.user.busiSchool?.first(),
   schoolName: (state, getters) => getters.school?.schoolName,
   firstGradeName: (state, getters) => getters.school?.grade?.first().gradeName,

+ 8 - 9
src/views/career/LibraryCollege/UniversitiesDetail.vue

@@ -1,6 +1,6 @@
 <template>
-  <div id="universityDetail" v-loading="loading" class="bg-page fx-column fx-cen-cen app-container">
-    <index-card v-if="baseInfo" class="width100">
+  <div id="universityDetail" v-loading="loading" class="bg-page fx-column fx-cen-cen">
+    <index-card v-if="baseInfo" class="index-block">
       <div slot="title" class="fx-row fx-sta-cen">
         <img class="pointer icon72" :src="baseInfo.logo" alt="" @click="toWindow(baseInfo.url)">
         <div class="fx-column ml30">
@@ -48,13 +48,13 @@
       </keep-alive>
       <!--   提前批 招生计划   -->
       <keep-alive>
-        <prev-enroll-plan v-if="tabActive==6&&!isPreEnrollFormatted" :category="prevCategory" :university-code="code" />
-        <prev-enroll-plan-v2 v-if="tabActive==6&&isPreEnrollFormatted" :category="prevCategory" :university-code="code" />
+        <prev-enroll-plan v-if="tabActive==6&&!isPrePlanAsYzy" :category="prevCategory" :university-code="code" />
+        <prev-enroll-plan-v2 v-if="tabActive==6&&isPrePlanAsYzy" :category="prevCategory" :university-code="code" />
       </keep-alive>
       <!--   提前批 投档线   -->
       <keep-alive>
-        <prev-shift-line v-if="tabActive==7&&isPreEnrollSupport" :category="prevCategory" :university-code="code" />
-        <prev-shift-line-v2 v-if="tabActive==7&&!isPreEnrollSupport" :category="prevCategory" :university-code="code" />
+        <prev-shift-line v-if="tabActive==7&&!isPreEnrollAsYzy" :category="prevCategory" :university-code="code" />
+        <prev-shift-line-v2 v-if="tabActive==7&&isPreEnrollAsYzy" :category="prevCategory" :university-code="code" />
       </keep-alive>
     </index-card>
     <scroll-top />
@@ -78,7 +78,6 @@ import PrevEnrollPlan from '@/views/career/PrevBatch/PrevEnrollPlan.vue'
 import PrevEnrollPlanV2 from '@/views/career/PrevBatch/PrevEnrollPlanV2.vue'
 import PrevShiftLine from '@/views/career/PrevBatch/PrevShiftLine.vue'
 import PrevShiftLineV2 from '@/views/career/PrevBatch/PrevShiftLineV2.vue'
-import MxConst from '@/common/MxConst'
 
 export default {
   name: 'UniversityDetail',
@@ -114,9 +113,9 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isPreEnrollSupport', 'isPreEnrollFormatted']),
+    ...mapGetters(['isPrePlanAsYzy', 'isPreEnrollAsYzy']),
     prevCategory() {
-      return '' // this.isPreEnrollSupport ? MxConst.enum.recruitPlanCategory.common : ''
+      return ''
     }
   },
   mounted() {

+ 5 - 6
src/views/career/PrevBatch/Index.vue

@@ -7,13 +7,12 @@
       </el-tabs>
       <div class="pl12 pr12">
         <keep-alive>
-          <prev-enroll-plan v-if="activeName=='prevEnrollPlan'&&isPreEnrollSupport" />
-          <prev-enroll-plan-v2 v-if="activeName=='prevEnrollPlan'&&!isPreEnrollSupport" />
+          <prev-enroll-plan v-if="activeName=='prevEnrollPlan'&&!isPrePlanAsYzy" />
+          <prev-enroll-plan-v2 v-if="activeName=='prevEnrollPlan'&&isPrePlanAsYzy" />
         </keep-alive>
         <keep-alive>
-          <!--<evaluation-empty v-if="activeName=='prevShiftLine'&&!isPreEnrollSupport" title="功能正在搭建,敬请期待..." />-->
-          <prev-shift-line v-if="activeName=='prevShiftLine'&&isPreEnrollSupport" />
-          <prev-shift-line-v2 v-if="activeName=='prevShiftLine'&&!isPreEnrollSupport" />
+          <prev-shift-line v-if="activeName=='prevShiftLine'&&!isPreEnrollAsYzy" />
+          <prev-shift-line-v2 v-if="activeName=='prevShiftLine'&&isPreEnrollAsYzy" />
         </keep-alive>
       </div>
     </div>
@@ -37,7 +36,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isPreEnrollSupport']),
+    ...mapGetters(['isPrePlanAsYzy', 'isPreEnrollAsYzy']),
     categoryName() {
       // This means you can set the meta.categoryName in the route config,
       // if you don't set it, it will use the default value.

+ 2 - 2
src/views/career/PrevBatch/PrevEnrollPlan.vue

@@ -2,7 +2,7 @@
   <div v-loading="loading" class="fx-column">
     <div class="fx-row fx-bet-cen mt15 mb10">
       <div class="fx-row">
-        <el-select v-if="pureMode&&isPreEnrollSupport" v-model="query.category" class="mr10" @change="initProcess">
+        <el-select v-if="pureMode&&!isPrePlanAsYzy" v-model="query.category" class="mr10" @change="initProcess">
           <el-option v-for="item in queryData.categories" :key="item.label" :label="item.label" :value="item.value" />
         </el-select>
         <el-select v-model="query.year" placeholder="请选择年份" @change="handleYearChange">
@@ -147,7 +147,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isBind', 'isPreEnrollSupport', 'isPreEnrollFormatted']),
+    ...mapGetters(['isBind', 'isPrePlanAsYzy']),
     ...mapState({ preTree: state => state.cachedData.preTree }),
     pureMode() {
       return !!this.universityCode // now work in university detail page.

+ 96 - 0
src/views/career/PrevBatch/PrevEnrollPlanTree.vue

@@ -0,0 +1,96 @@
+<template>
+  <el-container v-loading="loading" class="layout-prev-container">
+    <el-aside width="400" class="tree-container">
+      <div class="bg-white pd20">
+        <el-select v-model="query.year" placeholder="请选择年份" @change="handleYearChange">
+          <el-option v-for="item in queryData.years" :key="item.label" :label="item.label" :value="item.value" />
+        </el-select>
+        <el-input v-model="tagKeyword" placeholder="输入类别名称进行筛选" class="mt20" />
+        <el-tree ref="tree" class="mt10" :data="preTree" node-key="value" highlight-current :expand-on-click-node="false" :filter-node-method="filterNode" @node-click="handleTagChange" />
+      </div>
+    </el-aside>
+    <el-main class="content-container">
+      <div class="bg-white pb40 pl20 pr20">
+        <div class="text-right pt20">
+          <el-input v-model="query.keyword" placeholder="请输入院校/专业名称" suffix-icon="el-icon-search" style="width: 250px" clearable @keyup.enter.native="handleSearch" />
+          <el-button type="primary" class="ml10" @click="handleSearch">搜索</el-button>
+        </div>
+        <sub-major-table
+          v-for="row in rows"
+          :key="row.id"
+          :row="row"
+          :is-new-gaokao="isNewGaokao"
+          :show-shift-line-entry="!isEnrollMode"
+          :custom-cols-length="isEnrollMode?getShiftCols(row).length:undefined"
+          @university="toDetail(row)"
+          @shift-line="toShiftLine(row)"
+        >
+          <template v-if="isEnrollMode" #default="scope">
+            <el-descriptions-item v-for="c in getShiftCols(row)" :key="c.prop" :label="c.label">{{ scope[c.prop] || '-' }}</el-descriptions-item>
+          </template>
+        </sub-major-table>
+        <evaluation-empty v-if="!rows.length" title="暂无数据" class="mt20" />
+        <vip-guide-more v-if="total>1&&!isBind" />
+        <pagination :total="total" :page.sync="query.pageNum" :limit.sync="query.pageSize" @pagination="getList" />
+      </div>
+    </el-main>
+  </el-container>
+</template>
+
+<script>
+import PrevEnrollPlanV2 from '@/views/career/PrevBatch/PrevEnrollPlanV2.vue'
+import PlanShiftColumns from '@/views/career/PrevBatch/components/PlanShiftColumns'
+
+export default {
+  name: 'PreEnrollPlanTree',
+  extends: PrevEnrollPlanV2,
+  mixins: [PlanShiftColumns],
+  data() {
+    return {
+      tagKeyword: '',
+      isEnrollMode: false // 计划与投档混用
+    }
+  },
+  watch: {
+    'query.year': function() {
+      this.query.tagCode = ''
+      this.tagKeyword = ''
+      this.loadPreTree({ year: this.query.year })
+    },
+    'tagKeyword': function(val) {
+      this.$refs.tree.filter(val)
+    }
+  },
+  methods: {
+    filterNode(value, data) {
+      console.log('filterNode', value, data)
+      if (!value) return true
+      if (data.value == this.query.tagCode) return true // keep the current selected node
+      return data.label.indexOf(value) !== -1
+    },
+    async initProcess() {
+      await this.initQueryYear()
+      // await this.initQueryType() // ignore query.type
+      await this.getList()
+    },
+    handleTagChange(node) {
+      if (this.query.tagCode != node.value) {
+        this.query.tagCode = node.value
+        this.getList()
+      } else {
+        // set el-tree highlighted node
+        this.$refs.tree.setCurrentKey(null)
+        this.query.tagCode = ''
+        this.getList()
+      }
+    },
+    toShiftLine(row) {
+      const next = { code: row.universityCode, tab: 7 }
+      this.transferTo('/career/plan/UniversityDetail', next, null, '_blank')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 9 - 9
src/views/career/PrevBatch/PrevShiftLine.vue

@@ -6,11 +6,9 @@
       <el-button type="primary" class="ml10" @click="handleSearch">搜索</el-button>
     </div>
     <template v-if="subMajorMode">
-      <sub-major-table v-for="row in rows" :key="row.id" :row="row" :is-new-gaokao="isNewGaokao" @university="toDetail(row)">
+      <sub-major-table v-for="row in rows" :key="row.id" :row="row" :is-new-gaokao="isNewGaokao" :custom-cols-length="getShiftCols(row).length" @university="toDetail(row)">
         <template #default="scope">
-          <el-descriptions-item label="录取人数">{{ scope.numReal || '-' }}</el-descriptions-item>
-          <el-descriptions-item label="最低分">{{ scope.score || '-' }}</el-descriptions-item>
-          <el-descriptions-item label="最低位次">{{ scope.seat || '-' }}</el-descriptions-item>
+          <el-descriptions-item v-for="c in getShiftCols(row)" :key="c.prop" :label="c.label">{{ scope[c.prop] || '-' }}</el-descriptions-item>
         </template>
       </sub-major-table>
     </template>
@@ -32,7 +30,8 @@
         </el-tooltip>
       </template>
       <template #tag="{display}">
-        <div v-for="(item, idx) in display.split('>')" :key="idx" :style="{marginLeft: (idx*10)+'px'}" class="tag-item f13 rel">{{ item }}</div>
+        <div v-for="(item, idx) in display.split('>')" :key="idx" :style="{marginLeft: (idx*10)+'px'}" class="tag-item f13 rel">{{ item }}
+        </div>
       </template>
     </dynamic-table>
     <evaluation-empty v-if="!rows.length&&subMajorMode" title="暂无数据" />
@@ -49,6 +48,7 @@ import { mapGetters } from 'vuex'
 import MxCondition from '@/components/MxCondition/mx-condition.vue'
 import GlobalVoluntaryDataMixin from '@/views/career/GlobalVoluntaryDataMixin'
 import SubMajorTable from '@/views/career/PrevBatch/components/SubMajorTable.vue'
+import PlanShiftColumns from '@/views/career/PrevBatch/components/PlanShiftColumns'
 
 const formatter = (row, column, cellValue) => {
   return cellValue || '-'
@@ -56,7 +56,7 @@ const formatter = (row, column, cellValue) => {
 export default {
   name: 'PrevShiftLine',
   components: { SubMajorTable, MxCondition, DynamicTable },
-  mixins: [transferMixin, GlobalVoluntaryDataMixin],
+  mixins: [transferMixin, GlobalVoluntaryDataMixin, PlanShiftColumns],
   props: {
     category: {
       type: String | Number,
@@ -83,7 +83,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isLogin', 'isBind', 'isPreEnrollSupport']),
+    ...mapGetters(['isLogin', 'isBind', 'isPreEnrollAsYzy']),
     pureMode() {
       return !!this.universityCode // now work in university detail page.
     },
@@ -91,8 +91,8 @@ export default {
       if (!this.isLogin) return null
       const category = this.category || this.$route.meta.category
       // 现在不需要 preCategory 了
-      const categoryParams = { category }// this.pureMode && this.isPreEnrollSupport ? { preCategory: category } : { category }
-      return this.pureMode || !this.isPreEnrollSupport ? {
+      const categoryParams = { category }
+      return this.pureMode || this.isPreEnrollAsYzy ? {
         ...categoryParams,
         preEnrollYear: '',
         universityCode: this.universityCode

+ 36 - 0
src/views/career/PrevBatch/PrevShiftLineTree.vue

@@ -0,0 +1,36 @@
+
+<script>
+import PrevEnrollPlanTree from '@/views/career/PrevBatch/PrevEnrollPlanTree.vue'
+import { getPreEnrollV2, getPreEnrollYears } from '@/api/webApi/prev-batch'
+
+export default {
+  name: 'PrevShiftLineTree',
+  extends: PrevEnrollPlanTree,
+  data() {
+    return {
+      isEnrollMode: true // 重写PrevEnrollPlanTree,让表格显示为投档格式
+    }
+  },
+  methods: {
+    async initQueryYear() {
+      const res = await getPreEnrollYears({ category: this.query.category })
+      this.queryData.years = this._makeOptions(res['rows'])
+      this.query.year = this.queryData.years.first().value
+    },
+    async getList() {
+      this.loading = true
+      try {
+        const res = await getPreEnrollV2(this.query)
+        this.rows = res.rows
+        this.total = res.total
+      } finally {
+        this.loading = false
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 20 - 0
src/views/career/PrevBatch/components/PlanShiftColumns.js

@@ -0,0 +1,20 @@
+export default {
+  methods: {
+    getShiftCols(row) {
+      return row?.isArt
+        ? [
+          { label: '投档线', prop: 'tdx' },
+          { label: '录取人数', prop: 'numReal' },
+          { label: '最低分(综)', prop: 'minComprehensiveScore' },
+          { label: '最低位(综)', prop: 'minComprehensiveRank' },
+          { label: '最低分(文)', prop: 'minScore' },
+          { label: '最低分(专)', prop: 'minMajorScore' }
+        ]
+        : [
+          { label: '录取人数', prop: 'numReal' },
+          { label: '最低分', prop: 'score' },
+          { label: '最低位次', prop: 'seat' }
+        ]
+    }
+  }
+}

+ 23 - 10
src/views/career/PrevBatch/components/SubMajorTable.vue

@@ -1,6 +1,6 @@
 <template>
-  <el-descriptions :column="isNewGaokao?12:11" direction="vertical" :colon="false" border class="enroll-plan-table-v2">
-    <enroll-plan-tags slot="title" :value="row.tag" />
+  <el-descriptions :column="totalColsLength" direction="vertical" :colon="false" border class="enroll-plan-table-v2">
+    <enroll-plan-tags slot="title" :value="row.tag || ''" />
     <el-descriptions-item label="院校代码" content-class-name="bold">{{ row.collegeCode || '-' }}</el-descriptions-item>
     <el-descriptions-item label="院校名称" :span="7" content-class-name="max-width-cell">
       <div class="fx-row ai-cen">
@@ -19,7 +19,8 @@
     <template v-for="m in row.subMajors">
       <el-descriptions-item :key="`${m.id}_${0}`" label="专业代码">{{ m.marjorBelongs || '-' }}</el-descriptions-item>
       <el-descriptions-item :key="`${m.id}_${1}`" label="专业名称" :span="7" content-class-name="max-width-cell">
-        {{ m.marjorName + m.marjorDirection }}
+        <div class="f-333 bold">{{ m.marjorName }}</div>
+        <div class="f-666">{{ m.marjorDirection }}</div>
       </el-descriptions-item>
       <slot v-bind="m">
         <!--   定制内容,默认为计划列;NOTE:此slot与父表相同   -->
@@ -27,10 +28,7 @@
         <el-descriptions-item :key="`${m.id}_${3}`" label="学费">{{ m.xuefei || '-' }}</el-descriptions-item>
         <el-descriptions-item :key="`${m.id}_${4}`" label="学制">{{ m.xuezhi || '-' }}</el-descriptions-item>
       </slot>
-      <el-descriptions-item v-if="isNewGaokao" :key="`${m.id}_${5}`" label="选科">{{
-        m.course || '-'
-      }}
-      </el-descriptions-item>
+      <el-descriptions-item v-if="isNewGaokao" :key="`${m.id}_${5}`" label="选科">{{ m.course || '-' }}</el-descriptions-item>
     </template>
   </el-descriptions>
 </template>
@@ -53,12 +51,23 @@ export default {
     showShiftLineEntry: {
       type: Boolean,
       default: false
+    },
+    customColsLength: {
+      type: Number,
+      default: 3
+    }
+  },
+  computed: {
+    totalColsLength() {
+      let len = 1 + 7
+      if (this.isNewGaokao) len += 1
+      return len + this.customColsLength
     }
   }
 }
 </script>
 
-<style scoped>
+<style lang="scss">
 
 .enroll-plan-table-v2 {
   .el-descriptions__header {
@@ -69,12 +78,16 @@ export default {
   }
 
   .max-width-cell {
-    min-width: 30vw;
-    max-width: 30vw;
+    min-width: 25vw;
+    max-width: 25vw;
   }
 
   .el-descriptions__table > tbody:nth-child(n+3) > tr:first-of-type {
     display: none;
   }
 }
+
+.enroll-plan-table-v2 + .enroll-plan-table-v2 {
+  margin-top: 20px;
+}
 </style>

+ 59 - 111
src/views/career/PrevBatch/formatted.vue

@@ -1,136 +1,84 @@
 <template>
-  <el-container v-loading="loading">
-    <el-aside width="400" class="tree-container">
-      <div class="bg-white pd20">
-        <el-select v-model="query.year" placeholder="请选择年份" @change="handleYearChange">
-          <el-option v-for="item in queryData.years" :key="item.label" :label="item.label" :value="item.value"/>
-        </el-select>
-        <el-input v-model="tagKeyword" placeholder="输入类别名称进行筛选" class="mt20"/>
-        <el-tree
-          ref="tree"
-          class="mt10"
-          :data="preTree"
-          node-key="value"
-          default-expand-all
-          highlight-current
-          :expand-on-click-node="false"
-          :filter-node-method="filterNode"
-          @node-click="handleTagChange"
-        />
-      </div>
-    </el-aside>
-    <el-main class="content-container">
-      <div class="bg-white pb40 pl20 pr20">
-        <div class="text-right pt20">
-          <el-input
-            v-model="query.keyword"
-            placeholder="请输入院校/专业名称"
-            suffix-icon="el-icon-search"
-            style="width: 250px"
-            clearable
-            @keyup.enter.native="handleSearch"
-          />
-          <el-button type="primary" class="ml10" @click="handleSearch">搜索</el-button>
-        </div>
-        <sub-major-table
-          v-for="row in rows"
-          :key="row.id"
-          :row="row"
-          :is-new-gaokao="isNewGaokao"
-          show-shift-line-entry
-          @university="toDetail(row)"
-          @shift-line="toShiftLine(row)"
-        />
-        <evaluation-empty v-if="!rows.length" title="暂无数据" class="mt20"/>
-        <vip-guide-more v-if="total>1&&!isBind"/>
-        <pagination :total="total" :page.sync="query.pageNum" :limit.sync="query.pageSize" @pagination="getList"/>
-      </div>
-    </el-main>
-  </el-container>
+  <div :style="cssVar">
+    <el-tabs v-if="isPreEnrollTreeSupport" v-model="activeName" stretch class="prev-page-tabs">
+      <el-tab-pane label="提前批招生计划" name="plan">
+        <prev-enroll-plan-tree />
+      </el-tab-pane>
+      <el-tab-pane label="提前批投档线" name="enroll">
+        <prev-shift-line-tree />
+      </el-tab-pane>
+    </el-tabs>
+    <prev-enroll-plan-tree v-else />
+  </div>
 </template>
 
 <script>
-import Layout from '@/layout/simple'
-import PrevEnrollPlanV2 from '@/views/career/PrevBatch/PrevEnrollPlanV2.vue'
+import { mapGetters } from 'vuex'
+import PrevEnrollPlanTree from '@/views/career/PrevBatch/PrevEnrollPlanTree.vue'
+import PrevShiftLineTree from '@/views/career/PrevBatch/PrevShiftLineTree.vue'
 
 export default {
   name: 'Formatted',
-  components: {Layout},
-  extends: PrevEnrollPlanV2,
+  components: { PrevShiftLineTree, PrevEnrollPlanTree },
   data() {
     return {
-      tagKeyword: ''
+      activeName: 'plan'
     }
   },
-  watch: {
-    'query.year': function () {
-      this.query.tagCode = ''
-      this.tagKeyword = ''
-      this.loadPreTree({year: this.query.year})
-    },
-    'tagKeyword': function (val) {
-      this.$refs.tree.filter(val)
-    }
-  },
-  methods: {
-    filterNode(value, data) {
-      console.log('filterNode', value, data)
-      if (!value) return true
-      if (data.value == this.query.tagCode) return true // keep the current selected node
-      return data.label.indexOf(value) !== -1
-    },
-    async initProcess() {
-      await this.initQueryYear()
-      // await this.initQueryType() // ignore query.type
-      await this.getList()
-    },
-    handleTagChange(node) {
-      if (this.query.tagCode != node.value) {
-        this.query.tagCode = node.value
-        this.getList()
-      } else {
-        // set el-tree highlighted node
-        this.$refs.tree.setCurrentKey(null)
-        this.query.tagCode = ''
-        this.getList()
+  computed: {
+    ...mapGetters(['isPreEnrollTreeSupport']),
+    cssVar() {
+      // 40 tabs' height; 15 container space;
+      return {
+        '--prev-space': this.isPreEnrollTreeSupport ? `${68 + 40 + 15}px` : '68px'
       }
-    },
-    toShiftLine(row) {
-      const next = {code: row.universityCode, tab: 7}
-      this.transferTo('/career/plan/UniversityDetail', next, null, '_blank')
     }
-  }
+  },
+  methods: {}
 }
 </script>
 
-<style lang="scss" scoped>
-.tree-container {
-  width: 400px;
-  height: calc(100vh - 68px);
-  overflow-y: auto;
-  padding: 20px;
-
-  ::v-deep .el-tree-node__content {
-    height: fit-content;
+<style lang="scss">
+.prev-page-tabs {
+  .el-tabs__header {
+    margin-bottom: 0 !important;
   }
 
-  ::v-deep .el-tree-node__label {
-    flex: 1;
-    white-space: normal;
-    line-height: 1.3;
-    padding: 4px 0;
+  .el-tabs__nav {
+    background-color: white;
   }
 }
 
-.content-container {
-  height: calc(100vh - 68px);
-  overflow-y: auto;
-}
+.layout-prev-container {
+  .tree-container {
+    width: 400px;
+    height: calc(100vh - var(--prev-space));
+    overflow-y: auto;
+    padding: 20px;
+
+    .el-tree-node__content {
+      height: fit-content;
+    }
 
-.el-tree--highlight-current::v-deep {
-  .el-tree-node.is-current > .el-tree-node__content {
-    background-color: var(--themeColor);
-    color: #FFFFFF;
+    .el-tree-node__label {
+      flex: 1;
+      white-space: normal;
+      line-height: 1.3;
+      padding: 4px 0;
+    }
+  }
+
+  .content-container {
+    height: calc(100vh - var(--prev-space));
+    overflow-y: auto;
+  }
+
+  .el-tree--highlight-current {
+    .el-tree-node.is-current > .el-tree-node__content {
+      background-color: var(--themeColor);
+      color: #FFFFFF;
+    }
   }
 }
+
 </style>