UniversitiesDetail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <template>
  2. <div ref="universityDetail" id="universityDetail" class="app-container" v-loading="loading">
  3. <el-row :gutter="10" class="mt20 mb30">
  4. <el-col :span="12" class="fx-row ai-center">
  5. <div class="mr30">
  6. <img width="72px" height="72px" :src="baseInfo.logo" alt=""/>
  7. </div>
  8. <div>
  9. <span class="f28 ">{{ baseInfo.name }}</span>
  10. <div class="mt5 mb5">
  11. <el-tag class="mr5" size="mini" v-for="item in baseInfo.features ? baseInfo.features.split(',') : []">
  12. {{ item }}
  13. </el-tag>
  14. </div>
  15. <span class="f14 f-666 "
  16. >{{ `${baseInfo.location} ${baseInfo.cityName} ${baseInfo.type} / ${baseInfo.natureTypeCN} / ${baseInfo.managerType} ` }}</span>
  17. </div>
  18. </el-col>
  19. <el-col :span="12" class="text-right">
  20. <el-button plain round @click="$router.go(-1)">返回</el-button>
  21. </el-col>
  22. </el-row>
  23. <div>
  24. <div class="tabs-wrap mb20">
  25. <span class="tabs-item" @click="tabActive = 0" :class="{'bg-primary':tabActive == 0}">院校概况</span>
  26. <span class="tabs-item" @click="tabActive = 1" :class="{'bg-primary':tabActive == 1}">招生简章</span>
  27. <span class="tabs-item" @click="tabActive = 2" :class="{'bg-primary':tabActive == 2}">院校风采</span>
  28. </div>
  29. <div v-if="tabActive == 0">
  30. <el-row class="fx-row">
  31. <el-col :span="8">
  32. <img src="https://i6.youzy.cn/basiclib/college/images/10003-647784f7.jpg" width="100%" alt="">
  33. </el-col>
  34. <el-col :span="16">
  35. <div class="f14 f-666 text-center fx-row">
  36. <el-col :span="24" v-for="item in iconList" v-if="Array.isArray(item.value) ? item.value.length : item.value">
  37. <div v-if="Array.isArray(item.value)">
  38. <img width="50px" :src="item.img" :alt="item.desc">
  39. <el-popover
  40. placement="bottom"
  41. trigger="hover"
  42. >
  43. <div>
  44. <p v-for="i in item.value">
  45. {{i.type}} {{i.number}}个
  46. </p>
  47. </div>
  48. <p class="mt10" slot="reference">
  49. {{ `${item.value[0] ? item.value[0].number : ''} / ${item.value[1] ? item.value[1].number : ''} ` }}
  50. <i class="el-icon-question"></i>
  51. </p>
  52. </el-popover>
  53. </div>
  54. <div v-else>
  55. <img width="50px" :src="item.img" :alt="item.desc">
  56. <p class="mt10">{{ item.value }}</p>
  57. </div>
  58. </el-col>
  59. </div>
  60. <div class="mt10 pl10 f14">
  61. <span class="info-tips"> {{
  62. baseInfo.introduction
  63. }}</span>
  64. <p class="text-right mr10">
  65. <el-button type="text" @click="dialogVisible = true">全部</el-button>
  66. </p>
  67. </div>
  68. </el-col>
  69. </el-row>
  70. <div style="width:70%">
  71. <div class="mt20" v-if="formatProfessions.length">
  72. <p class="format-tit">特色专业</p>
  73. <mx-table border :propDefines="professionsProps" :rows="formatProfessions">
  74. <template #tmp="{row}">
  75. <p class="major-wrap">
  76. <a v-for="item in row.majors" @click="toMajorDetail(item.code)">{{ item.name }}</a>
  77. </p>
  78. </template>
  79. </mx-table>
  80. </div>
  81. <div class="mt20" v-if="Object.keys(subjects).length">
  82. <p class="format-tit">重点学科</p>
  83. <mx-table border :prop-defines="keySubjectProp" :rows="subjects.keySubjects">
  84. <template #tmp="{row}">
  85. <p class="major-wrap">
  86. <span v-for="item in row.subjects">{{ item }}</span>
  87. </p>
  88. </template>
  89. </mx-table>
  90. </div>
  91. <div class="mt20" v-if="Object.keys(activeSyl).length">
  92. <p class="format-tit">双一流学科</p>
  93. <el-select v-model="activeSylId" placeholder="placeholder">
  94. <el-option
  95. v-for="item in subjects.sylSubjectsGroup"
  96. :key="item.id"
  97. :label="item.evaluations"
  98. :value="item.id"
  99. >
  100. </el-option>
  101. </el-select>
  102. <mx-table border class="mt10" :prop-defines="activeSyl.col" :rows="activeSyl.row">
  103. <template #tmp="{row}">
  104. <p class="major-wrap">
  105. <span v-for="item in row.subjects">{{ item }}</span>
  106. </p>
  107. </template>
  108. </mx-table>
  109. </div>
  110. <div class="mt20" v-if="subjectevaluates.length">
  111. <p class="format-tit">学科评估</p>
  112. <el-select v-model="evaluate_type" placeholder="placeholder">
  113. <el-option
  114. v-for="item in evaluateTypes"
  115. :key="item.dictValue"
  116. :label="item.dictLabel"
  117. :value="item.dictValue"
  118. >
  119. </el-option>
  120. </el-select>
  121. <mx-table border class="mt10" :prop-defines="activeEvaluate.col" :rows="activeEvaluate.row">
  122. <template #level="{row}">
  123. <p class="major-wrap" v-if="row.level.length">
  124. <span v-for="item in row.level">{{ item.name }}{{ item.level }}</span>
  125. </p>
  126. <p v-else>
  127. 暂无数据
  128. </p>
  129. </template>
  130. </mx-table>
  131. </div>
  132. <div class="mt20">
  133. <p class="format-tit">院系设置</p>
  134. <mx-table border :propDefines="collegeProps" :rows="departments">
  135. <template #tmp="{row}">
  136. <p class="major-wrap">
  137. <span v-for="item in row.departmentMajor">{{ item.name }}</span>
  138. </p>
  139. </template>
  140. </mx-table>
  141. </div>
  142. </div>
  143. </div>
  144. <!-- 招生简章-->
  145. <keep-alive>
  146. <enroll-list :code="code" v-if="tabActive == 1"></enroll-list>
  147. </keep-alive>
  148. <!-- 院校风采-->
  149. <keep-alive>
  150. <university-style :code="code" v-if="tabActive == 2"></university-style>
  151. </keep-alive>
  152. </div>
  153. <el-dialog
  154. :visible.sync="dialogVisible"
  155. width="70%"
  156. >
  157. <span class="f20 f-666">{{ baseInfo.name }}院校介绍</span>
  158. <div>
  159. {{ baseInfo.introduction }}
  160. </div>
  161. <span slot="footer" class="dialog-footer">
  162. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  163. </span>
  164. </el-dialog>
  165. </div>
  166. </template>
  167. <script>
  168. import EnrollList from './compoents/EnrollList'
  169. import UniversityStyle from './compoents/UniversityStyle'
  170. import { evaluateType, saveUniversitiesHits, selectUniversityDetail } from '@/api/webApi/career-course'
  171. export default {
  172. name: 'UniversityDetail',
  173. components: { EnrollList, UniversityStyle },
  174. data() {
  175. return {
  176. tabActive: 0,
  177. baseInfo: '',
  178. departments: [],
  179. dialogVisible: false,
  180. professions: {},
  181. subjectevaluates: [],
  182. evaluateTypes: [],
  183. evaluate_type: '',
  184. loading:false,
  185. professionsProps: {
  186. level: {
  187. label: '专业层次',
  188. width: '200'
  189. },
  190. count: {
  191. label: '数量',
  192. width: '100'
  193. },
  194. majors: {
  195. label: '专业',
  196. slot: 'tmp',
  197. align: 'left'
  198. }
  199. },
  200. subjects: '',
  201. code: '',
  202. activeSylId: '',
  203. collegeProps: {
  204. name: {
  205. label: '学院',
  206. width: '200'
  207. },
  208. departmentMajor: {
  209. label: '包含专业',
  210. slot: 'tmp',
  211. align: 'left'
  212. }
  213. },
  214. keySubjectProp: {
  215. typeName: {
  216. label: '类别',
  217. width: '100'
  218. },
  219. subjects: {
  220. label: '专业',
  221. slot: 'tmp',
  222. align: 'left'
  223. },
  224. category: {
  225. label: '学科类别',
  226. width: '100'
  227. }
  228. }
  229. }
  230. },
  231. created() {
  232. this.code = this.$route.query.code
  233. this.getHit()
  234. this.getDetail()
  235. this.getEvaluateType()
  236. },
  237. computed: {
  238. formatProfessions() {
  239. const arr = []
  240. for (const key in this.professions) {
  241. console.log(key)
  242. let item = {
  243. level: key == 'country' ? '国家级' : '省级(直辖市)',
  244. count: this.professions[key].length,
  245. majors: this.professions[key]
  246. }
  247. arr.push(item)
  248. }
  249. return arr
  250. },
  251. activeEvaluate() {
  252. const currentRow = this.subjectevaluates.filter(item => {
  253. return item.extTypeId == this.evaluate_type
  254. })
  255. const row = {
  256. count: currentRow.length || '-',
  257. level: currentRow
  258. }
  259. return {
  260. row: [row],
  261. col: {
  262. count: {
  263. label: '数量',
  264. width: '100'
  265. },
  266. level: {
  267. label: ' 专业评级',
  268. align: 'left',
  269. slot: 'level'
  270. }
  271. }
  272. }
  273. },
  274. activeSyl() {
  275. if (!this.subjects.hasOwnProperty('sylSubjectsGroup')) return {}
  276. // const col = this.
  277. const row = this.subjects.sylSubjectsGroup.find(item => {
  278. return item.id == this.activeSylId
  279. })
  280. return {
  281. col: {
  282. subjectCount: {
  283. label: '数量',
  284. width: 100
  285. },
  286. subjects: {
  287. label: '学科',
  288. slot: 'tmp',
  289. align: 'left'
  290. },
  291. typeName: {
  292. label: '类别',
  293. width: '100'
  294. }
  295. },
  296. row: [row]
  297. }
  298. },
  299. iconList() {
  300. const baseInfo = this.baseInfo
  301. return [
  302. {
  303. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  304. value: `${baseInfo.createdYear}年`,
  305. desc: '创办时间'
  306. },
  307. {
  308. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  309. value: baseInfo.natureTypeCN,
  310. desc: '办学类型'
  311. },
  312. {
  313. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  314. value: baseInfo.type,
  315. desc: '院校类型'
  316. },
  317. {
  318. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  319. value: baseInfo.managerType,
  320. desc: '所属部门'
  321. },
  322. {
  323. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  324. value: baseInfo.level,
  325. desc: '学历层次'
  326. },
  327. {
  328. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  329. value: `${baseInfo.location} ${baseInfo.cityName}`,
  330. desc: '所处地'
  331. },
  332. {
  333. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  334. value: baseInfo.pointsOfShuo,
  335. desc: '硕士点',
  336. type: 'arr'
  337. },
  338. {
  339. img: 'https://pv4y-pc.youzy.cn/static/img/icon_shijian@2x.8463f33f.png',
  340. value: baseInfo.pointsOfBo,
  341. desc: '博士点',
  342. type: 'arr'
  343. }
  344. ]
  345. }
  346. },
  347. watch: {},
  348. methods: {
  349. getEvaluateType() {
  350. evaluateType({ code: this.code }).then(res => {
  351. this.evaluateTypes = res.data
  352. this.evaluate_type = res.data[0].dictValue
  353. console.log(res)
  354. })
  355. },
  356. toMajorDetail(code) {
  357. this.$router.push({ path: '/career/plan/MajorDetail', query: { code: code } })
  358. },
  359. getHit() {
  360. saveUniversitiesHits({ code: this.code }).then(res => {
  361. console.log(res)
  362. })
  363. },
  364. getDetail() {
  365. this.loading = true
  366. selectUniversityDetail({ code: this.code }).then(res => {
  367. this.baseInfo = res.data.baseInfo
  368. this.departments = res.data.departments
  369. this.professions = res.data.professions
  370. this.subjects = res.data.subjects
  371. this.subjectevaluates = res.data.subjectevaluates
  372. this.activeSylId = this.subjects.sylSubjectsGroup ? this.subjects.sylSubjectsGroup[0].id : ''
  373. console.log(res)
  374. }).finally(_=>{
  375. this.loading = false
  376. })
  377. }
  378. }
  379. }
  380. </script>
  381. <style lang="scss" scoped>
  382. #universityDetail {
  383. .tabs-wrap {
  384. border-bottom: 1px solid #42b983;
  385. height: 40px;
  386. .tabs-item {
  387. cursor: pointer;
  388. padding: 0 33px;
  389. border-radius: 4px 4px 0 0;
  390. display: inline-block;
  391. line-height: 40px;
  392. &:hover {
  393. color: #47C6A2;
  394. }
  395. &.bg-primary {
  396. background: #47C6A2;
  397. color: white;
  398. }
  399. }
  400. }
  401. .format-tit {
  402. border-left: 4px solid #47C6A2;
  403. padding-left: 10px;
  404. margin-bottom: 20px;
  405. font-size: 20px;
  406. }
  407. .info-tips {
  408. overflow: hidden;
  409. text-overflow: ellipsis;
  410. display: -webkit-box;
  411. -webkit-line-clamp: 4;
  412. -webkit-box-orient: vertical;
  413. word-wrap: break-word;
  414. }
  415. .major-wrap {
  416. text-align: left;
  417. span {
  418. display: inline-block;
  419. margin-right: 20px;
  420. margin-top: 10px;
  421. margin-bottom: 10px;
  422. }
  423. a {
  424. display: inline-block;
  425. margin-right: 20px;
  426. margin-top: 10px;
  427. margin-bottom: 10px;
  428. &:hover {
  429. color: #42b983;
  430. }
  431. }
  432. }
  433. }
  434. </style>