UniversitiesDetail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  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 class="pointer" @click="toWindow(baseInfo.url)" 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="baseInfo.bannerUrl" 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. <a @click="toMajorDetail(item.code)" v-for="item in row.departmentMajor">{{ item.name }}</a>
  138. </p>
  139. </template>
  140. </mx-table>
  141. </div>
  142. <div class="mt20" v-if="employmentreports.length">
  143. <p class="format-tit">就业报告</p>
  144. <div class="list f-333">
  145. <div class="list-item" v-for="item in employmentreports">
  146. <span class="url pointer" @click="toWindow(item.webSite)">{{item.title}}</span>
  147. <span class="url pointer" @click="toWindow(item.url)" v-if="item.url"><i class="el-icon-edit mr5" ></i>在线预览</span>
  148. <span class="pointer" v-if="item.url" @click="toWindow(item.url)">下载附件</span>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. <!-- 招生简章-->
  155. <keep-alive>
  156. <enroll-list :code="code" v-if="tabActive == 1"></enroll-list>
  157. </keep-alive>
  158. <!-- 院校风采-->
  159. <keep-alive>
  160. <university-style :code="code" v-if="tabActive == 2"></university-style>
  161. </keep-alive>
  162. </div>
  163. <el-dialog
  164. :visible.sync="dialogVisible"
  165. width="70%"
  166. >
  167. <span class="f20 f-666">{{ baseInfo.name }}院校介绍</span>
  168. <div>
  169. {{ baseInfo.introduction }}
  170. </div>
  171. <span slot="footer" class="dialog-footer">
  172. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  173. </span>
  174. </el-dialog>
  175. </div>
  176. </template>
  177. <script>
  178. import EnrollList from './compoents/EnrollList'
  179. import UniversityStyle from './compoents/UniversityStyle'
  180. import { evaluateType, selectUniversityDetail } from '@/api/webApi/career-course'
  181. import transferMixin from '@/components/mx-transfer-mixin'
  182. export default {
  183. name: 'UniversityDetail',
  184. mixins: [transferMixin],
  185. components: { EnrollList, UniversityStyle },
  186. data() {
  187. return {
  188. tabActive: 0,
  189. baseInfo: '',
  190. departments: [],
  191. dialogVisible: false,
  192. professions: {},
  193. subjectevaluates: [],
  194. evaluateTypes: [],
  195. evaluate_type: '',
  196. employmentreports:[],
  197. loading:false,
  198. professionsProps: {
  199. level: {
  200. label: '专业层次',
  201. width: '200'
  202. },
  203. count: {
  204. label: '数量',
  205. width: '100'
  206. },
  207. majors: {
  208. label: '专业',
  209. slot: 'tmp',
  210. align: 'left'
  211. }
  212. },
  213. subjects: '',
  214. code: '',
  215. activeSylId: '',
  216. collegeProps: {
  217. name: {
  218. label: '学院',
  219. width: '200'
  220. },
  221. departmentMajor: {
  222. label: '包含专业',
  223. slot: 'tmp',
  224. align: 'left'
  225. }
  226. },
  227. keySubjectProp: {
  228. typeName: {
  229. label: '类别',
  230. width: '100'
  231. },
  232. subjects: {
  233. label: '专业',
  234. slot: 'tmp',
  235. align: 'left'
  236. },
  237. category: {
  238. label: '学科类别',
  239. width: '100'
  240. }
  241. }
  242. }
  243. },
  244. created() {
  245. this.code = this.prevData.code
  246. // this.getHit()
  247. this.getDetail()
  248. this.getEvaluateType()
  249. },
  250. computed: {
  251. formatProfessions() {
  252. const arr = []
  253. for (const key in this.professions) {
  254. console.log(key)
  255. let item = {
  256. level: key == 'country' ? '国家级' : '省级(直辖市)',
  257. count: this.professions[key].length,
  258. majors: this.professions[key]
  259. }
  260. arr.push(item)
  261. }
  262. return arr
  263. },
  264. activeEvaluate() {
  265. const currentRow = this.subjectevaluates.filter(item => {
  266. return item.extTypeId == this.evaluate_type
  267. })
  268. const row = {
  269. count: currentRow.length || '-',
  270. level: currentRow
  271. }
  272. return {
  273. row: [row],
  274. col: {
  275. count: {
  276. label: '数量',
  277. width: '100'
  278. },
  279. level: {
  280. label: ' 专业评级',
  281. align: 'left',
  282. slot: 'level'
  283. }
  284. }
  285. }
  286. },
  287. activeSyl() {
  288. if (!this.subjects.hasOwnProperty('sylSubjectsGroup')) return {}
  289. // const col = this.
  290. const row = this.subjects.sylSubjectsGroup.find(item => {
  291. return item.id == this.activeSylId
  292. })
  293. return {
  294. col: {
  295. subjectCount: {
  296. label: '数量',
  297. width: 100
  298. },
  299. subjects: {
  300. label: '学科',
  301. slot: 'tmp',
  302. align: 'left'
  303. },
  304. typeName: {
  305. label: '类别',
  306. width: '100'
  307. }
  308. },
  309. row: [row]
  310. }
  311. },
  312. iconList() {
  313. const baseInfo = this.baseInfo
  314. return [
  315. {
  316. img: require('@/assets/images/career/year.png'),
  317. value: `${baseInfo.createdYear}年`,
  318. desc: '创办时间'
  319. },
  320. {
  321. img: require('@/assets/images/career/type.png'),
  322. value: baseInfo.natureTypeCN,
  323. desc: '办学类型'
  324. },
  325. {
  326. img: require('@/assets/images/career/xingzhi.png'),
  327. value: baseInfo.type,
  328. desc: '院校类型'
  329. },
  330. {
  331. img: require('@/assets/images/career/bumen.png'),
  332. value: baseInfo.managerType,
  333. desc: '所属部门'
  334. },
  335. {
  336. img: require('@/assets/images/career/xueli.png'),
  337. value: baseInfo.level,
  338. desc: '学历层次'
  339. },
  340. {
  341. img: require('@/assets/images/career/location.png'),
  342. value: `${baseInfo.location} ${baseInfo.cityName}`,
  343. desc: '所处地'
  344. },
  345. {
  346. img: require('@/assets/images/career/shuoshi.png'),
  347. value: baseInfo.pointsOfShuo,
  348. desc: '硕士点',
  349. type: 'arr'
  350. },
  351. {
  352. img: require('@/assets/images/career/boshi.png'),
  353. value: baseInfo.pointsOfBo,
  354. desc: '博士点',
  355. type: 'arr'
  356. }
  357. ]
  358. }
  359. },
  360. watch: {},
  361. methods: {
  362. toWindow(url) {
  363. window.open(url,'_blank')
  364. },
  365. getEvaluateType() {
  366. evaluateType({ code: this.code }).then(res => {
  367. this.evaluateTypes = res.data
  368. this.evaluate_type = res.data[0].dictValue
  369. console.log(res)
  370. })
  371. },
  372. toMajorDetail(code) {
  373. this.$router.push({ path: '/career/plan/MajorDetail', query: { code: code } })
  374. },
  375. // getHit() {
  376. // saveUniversitiesHits({ code: this.code }).then(res => {
  377. // console.log(res)
  378. // })
  379. // },
  380. getDetail() {
  381. this.loading = true
  382. selectUniversityDetail({ code: this.code }).then(res => {
  383. this.baseInfo = res.data.baseInfo
  384. this.departments = res.data.departments
  385. this.professions = res.data.professions
  386. this.subjects = res.data.subjects
  387. this.subjectevaluates = res.data.subjectevaluates
  388. this.employmentreports =res.data.employmentreports
  389. this.activeSylId = this.subjects.sylSubjectsGroup ? this.subjects.sylSubjectsGroup[0].id : ''
  390. console.log(res)
  391. }).finally(_=>{
  392. this.loading = false
  393. })
  394. }
  395. }
  396. }
  397. </script>
  398. <style lang="scss" scoped>
  399. #universityDetail {
  400. .tabs-wrap {
  401. border-bottom: 1px solid #42b983;
  402. height: 40px;
  403. .tabs-item {
  404. cursor: pointer;
  405. padding: 0 33px;
  406. border-radius: 4px 4px 0 0;
  407. display: inline-block;
  408. line-height: 40px;
  409. &:hover {
  410. color: #47C6A2;
  411. }
  412. &.bg-primary {
  413. background: #47C6A2;
  414. color: white;
  415. }
  416. }
  417. }
  418. .format-tit {
  419. border-left: 4px solid #47C6A2;
  420. padding-left: 10px;
  421. margin-bottom: 20px;
  422. font-size: 20px;
  423. }
  424. .info-tips {
  425. overflow: hidden;
  426. text-overflow: ellipsis;
  427. display: -webkit-box;
  428. -webkit-line-clamp: 4;
  429. -webkit-box-orient: vertical;
  430. word-wrap: break-word;
  431. }
  432. .list-item{
  433. display: flex;
  434. justify-content: space-between;
  435. align-items: center;
  436. border-bottom: 1px solid #f2f2f2;
  437. font-size: 14px;
  438. padding-bottom: 10px;
  439. .url:hover{
  440. color: #42b983;
  441. }
  442. }
  443. .major-wrap {
  444. text-align: left;
  445. span {
  446. display: inline-block;
  447. margin-right: 20px;
  448. margin-top: 10px;
  449. margin-bottom: 10px;
  450. }
  451. a {
  452. display: inline-block;
  453. margin-right: 20px;
  454. margin-top: 10px;
  455. margin-bottom: 10px;
  456. &:hover {
  457. color: #42b983;
  458. }
  459. }
  460. }
  461. }
  462. </style>