2025-03-31 10:32:24 +08:00

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()
},
})