397 lines
11 KiB
JavaScript
397 lines
11 KiB
JavaScript
// pages/projectList/projectList.js
|
|
var miucms = require('../../utils/miucms.js');
|
|
const util = require('../../utils/util.js')
|
|
const common = require('../../utils/commonMethod')
|
|
const app = getApp()
|
|
|
|
Page({
|
|
|
|
/**
|
|
* 页面的初始数据
|
|
*/
|
|
data: {
|
|
isFirstPattern: true,
|
|
classify: "school", // school subject
|
|
screenState: false, // 选择框的状态
|
|
universityArr: [],
|
|
isInitFinish: false,
|
|
user: {},
|
|
comOption: {},
|
|
com: {
|
|
jg: "",
|
|
year: "",
|
|
},
|
|
comOnly: 0, // 综合 仅显示香港学校
|
|
comList: [],
|
|
comPage: 1,
|
|
comTotal: 0,
|
|
majOption: {},
|
|
maj: {
|
|
jg: "",
|
|
major: "",
|
|
year: "",
|
|
},
|
|
majOnly: 0, // 专业 仅显示香港学校
|
|
majList: [],
|
|
majPage: 1,
|
|
majTotal: 0,
|
|
|
|
rankingKey: common.rankingKey,
|
|
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面加载
|
|
*/
|
|
rpx219: 0,
|
|
onLoad(options) {
|
|
this.rpx219 = util.rpxTopx(219)
|
|
|
|
miucms.pageStart(app).then(() => {
|
|
const screen_data = app.globalData.screen_data
|
|
this.windowHeight = screen_data.windowHeight || 812
|
|
|
|
common.xgBasicData(this, app).then(data => {
|
|
let universityArr = []
|
|
const university = JSON.parse(JSON.stringify(data.university || {}))
|
|
university.forEach(element => {
|
|
universityArr.push(element.value)
|
|
})
|
|
this.setData({
|
|
universityArr,
|
|
user: app.globalData.user,
|
|
})
|
|
const rankingsObj = Object.fromEntries(Object.entries(data.rankings).map(([key, element]) => [element.name, key]));
|
|
if (options['system']) {
|
|
options.system = this.decodeKey(options.system)
|
|
options.system = rankingsObj[options.system] || options.system
|
|
}
|
|
if (['subject', 'school'].includes(options.type)) {
|
|
const isSubject = options.type === 'subject';
|
|
const targetKey = isSubject ? 'maj' : 'com';
|
|
const source = this.data[targetKey] || (isSubject ? {} : this.data.com);
|
|
let updates = {
|
|
jg: this.decodeKey(isSubject ? options.system : options.mechanism) || '',
|
|
year: `${options.year || ''}`
|
|
};
|
|
if (isSubject) updates.major = this.decodeKey(options.subject);
|
|
this.setData({
|
|
classify: options.type,
|
|
[targetKey]: {
|
|
...source,
|
|
...updates
|
|
}
|
|
});
|
|
}
|
|
this.getRankings()
|
|
})
|
|
})
|
|
},
|
|
|
|
decodeKey(key) {
|
|
if (!key) return key;
|
|
while (key !== decodeURIComponent(key)) {
|
|
key = decodeURIComponent(key);
|
|
}
|
|
return key;
|
|
},
|
|
|
|
compAllList: [],
|
|
// 获取 综合排名 数据
|
|
getSynthesizeData() {
|
|
let com = this.data.com
|
|
wx.showLoading({
|
|
title: '加载中...',
|
|
})
|
|
util.wxget("https://api.gter.net/v1/program/comprehensiverankings", {
|
|
token: com['token'],
|
|
ishongkong: this.data.comOnly || 0,
|
|
limit: 2000,
|
|
}).then(res => {
|
|
if (res.code != 200) return
|
|
let data = res.data
|
|
let list = data.data || []
|
|
const universityArr = this.data.universityArr
|
|
// 遍历去掉非香港院校
|
|
list.forEach(element => {
|
|
if (!universityArr.includes(element.sid)) element.sid = 0
|
|
});
|
|
|
|
this.compAllList = list
|
|
this.setData({
|
|
comTotal: data.count,
|
|
comList: [],
|
|
comPage: 1,
|
|
screenState: false,
|
|
})
|
|
|
|
this.renderComprehensiveList()
|
|
}).finally(() => wx.hideLoading())
|
|
},
|
|
|
|
// 渲染 综合排名 limit: 20
|
|
renderComprehensiveList() {
|
|
const limit = 20
|
|
let page = this.data.comPage
|
|
if (page == 0) return
|
|
const allList = this.compAllList
|
|
const target = allList.slice((page - 1) * limit, page * limit)
|
|
this.setData({
|
|
comPage: target.length < limit ? 0 : page + 1,
|
|
comList: this.data.comList.concat(target),
|
|
})
|
|
},
|
|
|
|
majAllList: [],
|
|
// 获取 专业排名 数据
|
|
getMajorData() {
|
|
wx.showLoading({
|
|
title: '加载中...',
|
|
})
|
|
let maj = this.data.maj
|
|
util.wxget("https://api.gter.net/v1/program/disciplinerankings", {
|
|
token: maj['token'],
|
|
ishongkong: this.data.majOnly || 0,
|
|
}).then(res => {
|
|
if (res.code != 200) return
|
|
let data = res.data
|
|
let list = data.data || []
|
|
|
|
this.majAllList = list
|
|
this.setData({
|
|
majTotal: data.count,
|
|
majList: [],
|
|
majPage: 1,
|
|
screenState: false,
|
|
})
|
|
this.renderDisciplineList()
|
|
}).finally(() => wx.hideLoading())
|
|
},
|
|
|
|
// 渲染 专业排名 limit: 20
|
|
renderDisciplineList() {
|
|
const limit = 20
|
|
let page = this.data.majPage
|
|
if (page == 0) return
|
|
|
|
const allList = this.majAllList
|
|
const target = allList.slice((page - 1) * limit, page * limit)
|
|
|
|
this.setData({
|
|
majList: this.data.majList.concat(target),
|
|
majPage: target.length < limit ? 0 : page + 1,
|
|
})
|
|
},
|
|
|
|
// 获取 配置信息
|
|
getRankings() {
|
|
wx.showLoading({
|
|
title: '加载中...',
|
|
})
|
|
util.wxget("https://api.gter.net/v1/program/rankings", {}).then(res => {
|
|
if (res.code != 200) return
|
|
const data = res.data
|
|
|
|
const comprehensive = data.comprehensive
|
|
let com = this.data.com
|
|
|
|
let organizationSet = [...this.objectOne(comprehensive)]
|
|
if (!com['jg']) com['jg'] = organizationSet[0]
|
|
|
|
let yearsSet = [...this.collectYears(comprehensive)].sort((a, b) => b - a);
|
|
if (!com['year']) com['year'] = yearsSet[0]
|
|
com['token'] = comprehensive[com.jg]?.[com.year] || ""
|
|
|
|
const discipline = data.discipline
|
|
let maj = this.data.maj
|
|
const [dOrganizationKey, dOrganizationValue] = Object.entries(discipline)[0]
|
|
if (!maj['jg']) maj['jg'] = dOrganizationKey
|
|
if (!maj['major']) maj['major'] = Object.entries(dOrganizationValue)[0][0]
|
|
|
|
const dYear = [...this.collectYears(discipline)].sort((a, b) => b - a);
|
|
|
|
if (!maj['year']) maj['year'] = dYear[0]
|
|
maj['token'] = discipline[maj.jg]?.[maj.major]?.[maj.year] || ""
|
|
|
|
this.setData({
|
|
comOption: comprehensive,
|
|
com,
|
|
majOption: discipline,
|
|
maj,
|
|
isInitFinish: true,
|
|
})
|
|
|
|
if (this.data.classify == 'school') this.getSynthesizeData()
|
|
else this.getMajorData()
|
|
|
|
if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
|
|
|
|
}).finally(() => wx.hideLoading())
|
|
},
|
|
|
|
// 计算出对象所有 一级 key
|
|
objectOne(obj) {
|
|
let arr = []
|
|
for (const key in obj) {
|
|
arr.push(key)
|
|
}
|
|
return arr
|
|
},
|
|
|
|
// 计算出 对象 所有 二级 key 不重复
|
|
collectYears(obj, arr = new Set()) {
|
|
for (let key in obj) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
if (!isNaN(key) && key.length === 4) arr.add(key);
|
|
const value = obj[key];
|
|
if (typeof value === 'object' && value !== null) this.collectYears(value, arr);
|
|
}
|
|
}
|
|
return [...arr];
|
|
},
|
|
|
|
// 切换查看类型
|
|
cutClassify(e) {
|
|
const classify = e.currentTarget.dataset.type
|
|
if (classify == this.data.classify) return
|
|
// 切换 专业排名时 判断 是否需要 显示选择
|
|
if (classify == 'subject' && this.data.majList.length == 0) this.getMajorData()
|
|
if (classify == 'school' && this.data.comList.length == 0) this.getSynthesizeData()
|
|
this.setData({
|
|
classify,
|
|
})
|
|
},
|
|
|
|
indexSidebar: null,
|
|
windowHeight: 812,
|
|
onPageScroll(e) {
|
|
const scrollTop = e.scrollTop
|
|
|
|
let isFirstPattern = true
|
|
if (scrollTop > this.rpx219) isFirstPattern = false
|
|
|
|
if (this.data.isFirstPattern != isFirstPattern) {
|
|
this.setData({
|
|
isFirstPattern
|
|
})
|
|
}
|
|
|
|
let sidebarState = this.indexSidebar.data.sidebarState
|
|
if (scrollTop > this.windowHeight * 3 && sidebarState !== 3) sidebarState = 3
|
|
|
|
if (scrollTop < this.windowHeight * 3 && sidebarState == 3) sidebarState = 2
|
|
|
|
// 同一搜集 修改的 sidebarState
|
|
if (sidebarState !== this.indexSidebar.data.sidebarState) {
|
|
this.indexSidebar.setData({
|
|
sidebarState
|
|
})
|
|
}
|
|
|
|
this.indexSidebar.openSidebarTwoHide()
|
|
},
|
|
|
|
// 切换仅显示香港
|
|
cutOnlyXg() {
|
|
const classify = this.data.classify
|
|
if (classify == 'school') {
|
|
this.setData({
|
|
comList: [],
|
|
comOnly: this.data.comOnly == 1 ? 0 : 1,
|
|
})
|
|
this.getSynthesizeData()
|
|
} else {
|
|
this.setData({
|
|
majOnly: this.data.majOnly == 1 ? 0 : 1,
|
|
majList: [],
|
|
})
|
|
this.getMajorData()
|
|
}
|
|
},
|
|
|
|
// 跳转学校主页
|
|
goSchoolHomepage(e) {
|
|
const sid = e.currentTarget.dataset.sid
|
|
wx.navigateTo({
|
|
url: '/pages/projectSchoolHomepage/projectSchoolHomepage?id=' + sid,
|
|
})
|
|
},
|
|
|
|
// 点击
|
|
cutScreenState() {
|
|
this.setData({
|
|
screenState: !this.data.screenState,
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面初次渲染完成
|
|
*/
|
|
onReady() {
|
|
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面显示
|
|
*/
|
|
onShow() {
|
|
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面隐藏
|
|
*/
|
|
onHide() {
|
|
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面卸载
|
|
*/
|
|
onUnload() {
|
|
|
|
},
|
|
|
|
/**
|
|
* 页面相关事件处理函数--监听用户下拉动作
|
|
*/
|
|
onPullDownRefresh() {
|
|
wx.stopPullDownRefresh()
|
|
},
|
|
|
|
/**
|
|
* 页面上拉触底事件的处理函数
|
|
*/
|
|
onReachBottom() {
|
|
if (this.data.classify == 'school') this.renderComprehensiveList()
|
|
if (this.data.classify == 'subject') this.renderDisciplineList()
|
|
},
|
|
|
|
/**
|
|
* 用户点击右上角分享
|
|
*/
|
|
onShareAppMessage() {
|
|
return {
|
|
title: "【寄托港校项目库】- 榜单",
|
|
}
|
|
},
|
|
onShareTimeline() {
|
|
return {
|
|
title: "【寄托港校项目库】- 榜单",
|
|
}
|
|
},
|
|
|
|
// 点击 筛选的选好了
|
|
haveChosen(e) {
|
|
const detail = e.detail || {}
|
|
const classify = this.data.classify
|
|
|
|
this.setData({
|
|
[classify == "school" ? 'com' : 'maj']: detail,
|
|
screenState: false,
|
|
})
|
|
|
|
if (classify == "school") this.getSynthesizeData()
|
|
else this.getMajorData()
|
|
},
|
|
}) |