no message

This commit is contained in:
A1300399510 2024-12-12 12:14:09 +08:00
commit eedce9ecb6
124 changed files with 27400 additions and 0 deletions

31
.eslintrc.js Normal file
View File

@ -0,0 +1,31 @@
/*
* Eslint config file
* Documentation: https://eslint.org/docs/user-guide/configuring/
* Install the Eslint extension before using this feature.
*/
module.exports = {
env: {
es6: true,
browser: true,
node: true,
},
ecmaFeatures: {
modules: true,
},
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
},
globals: {
wx: true,
App: true,
Page: true,
getCurrentPages: true,
getApp: true,
Component: true,
requirePlugin: true,
requireMiniProgram: true,
},
// extends: 'eslint:recommended',
rules: {},
}

317
app.js Normal file
View File

@ -0,0 +1,317 @@
//app.js
var miucms = require('./utils/miucms.js');
// var script = require('./utils/script');
// console.log(script());
var initial_url = 'https://api.gter.net/xiaoapp_offer.init.json';
var __ = require('./utils/miucms.js');
import util from './utils/util'
// 保存原始的Page构造器
const originPage = Page;
// 重写Page构造器
Page = function (pageConfig) {
// 添加全局的onShow逻辑
const originOnLoad = pageConfig.onLoad;
pageConfig.onLoad = function () {
util.statistics({})
if (originOnLoad) originOnLoad.apply(this, arguments);
};
const originOnShare = pageConfig.onShareAppMessage;
if (originOnShare) {
pageConfig.onShareAppMessage = function (e) {
util.statistics({
name: "share"
})
return originOnShare.apply(this, [e]);
};
}
// 调用原始的Page函数
return originPage(pageConfig);
};
App({
randomString(n) {
let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
let tmp = '',
i = 0,
l = str.length;
for (i = 0; i < n; i++) {
tmp += str.charAt(Math.floor(Math.random() * l));
}
return tmp;
},
onLaunch: function (options) {
util.statistics({
data: {
scene: options.scene
},
path: options.path,
query: options.query,
name: "onLaunch"
})
const accountInfo = wx.getAccountInfoSync();
const envVersion = accountInfo.miniProgram.envVersion;
this.globalData['envVersion'] = envVersion
this.globalData.options = options;
if (wx.getUserProfile) {
this.globalData.canIUseGetUserProfile = true;
}
var Authorization = wx.getStorageSync('Authorization');
if (!Authorization) {
Authorization = this.randomString(32);
wx.setStorageSync('Authorization', Authorization)
wx.setStorageSync('session', Authorization)
}
try {
var systemInfo = wx.getSystemInfoSync();
this.computeNavigateBarHeight(systemInfo);
} catch (e) {
// 获取系统信息失败
this.globalData.screen_data = {
windowHeight: 812,
totalTopHeight: 68,
statusBarHeight: 20,
titleBarHeight: 48,
title: '',
index: false
}
}
__.initial(this)
},
computeNavigateBarHeight: function () {
var systemInfo = wx.getSystemInfoSync();
if (wx.getSystemInfoSync) {
var data = wx.getMenuButtonBoundingClientRect()
let totalTopHeight = data.bottom;
let windowHeight = systemInfo.windowHeight,
statusBarHeight = data.top,
windowWidth = systemInfo.windowWidth
let platform = systemInfo.platform
this.globalData.platform = platform
if (platform == 'windows' || platform == 'mac') this.globalData.isPC = true
this.globalData.screen_data = {
windowHeight: windowHeight,
windowWidth,
totalTopHeight: totalTopHeight + 6,
statusBarHeight: statusBarHeight,
titleBarHeight: data.height,
titleWidth: data.widthinitial,
bottomLift: systemInfo.screenHeight - systemInfo.safeArea.bottom,
isIos: systemInfo.platform === 'ios' ? true : false,
}
} else {
// 兼容低版本
this.globalData.screen_data = {
windowHeight: systemInfo.windowHeight,
totalTopHeight: systemInfo.statusBarHeight + 48,
statusBarHeight: systemInfo.statusBarHeight,
titleBarHeight: 48,
title: '',
index: false
}
}
},
onShow: function (options) {
// 检查小程序更新问题
/* 版本自动更新代码开始 */
const updateManager = wx.getUpdateManager()
updateManager.onCheckForUpdate(function (res) {
// console.log("新版本信息的回调", res.hasUpdate) // 请求完新版本信息的回调 true说明有更新
})
updateManager.onUpdateReady(function () {
wx.showModal({
title: '更新检测', // 此处可自定义提示标题
content: '检测到新版本,是否重启小程序?', // 此处可自定义提示消息内容
success: function (res) {
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate()
}
}
})
})
updateManager.onUpdateFailed(function () {
// 新的版本下载失败
wx.showModal({
title: '更新提示',
content: '新版本下载失败',
showCancel: false
})
})
/* 版本自动更新代码结束 */
this.globalData.scene = options.scene
this.globalData.options = options;
__.request('https://offer.gter.net/miniprogram/share/overall').then(res => {
if (res.data) {
this.globalData.shareConfig = res.data;
}
}).catch(res => {})
// 判断socket从后台打开 并且已经断开链接了,需要重启
if (this.globalData.isHideState && this.globalData.socketTask && this.globalData.socketTask['readyState'] != 1) {
miucms.useSocket()
}
this.globalData.isHideState = false
},
onHide: function () {
this.globalData.isHideState = true
},
onError: function () {
// 这里回调错误信息
// console.log('onError')
},
// get: function () {
// return this.globalData.config;
// },
return_data: function (res) {
var json = res.data;
if (typeof json != 'object') {
if (json != null) {
json = json.replace("\ufeff", "");
var jj = JSON.parse(json);
res.data = jj;
}
}
var data = res.data;
return data;
},
// 判断微信提醒弹窗请求
judgeWechatAlertsPop() {
return new Promise((resolve, reject) => {
util.wxpost("/miniprogram/user/getPopup").then(res => {
// res.data.iswechatmessagepush = 0
let iswechatmessagepush = res.data.iswechatmessagepush
this.globalData.iswechatmessagepush = iswechatmessagepush
resolve(res.data)
}).finally(() => {
this.globalData.iswechatmessagepushState = false
})
})
},
watch: function (method) {
var obj = this.globalData;
let setSate = obj['setSate']
Object.defineProperty(this.globalData, "setSate", { //这里的 globalData对应 上面 globalData
configurable: true,
enumerable: true,
set: function (value) { //动态赋值,传递对象,为 globalData 中对应变量赋值
setSate = value
method(value);
},
get: function () { //获取全局变量值,直接返回全部
return setSate;
}
})
},
globalData: {
setSate: false,
baseURL: "https://offer.gter.net",
token: null,
title: null,
session: null,
code: null,
user: {},
userInfo: {},
options: {},
config: {
follow: {
init: "https://offer.gter.net/miniprogram/follow/init",
lists: "https://offer.gter.net/miniprogram/follow/lists",
professionSearch: "https://offer.gter.net/miniprogram/follow/professionSearch",
schoolSearch: "https://offer.gter.net/miniprogram/follow/schoolSearch",
},
interviewExperience: {
details: "https://offer.gter.net/miniprogram/interviewExperience/details",
lists: "https://offer.gter.net/miniprogram/interviewExperience/lists"
},
offer: {
details: "https://offer.gter.net/miniprogram/offer/details",
lists: "https://offer.gter.net/miniprogram/offer/lists"
},
thread: {
lists: "https://offer.gter.net/miniprogram/thread/lists",
reply: "https://offer.gter.net/miniprogram/thread/reply"
},
vote: {
commentList: "https://offer.gter.net/miniprogram/vote/commentList",
commentPost: "https://offer.gter.net/miniprogram/vote/commentPost",
create: "https://offer.gter.net/miniprogram/vote/create",
delete: "https://offer.gter.net/miniprogram/vote/delete",
details: "https://offer.gter.net/miniprogram/vote/details",
lists: "https://offer.gter.net/miniprogram/vote/lists",
operation: "https://offer.gter.net/miniprogram/vote/operation",
unvote: "https://offer.gter.net/miniprogram/vote/unvote"
}
},
source: '',
header: {
'content-type': 'application/json',
'Accept': 'application/json, text/plain',
'Cookie': '_miucms_session_gter=' + wx.getStorageSync('_miucms_session')
},
new_reply: false,
// 寄托租房独有字段
choose: {},
kw: '',
status: 0,
screen_data: {},
canGetData: false, //是否可以开始获取数据
StudentapartmentNew: null,
isUserAuthorization: 0, //用户点击授权:0未知1未授权2已授权
follow_data: {},
ischangeFollow: false, //是否有更新关注列表
shareConfig: {},
canIUseGetUserProfile: false,
// 优惠券的隐藏与否
iscoupon: false,
isgetinit: false,
mysquareAsk: {},
favUpdateList: [],
isPC: false,
platform: {},
initializeLoginState: false, // 初始化登录状态
iswechatmessagepush: null,
iswechatmessagepushState: -1,
socketTask: null, // 全局的 socket 值
isHideState: true, // 判断是否 隐藏了 在 onshow 为 true 是代表小程序后台打开
messageData: [], // 全局的私信信息
messageSendData: [], // 全局的 发送新消息的返回
unreadMessageCount: 0, // 未读消息数量
onMessage: res => {
// console.log("res拿到的信息", res);
},
postList: [], // 一级页面的 发布 列表
navigation: [], // 一级页面的 导航栏 列表
voteAmend: {}, // 新投票列表的详情和列表交互数据
signInState: 0, // 签到状态
getSignInState: false, // 获取完签到状态
popup: undefined, // 全局弹窗数据 undefined 是还没获取到 null 是没有弹窗 {} 是数据
offerkaipingadvertisement: {}, // 开屏广告 数据
offerkaipingadvertisementState: false, // 开屏广告 状态
}
})

26
app.json Normal file
View File

@ -0,0 +1,26 @@
{
"entryPagePath": "pages/projectLibrary/projectLibrary",
"pages": [
"pages/index/index",
"pages/logs/logs",
"pages/projectLibrary/projectLibrary",
"pages/projectSchoolHomepage/projectSchoolHomepage",
"pages/projectSubjectList/projectSubjectList",
"pages/projectComparison/projectComparison",
"pages/projectList/projectList",
"pages/projectMy/projectMy",
"pages/projectDetails/projectDetails",
"pages/search/search",
"pages/webview/webview"
],
"window": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "项目库",
"navigationBarBackgroundColor": "#ffffff",
"navigationStyle": "custom"
},
"style": "v2",
"componentFramework": "glass-easel",
"sitemapLocation": "sitemap.json",
"lazyCodeLoading": "requiredComponents"
}

95
app.wxss Normal file
View File

@ -0,0 +1,95 @@
/**app.wxss**/
.container {
height: 100%;
box-sizing: border-box;
font-size: 14px;
color: #383734;
padding-bottom: 70px;
}
.item-bottom-item {
margin-left: 24rpx;
font-size: 18rpx;
color: #aaa;
line-height: 36rpx;
}
.item-bottom-icon {
width: 22rpx;
height: 22rpx;
margin-right: 7.5rpx;
}
.empty {
height: 100%;
background-color: #fff;
color: #7F7F7F;
font-size: 23rpx;
margin: 36rpx 0rpx 0;
border-radius: 30rpx;
}
.empty .dot {
width: 12rpx;
height: 12rpx;
}
.empty .dot:not(:last-of-type) {
margin-right: 8rpx;
}
.empty .empty-icom {
width: 153rpx;
height: 180rpx;
margin-top: 12rpx;
margin-bottom: 30rpx;
}
/* 公共的 css 样式 */
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.flexcolumn {
display: flex;
flex-direction: column;
}
/* 文字一行显示 */
.one-line-display {
word-break: keep-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 字体 Arial-Black 只有0到9 */
@font-face {
font-family: 'Arial';
src: url('data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAAZgAA0AAAAADaAAAAYJAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCUhEICokAhzkLIgABNgIkAz4EIAWKHAdQG9ALyB6DbXspPUlSlJMzOcfLINz0PiEUs040E3cqnlJRCLaNig/SuTsyE+F5/q925/1pQFJZNksgko4vG2BxJw2oHaSAi8t/0YLr92v19p/GQ6brItMZOp1SoJQn53vnCRWJ4qXQRSyRvDRKppGaNXpksc4e5EEpZrzAOwEgAPhW1JEAwJWbizn7sQlAASgDoBCEGiECUABR/YRMAQPMjmkBYBjaj5xgj07CUHKZiCKUnUAEUDMN8JCIcWQUWKzdzD6yjdSQXKI8LLD4fgCoMYsAaJ4qVYKAcCJKkEjTy0lIUABWO7v/A7CaZt3/P+aVgHCrSAMQKz3AML34ZAjQikQtcdDLEP9AoCSpZJK/iVZrgI2vB9IHqDaJeIWyLvJMggqIVvaHqNYr5VWayOkalRWqKgoFejsREfRuj1aqyRj+XDne5/PF+zDsiWKc3+S/xQ/zyccHAmS4XzbOK7gVQV4vRwcCCXpd4DbfThnq5SyZLyAfyoshVonXG60WaumP5RPlgK9dK5u3lzK/38T7gOQA6VzKzlxCXkJFC0qxnJJRCoa2ClpKxUGVPcWQGw+G6S3VNe6JtgiZ/sHd3l7EqDMe3aJpnzVgiA80VU95hX28iYrbt1NUgr+7nwxNMAwTH2ZwRzimpMT4mQHHMCNTC0rBzIZwJPRleyYKcukPb1IzJ+AXOhN63VdQUgqAATA6Y8/uPybiPssaRrSccdBYUthziCG+7vJtk5V5oXsfFxnzWka3Lzd9TTnLhfTOyab6+0/XtJzhbUkX0Pl3HcxzwVU+bF/ahPqRl7s/3d91LP6cMuzwdq55Y9sIfmznHpb0sEiLWSPMZsuuH3zkhf1S4J15zLlBoxZ8vjTVw8X2KC5F5a9uSM8muzXHf1X97zvDMdfZjjOcNzaMnmYfMvLV70EXzzxLm7GjzphZrcp6rOmRsa4Sq92Zk9w0rqyhukEf3c/Wu0dUVG9jkgnNKt2zqMZ8Pj9yT8c9Oj7y4ugLUC/3ne41ufrtHlVHVO12Rys9N2kCQ409N/VS6ymupLGV7fMbqixZ9vD47CFDhue40zq4RoiTmyHymzujmZoL7dWGb83X6aN7bQyZ29t2QlU2MHXM+0+e3XekMxcZ1RMjcutuPhc9cn7D7XRJyaiE6P5ud2nO0Lj4/IFgjvtW6ueNdywbeNL4qd0BPZnVxH7x6T2DF4a5IaP5oQ7xuXs2FI5Kule73P11fJv4xUkditsW7s/Pth6a5rjVtPTl16zBvhFDS7a1iA5PT43qnZQSEp6WHhKamhp8xFzkCQ8pKM00FwoR4bklsHVmNFdzYb3aWFpb6hj1r42hc3vZTqrK+qeNff+RUtUstUo5qyyPbYrp5/YI2QZT3kev81y7fc52AAAIgALne9W8DHXHrxK5BFvs++P/8xow10FIUACAgOTydxSIAf+ELvOAEELVDXzUXot7AJgJOFgNrcEI9aEHmCAFOFuf/gLUQPC7Ahqt0QCAItZEGyAvlK1ximDmTuIqkJCnPVKCYkJalSxAEXmuI0ORnygmL1VODsKXTwpSSwEyBRASZVIdKar0RlrHpKNImexHRrncR7EyRbxRkFN0ffTUlyOAwrgeNlZskFnhVixejlxu+X2AMy6L42TbOkKObDkKueU2oEd6vtyIzGCi606sZtppp5lG2ftbaYzVjYsLCxtWgJXPTbBRMSOyL9m9rZnLJrD6mpIxKiTBhHCbLOb13x8rh5291BLOwshzSqDGbiwLGzPkIEiFLAlZMADZxDcyC5llYz9Fsj+yApmhuZDZGH6ZMK+vx2a9RmE9k2nDOW1sRE52zoVaz4sacTHgaPQ4cPNpMO/TXfCXY7Zu1mqzaw3726097lBdJJtjB5OXZj3eg9PjMU7mGzm97y4ZiRm/Nas7FzNefyArv7YgHYidPVTUJTMfHhI5Hmb9YhphwcZkAazUz2zEYnKzIx48VWDKzlcwj1ObaxxkNoVbVWuaN27edDSJN9I0+hWsgF9/dQlQ3BT/jSL4vBogAYWmZxCsjLLKKa+CiipVNEjjcLlznc3EnxbjzykEAAAA') format('woff2'),
url('data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAkgAA0AAAAADaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAJBAAAABoAAAAcd1dlsUdERUYAAAjoAAAAHAAAAB4AJwAWT1MvMgAAAaQAAABUAAAAYHFijQxjbWFwAAACLAAAAFkAAAFSEG0f1Gdhc3AAAAjgAAAACAAAAAj//wADZ2x5ZgAAAqwAAAPyAAAEgIog5d9oZWFkAAABMAAAADIAAAA2Bf+JX2hoZWEAAAFkAAAAIAAAACQN/AIRaG10eAAAAfgAAAAxAAAAPkNcBa9sb2NhAAACiAAAACIAAAAiCLgHuG1heHAAAAGEAAAAIAAAACACJQBnbmFtZQAABqAAAAH6AAAFHLRG6/Zwb3N0AAAInAAAAEIAAABQAfpVn3jaY2BkYGBgYmCoeLggKp7f5isDNwcDCFy4OT8EQf9/zqrNepmBkYEDpJaBAQBXDgw6AAB42mNgZGDgOPe3jYGBjYGB4V81qzYDUAQF8AMAa0kEGgABAAAAEAA2AAMAAAAAAAIABgAvADcAAAHUAAAAAAAAeNpjYGF5wjiBgZWBgXUWqzEDA0MThGbczpDGJMTBysTNxcLEyMTExMLAwNQuwIAAvv5+/gwKQLiddRfjJkZljnNMVQoMDPPvX4crUWBgBABqBw1heNpjY4AAplVAvJqBgTWMIQSIlwOxGRB7ALEWEDsDcRgQR0Pl3ZlWM9UyMAAA/tsJTAAAAHjaY2BgYGaAYBkGRgYQ8AHyGMF8FgYDIM0BhExAWoHBkmH7//9glgGI9f/x/yv/w6G6wICRjQHOZQTpYWJABYwQq5ABCysbOwcnFzcPL8PQAHz4pQGSugxpAAAAAAAAFAAUABQAFABMAGYAmADgAQABOgF+AZ4B7gIyAkACQAAAeNpVk31MU1cYxs97722bmAi9/UAwglygWMQS6Nd1aIoGrVyplQ5akjKocvmoY2LBoR0tCNvE0IgLfszEYUzczMKyxUTiYMo2l7C5YdAtZrhlZC7ZApq54XQhGbaHnXszN3dz/zjnj/O8z/N73xdRiHwMUiBEIxVCRSzHGjiWY1A8k74W36RAT1Amcw0hClUtzSkoxW2kQasR0qoRZ86gVqToySErd00uZVCnWMwOsKlzs7OUVWAC68lPwlv1efgR/vCjXwTbBjgp1jlq8kWx0U/9DOfBLXT0+t65hNvwsQPtHkgbxvemqsevQ85XU8QSoHeJpXlSbxm5EFdJoGIdwNPzuKHh6sDXs5sVtxdN9Deuunxwl47HkPzGTrLEyZt0hPLArjEQP1bJj8rgoCzmDNDrlCoixDHxJ8X6b8Ew0iCWu0UWB1N77t+8M99/9lakcj0VvQwl3x+OOUoD9VHu/c+a62909/153LuFl2uUEQ40qVFALgZ7jiWTkVRTVkjqSZCdVQBrDBlgMdvl0iptytOjEu7iQ4XALsJqQME9XpPg6YtPfTl3yginUxvdz+/d4y+s0mdpK1oqnGV+RrN1bGL6fOBMsX6V6URTz6+H6i732yOBcENTKBWyFU3O0opqqS9rEVLky5yWE0ccS34Lm81yaQC0OrGSmgVxbAyfxWHQwE66PR7BE/h3yg1T2CLnKSV5lIorKIt0lXRe5SDekV5HMSQK9b8oBONf9PVEW/aWw5tnQDOAE5ODtwb9GTCU3Ory7gvVbuDzivAFxRV8dSYzEy9MHsOLMX5vrNkkNvf2vNaZrufNUp8o5CM1k4jnVchILCgKQFb/p7IEMYdi5QkD0P3Hj5nHLepyXuSNWuFM4wQk9z8encEL58ANxos3+hK2cHXFS6FK734mZPY6G8oebN+G790ZfBh5EwRIhgFo8wzFEwePdL4SfbVbzl5D2CGSfbmcXUk8KGluJWi5GubCW8FuoViHXyy8eTexjmT67ejbXzz+GGNohlnQSznof3ciHeUhGxEki2Cz8nZ5JoiYPBKUNBI2q/3ZJPQzZxB2rdv4wZEfIRfS1q/1H+xoPPFD9P5CTxisgZ1Of52wvTblgEt4uWOHq43WWUp8obEO/0/vib5NG58bb2/9NFjUOv167wh4XLUvCK5AbaJkd6Rr1+5omHDetjTHLD3lrJV7ydt5CTCyWSXcjEbiTAyC7EUv+2qCU2oXX88bdQTz5/iP2KPRGVh2Dl/C312c7KMmwz5Py75KXzsIFq9TFB6UOyF1+vjDyGk8SrZ9P37DM0TTBHNnRMaMgOqiWKaQHibEpAnlqC4YwTvoYRz8G/rMVH8AAHja3VK9btswED5Rjo0iRdEp6BQcOhaQERvI4KJLftAtSxFkLMBIjERbtgSSTqA8Sx8gU7dO3fMCfYC+Q7ds+UizrtugQJEhQyWQ993x48fjHYnoJd1SQqvvS1JHnNC2eBuxoIE4izilXfEp4h443yLeoufiLuI+bae7EQ8oT39gV9J7BtFpUPA4oR3xOmJBL8T7iFN6Jz5G3APna8Rb9Ep8j7hPO2k/4gHdpm/omDSVGA7jmhQVxBgSvgTKqaGWOjKBVSHKdAqrYE+wtsBwWG9D5AieAfazDIqewTSiCf4RZRHt0xDRA6rx84a2DZ6CVbCXIZsV03Mk2J/h6cDz2blwTgHeHNbQDLGGLh6V4xV2aNy3AvZqHex52OEzKsOpLuS1qpEOu/IQ8bVa+VNahlwtOF7tp77FPehYl9rpa1VwIZ3kvGk7o8vK8Wml+KRZNK5rFR81pm2MdLpZ8GgyGWWY9od8UNcc2JaNsspcqgJBo2V9w9qyZGdkoebSzLi5+LviVaXziuey43MFoVJbpwwy0gvOlXESdro02hY693yLtH9Vn+kQs8S9Zgj7s/mwljmcD6FGy7Bq4KpyWUuAh/XPfuvnpiL/qbK+QMYbh/Fa/F8SOwsNsus2j9GIMe1hQRnrCzIejvc2pbIHUlmU+k9e4VO8mXtMfhL+AAB42mNgYgCDf20M1QzYgAADAyMTAxMDM4MwgwiDKIMYgziDBIMkgxSDNIMMIzMDI1t6TmVBhiFbbmZKSn4JAM6AB+wAAAAAAAH//wACeNpjYGRgYOABYjEgZmJgBEJ+IGYB8xgABEMAPnjaY2BgYGQAgqtL1DlA9IWb80NgNABD5QbiAAA=') format('woff'),
url('Arial-Black.ttf') format('truetype');
font-weight: 900;
font-style: normal;
font-display: swap;
}

103
common/common.js Normal file
View File

@ -0,0 +1,103 @@
function phonecall(e) {
let phone = e.currentTarget.dataset.tel;
wx.makePhoneCall({
phoneNumber: phone
})
}
function pay(that){
wx.requestPayment({
'timeStamp': that.data.pay_info.result.timestamp,
'nonceStr': that.data.pay_info.result.noncestr,
'package': that.data.pay_info.result.package,
'signType': that.data.pay_info.result.signtype,
'paySign': that.data.pay_info.result.sign,
'success': function (res) {
// 支付成功
that.data.wish_box.show_reminder = true;
that.setData({
wish_box: that.data.wish_box
})
setTimeout(function () {
that.data.wish_box.show_reminder = false;
that.setData({
wish_box: that.data.wish_box
})
wx.navigateTo({
url: '../make_a_wish/index?uniqid=' + that.data.wish_box.uniqid + '&token=' + that.data.wish_box.token
})
}, 2000)
},
'fail': function (res) {
}
})
}
function get_wish_status(that, config,app,source,sourceid) {
wx.request({
url: config.wish.init,
data: {
session: wx.getStorageSync('session'),
source: source,
sourceid: sourceid
},
method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: app.globalData.header,
success: function (res) {
var data = app.return_data(res);
// istype = 1 and status = 1 已支付 直接走提交步骤
// istype = 0 and status = 1 赠送的,无需支付 直接走提交步骤
// status = 0 调用支付 pay_info 支付参数,支付成功后 直接走提交步骤
if (data.istype == 0 && data.status == 1) {
that.data.wish_box.box = 'free';
} else if (data.istype == 1 && data.status == 0) {
that.data.wish_box.box = 'charge';
that.data.pay_info = data.pay_info;
} else if (data.istype == 1 && data.status == 1) {
that.data.wish_box.box = 'paid';
}
that.data.wish_box.istype = data.istype;
that.data.wish_box.money = data.money;
that.data.wish_box.status = data.status;
that.data.wish_box.token = data.token;
that.data.wish_box.uniqid = data.uniqid;
that.setData({
wish_box: that.data.wish_box
})
if (that.data.wish_box.box == 'paid') {
// 已经支付过了,直接跳走
wx.navigateTo({
url: '../make_a_wish/index?uniqid=' + that.data.wish_box.uniqid + '&token=' + that.data.wish_box.token
})
}
that.data.wish_box.show = true;
that.setData({
wish_box: that.data.wish_box
})
},
fail: function (res) {
},
complete: function () {
}
})
}
function to_wish(that){
that.get_wish_status
}
function close_wish_box(that){
that.data.wish_box.show = false;
that.setData({
wish_box: that.data.wish_box
})
}
module.exports = {
phonecall: phonecall,
pay:pay,
to_wish: to_wish,
get_wish_status: get_wish_status,
close_wish_box: close_wish_box
}

1303
common/common.less Normal file

File diff suppressed because it is too large Load Diff

691
common/common.wxml Normal file
View File

@ -0,0 +1,691 @@
<wxs module="filter" src="/utils/time.wxs"></wxs>
<!--内容列表 -->
<template name="project_hot_list">
<view>
<view class='hot-list' wx:for="{{ list }}" wx:key="index">
<view class='l'>
<view class='name'>{{ item.name }}</view>
<view class='num'>{{ item.offer_num }}个Offer</view>
</view>
<view class='r'>
<form class='submit-form' report-submit='true' data-index="{{ index }}" data-types="project" data-obj="{{ item }}" bindsubmit="follow_project">
<view class='focus' wx:if="{{ item.isfollow }}">已关注</view>
<view class='notfocus' wx:if="{{ !item.isfollow }}">
<image src="../../../img/plus.png"></image> 关注
</view>
<button form-type="submit" hover-class="none" type="default" size="mini"></button>
</form>
</view>
</view>
</view>
</template>
<template name="school_hot_list">
<view>
<view class='hot-list' wx:for="{{ list }}" wx:key="index">
<view class='l'>
<view class='name'>{{ item.name }}</view>
<view class='num'>{{ item.offer_num }}个Offer</view>
</view>
<view class='r'>
<form class='submit-form' report-submit='true' data-index="{{ index }}" data-types="school" data-obj="{{ item }}" bindsubmit="follow_project">
<view class='focus' wx:if="{{ item.isfollow }}">已关注</view>
<view class='notfocus' wx:if="{{ !item.isfollow }}">
<image src="../../../img/plus.png"></image> 关注
</view>
<button form-type="submit" hover-class="none" type="default" size="mini"></button>
</form>
</view>
</view>
</view>
</template>
<template name="offer_list">
<navigator class='item' url='../../index/offer_details/index?id={{ item.id }}'>
<view class='school'>{{ item.schoolname }}</view>
<view class='project'>{{ item.professional }}</view>
<view class='footer'>
<view class='l'>
<text>{{ item.year }}</text>
<view class='divide'>|</view>
<text>{{ item.semester }}</text>
<view class='divide'>|</view>
<text>{{ item.apply_results }}</text>
<view class='divide' wx:if="{{ item.gpa }}">|</view>
<text>{{ item.gpa }}</text>
<view class='divide' wx:if="{{ item.schoolgrade }}">|</view>
<text>{{ item.schoolgrade }}</text>
</view>
</view>
<view class='bottom'>
<image src='{{item.avatar}}' class='avatar'></image> {{ item.username }}
</view>
</navigator>
</template>
<template name="message_alert">
<view class='alert-comfirm-box' bindtap="close_show_message">
<view class='reminder_box'>
<view class="tips">{{ message }}</view>
</view>
</view>
</template>
<template name="NavBar-holder">
<view>
<view class="NavBar-holder" style="height:{{screen_data.totalTopHeight}}px"></view>
<view class="NavBar">
<view class="NavBar-statusBar" style="height:{{screen_data.statusBarHeight}}px"></view>
<view class="NavBar-titlebar" style="height:{{screen_data.titleBarHeight}}px">
<view class="NavBar-content">
<view class="NavBar-left NavBar-left-more" wx:if="{{ !screen_data.index }}">
<view bindtap="navigategoBack" class='Btn'>
<image class="NavBar-BackIcon" src="../../../img/Back.svg"></image>
</view>
<view bindtap="backHome" class='Btn'>
<image class="NavBar-HomeIcon backToHome" src="../../../img/Home.svg"></image>
</view>
</view>
<view class="NavBar-left NavBar-left-more" wx:else>
</view>
<view class="NavBar-content-title">{{ screen_data.title }}</view>
</view>
<view class="capsule-holder"></view>
</view>
</view>
</view>
</template>
<!-- 页面 右下角的绿色 发布及提问按钮 -->
<template name="topublishArticle">
<view class="topublishArticle">
<view class="bj" wx:if="{{ topublishArticleState }}" bindtap="triggerState"></view>
<view hover-class="hover" id="topublish" class="topublish-btn">
<view class="buttonEject" wx:if="{{ topublishArticleState }}">
<view class="buttonEject-item" bindtap="topublishArticle" data-type="{{'ask'}}">
<i class="buttonEjectIcon"></i>
<text>我要提问</text>
</view>
<view class="buttonEject-item" bindtap="topublishArticle" data-type="{{'article'}}">
<i class="buttonEjectIcon"></i>
<text>发布文章</text>
</view>
</view>
<image lazy-load="true" src="https://app.gter.net/image/miniApp/offer/add-green.png" class="img {{topublishArticleState ? 'rotate': ''}}" bindtap="triggerState"></image>
</view>
</view>
</template>
<!-- 鸭头空 -->
<template name="duckHeadEmpty">
<view class="empty flexcolumn flexcenter shadow" style="height: calc(100vh - {{ 775 + bottomLift }}rpx);">
<view class="dot-box flexacenter">
<image class="dot" wx:for="{{ 3 }}" wx:key="index" mode="widthFix" src="/img/u1829.svg"></image>
<image class="dot" wx:for="{{ 3 }}" wx:key="index" mode="widthFix" src="/img/u1832.svg"></image>
</view>
<image class="empty-icom" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/u1828.svg"></image>
<view class="summary-list-no-hint">{{ hintText }}</view>
</view>
</template>
<!-- 投票 item 的 HTML 首页 个人主页 -->
<template name="vote-item">
<navigator class="vote-item-box" url="/pages/voteDetails/voteDetails?uniqid={{ item.uniqid }}&islist={{ islist || false }}" hover-class="none">
<!-- <navigator class="vote-item-box" url="/pages/vote/voteDetails/voteDetails?id={{ item.id }}&islist={{ islist || false }}" hover-class="none"> -->
<view wx:if="{{ isShowLabel }}" class="item-label flexcenter">投票</view>
<view class="vote-item-title flexacenter9">
<view wx:if="{{ item.status == 0 }}" class="vote-item-title-state">已结束</view>
<view wx:else class="vote-item-title-state vote-item-title-state-underway">进行中</view>
<view class="vote-item-title-text flex1">{{ item.title }}</view>
</view>
<view class="vote-item-message one-line-display" wx:if="{{ item.message }}">{{ item.message }}</view>
<view class="vote-item-list {{ (item.isvote == 1 || item.status == 0) ? 'vote-item-list-already' : '' }} ">
<block wx:for="{{ item.option }}" wx:for-item="s" wx:key="index">
<view wx:if="{{ index <= 2}}" class="vote-item-list-item flexflex">
<view class="vote-item-list-top flexacenter">
<image wx:if="{{ s.selected == 1 }}" class="vote-tick" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/vote-tick.svg"></image>
<view wx:else class="vote-item-list-index">{{ index + 1 }}</view>
<view class="vote-item-list-value flex1 one-line-display">{{ s.value }}</view>
</view>
<view class="vote-item-list-bottom flexacenter">
<view class="length" style="width:{{ pages =='myvote' || item.isvote || item.status==0 ? s.percentage + '%' : '0%'}}"></view>
{{ s.count }}
</view>
</view>
</block>
</view>
<view class="vote-item-bottom flexacenter">
<view class="vote-item-bottom-left flexacenter">
<image class="vote-item-bottom-avatar" src="{{ item.avatar }}"></image>
<view class="vote-item-bottom-time">{{ item.status == 0 ? '投票已结束' : '还有 ' + (item.time || ' ') +'结束' }}</view>
<view style="color: #D7D7D7; margin: 0 15rpx;">|</view>
<view class="vote-item-bottom-number">{{ item.votes }}人参与</view>
</view>
<view wx:if="{{ isShowEmoji }}" class="vote-item-bottom-right" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<view wx:else class="vote-item-bottom-right flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.views || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.comments || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 面经 item 的 HTML 首页 个人主页 -->
<template name="mj-item">
<navigator class="mj-item-box" url="/pages/mjDetails/mjDetails?id={{ item.id }}&uniqid={{ item.uniqid }}" hover-class="none">
<!-- <navigator class="mj-item-box" url="/pages/mj/mj_details/index?id={{ item.id }}&uniqid={{ item.uniqid }}" hover-class="none"> -->
<view wx:if="{{ isShowLabel }}" class="item-label flexcenter">面经</view>
<view class="mj-item-school flexacenter">
<image class="mj-item-school-icon" src="{{ item.schoolimage }}"></image>
<view class="mj-item-school-name flex1">{{ item.school}}</view>
</view>
<view class="mj-item-info">
<view class="mj-item-info-item flexacenter" wx:if="{{ item.profession || item.professional }}">
<view class="mj-item-info-key">专业</view>
<view class="mj-item-info-value">{{ item.profession || item.professional }}</view>
</view>
<view class="mj-item-info-item flexacenter" wx:if="{{ item.project }}">
<view class="mj-item-info-key">项目</view>
<view class="mj-item-info-value">{{ item.project }}</view>
</view>
<view class="mj-item-info-item flexacenter" wx:if="{{ item.timestamp || item.interviewtime }}">
<view class="mj-item-info-key">面试</view>
<view class="mj-item-info-value mj-item-info-timestamp-value">{{ filter.getDateTime(item.timestamp || item.interviewtime) }}</view>
</view>
</view>
<view class="mj-item-course" wx:if="{{ item.message }}">{{ item.message }}</view>
<view class="mj-item-bottom flexacenter">
<view class="mj-item-bottom-left flexacenter">
<image catch:tap="goPersonalHomepage" data-uid="{{ item.uid }}" data-uin="{{ item.uin }}" class="mj-item-bottom-avatar" mode="widthFix" src="{{ item.avatar }}"></image>
{{ item.releasetimeText || item.timeFormat }}
</view>
<view wx:if="{{ isShowEmoji }}" class="mj-item-bottom-right" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<view wx:else class="mj-item-bottom-right flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.views || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.commentnum || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/bi-icon.png"></image>
{{ item.reward || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 总结 item 的 HTML 首页 个人主页 -->
<template name="summary-item">
<navigator class="summary-item flexflex" url="/pages/summaryDetails/summaryDetails?id={{ item.id }}" hover-class="none">
<view wx:if="{{ isShowLabel }}" class="item-label flexcenter">申请总结</view>
<view class="summary-item-right flexcolumn">
<view class="summary-item-box">
<view class="summary-item-title">{{ item.subject }}</view>
<view class="summary-item-text one-line-display" wx:if="{{ item.content }}">{{ item.content }}</view>
<view class="summary-offer-box flexcolumn {{ item.offer.length > 2 && 'summary-offer-box-three' }}">
<view class="summary-item-total flexflex">共 <view style="font-weight: 700;font-size: 24rpx;margin: 0 8rpx;color: #000;">{{ item.offer.length }}</view> 个Offer</view>
<block wx:for="{{ item.offer }}" wx:for-item="it" wx:for-index="i" wx:key="i">
<block wx:if="{{ item.offer.length > 3 && item.state }}">
<view class="summary-offer-item flexacenter">
<image class="summary-offer-avatar" mode="widthFix" src="{{ it.schoolimage }}"></image>
<view class="summary-offer-content">
<view class="summary-offer-content-name" style="max-width: 558rpx;overflow: hidden;">{{ it.schoolname }}</view>
<view class="summary-offer-content-brief flexacenter">
<view style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: break-all; overflow-wrap: break-word; max-width: 346rpx;">
<block wx:if="{{ it.professionalzhong }}">
<text>{{ it.professionaltou }}</text>
<text style="color: #509CE3;">{{ it.professionalzhong }}</text>
<text>{{ it.professionalend }}</text>
</block>
<block wx:else>{{ it.professional }}</block>
</view>
<view class="line-between"></view>
{{ it.degree }}
<view class="line-between"></view>
{{ it.semester }}
</view>
</view>
</view>
</block>
<block wx:else>
<view class="summary-offer-item flexacenter" wx:if="{{ i < 3 }}">
<image class="summary-offer-avatar" mode="widthFix" src="{{ it.schoolimage }}"></image>
<view class="summary-offer-content">
<view class="summary-offer-content-name" style="max-width: 558rpx;overflow: hidden;">{{ it.schoolname }}</view>
<view class="summary-offer-content-brief flexacenter">
<view style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: break-all; overflow-wrap: break-word; max-width: 346rpx;">
<block wx:if="{{ it.professionalzhong }}">
<text>{{ it.professionaltou }}</text>
<text style="color: #509CE3;">{{ it.professionalzhong }}</text>
<text>{{ it.professionalend }}</text>
</block>
<block wx:else>{{ it.professional }}</block>
</view>
<view class="line-between"></view>
{{ it.degree }}
<view class="line-between"></view>
{{ it.semester }}
</view>
</view>
</view>
</block>
</block>
</view>
<view class="summary-offer-bottom flexacenter">
<view class="summary-offer-bottom-left flexacenter">
<image class="summary-offer-bottom-avatar" src="{{ item.avatar }}"></image>
{{ item.timestampText }}
</view>
<view wx:if="{{ isShowEmoji }}" class="summary-offer-bottom-rigth" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<view wx:else class="summary-offer-bottom-rigth flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.viewnum || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.commentnum || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/bi-icon.png"></image>
{{ item.reward || 0 }}
</view>
</view>
</view>
</view>
</view>
</navigator>
</template>
<!-- offer item 的 HTML 首页 个人主页 -->
<template name="victory-offer-item">
<navigator class="victory-offer-item flexflex" url="/pages/victoryDetails/victoryDetails?id={{ item.id || item.uniqid }}" hover-class="none">
<view wx:if="{{ isShowLabel }}" class="item-label flexcenter">Offer捷报</view>
<view class="victory-offer-right">
<view class="victory-offer-box flexflex">
<view class="victory-offer-info-box flexcolumn">
<view class="victory-offer-info-header flexacenter">
<image class="victory-offer-info-avatar" src="{{ item.schoolimage }}"></image>
<view class="victory-offer-info-name">{{ item.schoolname }}</view>
</view>
<view class="victory-offer-info-item flexflex" wx:if="{{item.professional}}">
<view class="victory-offer-info-major">专业</view>
<view class="victory-offer-info-value flex1" wx:if="{{item.professionalzhong}}">
<text>{{ item.professionaltou }}</text>
<text style="color: #509CE3;">{{ item.professionalzhong }}</text>
<text>{{ item.professionalend }}</text>
</view>
<view class="victory-offer-info-value flex1 " wx:else>{{ item.professional }}</view>
</view>
<view class="victory-offer-info-item flexflex" wx:if="{{item.project}}">
<view class="victory-offer-info-major">项目</view>
<view class="victory-offer-info-value flex1" wx:if="{{item.projecttzhong}}">
<text>{{ item.projecttou }}</text>
<text style="color: #509CE3;">{{ item.projecttzhong }}</text>
<text>{{ item.projecttend }}</text>
</view>
<view class="victory-offer-info-value flex1" wx:else>{{ item.project }}</view>
</view>
<view class="victory-offer-info-item flexacenter" style="align-items: center;font-size: 27rpx;">
{{ item.semester }}
<view class="line-between"></view>
{{ item.degree }}
<view class="line-between"></view>
<view class="victory-offer-info-item-results flexacenter results{{ item.apply_resultstatus }}">{{ item.apply_results }}</view>
</view>
<view class="victory-offer-info-xiaobox " wx:if="{{ item.message }}">
<view class="victory-offer-info-content one-line-display" wx:if="{{ item.message }}">{{ item.message }}</view>
</view>
<view class="victory-offer-bottom flexacenter">
<view class="victory-offer-bottom-left flexacenter">
<image class="victory-offer-bottom-avatar" src="{{ item.avatar }}"></image>
{{ item.timestamp }}
</view>
<view wx:if="{{ isShowEmoji }}" class="numerical-box" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<!-- 数值 -->
<view wx:else class="numerical-box flexacenter">
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/u884.png"></image>
{{ item.view || 0 }}
</view>
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.comments || 0 }}
</view>
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/bi-icon.png"></image>
{{ item.reward || 0 }}
</view>
</view>
</view>
</view>
</view>
</view>
</navigator>
</template>
<!-- 问答 item 的 HTML 个人主页 足迹 -->
<template name="questions-answers-item">
<navigator url="/pages/questionsDetails/questionsDetails?uniqid={{ item.uniqid }}" class="questions-answers-item">
<view class="item-label flexcenter">问答</view>
<view class="questions-answers-title">
<view class="flexcenter questions-answers-icon">
<image class="questions-answers-img" src="https://app.gter.net/image/miniApp/offer/u3370.svg" mode="widthFix"></image>
</view>
{{ item.title }}
</view>
<view wx:if="{{ item.content }}" class="questions-answers-text one-line-display">{{ item.content }}</view>
<view class="questions-answers-bottom flexacenter">
<view class="questions-answers-bottom-left flexacenter">
<image class="questions-answers-bottom-avatar" src="{{ item.avatar }}"></image>
共{{ item.answers }}个回答
</view>
<view class="questions-answers-bottom-right flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.viewnum || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.commentnum || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 问答 item 的 HTML 首页 -->
<template name="questions-and-answers">
<navigator class="questions-and-answers" url="/pages/questionsDetails/questionsDetails?uniqid={{ item.uniqid }}&answerid={{ item.answerid }}">
<view wx:if="{{ isShowLabel }}" class="item-label flexcenter">问答</view>
<view class="title">{{ item.title }}</view>
<view class="answers-box flexflex" wx:if="{{ item.content }}">
<view class="icon flexcenter">答</view>
<view class="text">{{ item.content || '' }}</view>
</view>
<view class="bottom flexacenter">
<view class="left flexacenter">
<image class="avatar" src="{{ item.avatar }}"></image>
{{ item.publicationdate || '' }}
</view>
<view class="right flexacenter">
<!-- <view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.viewnum || 0 }}
</view> -->
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.commentnum || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/bi-icon.png"></image>
{{ item.reward || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 回答 item 的 HTML 首页 个人主页 足迹 -->
<template name="answers-item">
<!-- <navigator url="/pagesSquare/pages/answerDetails/answerDetails?answerid={{ item.answerid }}" class="answers-item"> -->
<navigator url="/pages/questionsDetails/questionsDetails?uniqid={{ item.uniqid }}&answerid={{ item.answerid }}" class="answers-item">
<view class="item-label flexcenter">回答</view>
<view class="answers-title">{{ item.title }}</view>
<view class="answers-content flexacenter">
<view class="answers-label flexcenter">答</view>
<view wx:if="{{ item.content }}" class="answers-text one-line-display flex1">{{ item.content }}</view>
</view>
<view class="answers-bottom flexacenter">
<view class="answers-bottom-left flexacenter">
<image class="answers-bottom-avatar" src="{{ item.avatar }}"></image>
共{{ item.answers }}个回答
</view>
<view class="answers-bottom-right flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.viewnum || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.riposte || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.commentnum || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 招生官 item 的 HTML 足迹 -->
<template name="admission-officer-item">
<navigator class="admission-officer-item">
<view class="item-label flexcenter">招生官</view>
<view class="admission-officer-title">{{ item.title }}</view>
<view class="admission-officer-text one-line-display">{{ item.description }}</view>
<view class="admission-officer-bottom flexacenter">
<view class="admission-officer-bottom-left flexacenter">
<image class="admission-officer-bottom-avatar" src="{{ item.avatar }}"></image>
{{ item.pubdate }}
</view>
</view>
</navigator>
</template>
<!-- 找飞友 item 的 HTML 首页 个人主页 足迹 -->
<template name="find-flyer-item">
<navigator class="find-flyer-item" url="/pagesSquare/pages/lookingforfeiyou/lookingforfeiyou?id={{ item.id }}">
<view class="item-label flexcenter">找飞友</view>
<view class="find-flyer-header flexacenter">
{{ item.departurecityname }}
<image class="find-flyer-header-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/u2147.svg"></image>{{ item.destinationcityname }}
</view>
<view class="find-flyer-message flexacenter">
<image class="find-flyer-message-icon" mode="widthFix" src="/img/rili.svg"></image>
<block wx:if="{{ item.istickets == 1 }}">{{ item.flightdeparturetimeString }}</block>
<block wx:else>{{item.startscheduleString}} ~ {{ item.latestscheduleString }}</block>
<view class="line"></view>
{{ item.istickets == 1 ? '已' : '未' }}购机票
<view class="line"></view>
{{ sex[item.sex] }}
</view>
<view class="find-flyer-text flexacenter" wx:if="{{ item.message }}">
<text class="one-line-display flex1"> {{ item.message }}</text>
</view>
<view class="find-flyer-bottom flexacenter">
<view class="find-flyer-bottom-left flexacenter">
<image class="find-flyer-bottom-avatar" src="{{ item.avatar }}"></image>
{{ item.relativedate }}
</view>
<view wx:if="{{ isShowEmoji }}" class="find-flyer-bottom-right" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<view wx:else class="find-flyer-bottom-right flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.views || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.comments || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 租房 item 的 HTML 足迹 -->
<template name="renting-item">
<navigator path="/pages/show/show?uniqid={{ item.uniqid }}" target="miniProgram" class="renting-item" app-id="wxcf0a799771cf2ae6">
<view class="item-label flexcenter">香港租房</view>
<view class="renting-item-title">{{ item.subject }}</view>
<view class="renting-item-content flexflex">
<view class="renting-item-content-left flex1 flexflex">
<view class="renting-item-type flexflex">
<view class="renting-item-type-item flexcenter" wx:for="{{ item.tabList }}" wx:key="index">{{ item }}</view>
</view>
<view class="renting-item-site flexacenter">
<block wx:if="{{ item.intermediary == 6 }}">
<view class="renting-item-site-item flexacenter" wx:for="{{ item.location }}" wx:key="index">
<image class="renting-item-site-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/orientation.png"></image>
{{ item }}
</view>
</block>
<view wx:else class="renting-item-site-item flexacenter">
<image class="renting-item-site-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/orientation.png"></image>
{{ item.location }}
</view>
</view>
<view class="renting-item-price-section flexacenter">
<view class="renting-item-unit">HK$</view>
<view class="renting-item-price">{{ item.rent }}</view>
<text class="renting-item-text">/月</text>
<view class="renting-item-rentalduration">[ 租期{{ item.rentalduration }} ]</view>
</view>
</view>
<view class="renting-item-content-right flexacenter">
<view wx:if="{{ item.isvideo == 1 }}" class="renting-item-video flexflex">
<view class="renting-item-mask"></view>
<image class="renting-item-image" mode="widthFix" lazy-load src="{{ item.imageurl }}"></image>
<image class="renting-item-video-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/videoplay.png"></image>
</view>
<image wx:else class="renting-item-image" mode="widthFix" lazy-load src="{{ item.imageurl }}"></image>
</view>
</view>
<view class="renting-item-bottom flexacenter">
<image class="renting-item-avatar flexacenter" mode="widthFix" src="{{ item.avatar }}"></image>
{{ item.timeFormat }} <text class="line">|</text> {{ item.intermediary_text }}
</view>
</navigator>
</template>
<!-- 论坛帖子 item 的 HTML 足迹 -->
<template name="thread-item">
<navigator class="thread-item" url="/pages/webview/webview?url=https://bbs.gter.net/thread-{{ item.tid }}-1-1.html">
<view class="item-label flexcenter">论坛帖子</view>
<view class="thread-title">{{ item.subject }}</view>
<view class="thread-text one-line-display" wx:if="{{ item.message }}">{{ item.message }}</view>
<view class="thread-bottom flexacenter">
<view class="thread-bottom-left flexacenter">
<image class="thread-bottom-avatar" src="{{ item.avatar }}"></image>
{{ item.timeFormat }}
</view>
<view wx:if="{{ isShowEmoji }}" class="thread-bottom-right" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<view wx:else class="thread-bottom-right flexacenter">
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/eye-icon.svg"></image>
{{ item.views || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexacenter">
<image class="item-bottom-icon" mode="widthFix" src="/img/discuss-icon.png"></image>
{{ item.replies || 0 }}
</view>
</view>
</view>
</navigator>
</template>
<!-- 专题帖子 item 的 HTML 足迹 -->
<template name="appmsgalbum-item">
<navigator class="thread-item" url="/pages/webview/webview?url={{ item.url }}">
<view class="item-label flexcenter">{{ item.album }}</view>
<view class="thread-title">{{ item.title }}</view>
<view class="thread-text one-line-display" wx:if="{{ item.description }}">{{ item.description }}</view>
<view class="thread-bottom flexacenter">
<view class="thread-bottom-left flexacenter">
<image class="thread-bottom-avatar" src="{{ item.cover_img }}"></image>
{{ item.timeFormat }}
</view>
</view>
</navigator>
</template>
<!-- 表情包弹窗列表 页面 -->
<template name="emoji-list">
<view class="emoji-popup-mask flexcolumn" bind:tap="clickEmoji">
<view class="emoji-popup-box" catch:tap="return">
<view class="emoji-popup-item" wx:for="{{ optionEmoji }}" wx:key="index">
<view class="emoji-popup-name flexacenter">
<image class="emoji-popup-name-icon" mode="widthFix" src="{{ item.bicon }}"></image>{{ item.name }}
</view>
<text class="emoji-popup-icon" wx:key="index">{{ item }}</text>
<view class="emoji-popup-list">
<icon class="emoji-popup-icon icon-{{item.item}}" wx:for="{{ item.list }}" wx:key="index" bind:tap="selectEmoji" data-item="{{ item }}"></icon>
</view>
</view>
</view>
<view class="emoji-popup-bottom flexacenter" catch:tap="return">
<view class="emoji-popup-bottom-item flexcenter {{ index == emojiItem && 'pitch' }}" wx:for="{{ optionEmoji }}" wx:key="index" bind:tap="selectEmojiPage" data-index="{{ index }}">
<image class="emoji-popup-bottom-icon" mode="widthFix" src="{{ item.bicon }}"></image>
</view>
</view>
</view>
</template>

1098
common/common.wxss Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,200 @@
// template/goLogin/goLogin.js
var app = getApp();
var miucms = require('../../utils/miucms.js');
import util from "../../utils/util"
Component({
/**
* 组件的属性列表
*/
properties: {
islogin: Boolean
},
/**
* 组件的初始数据
*/
data: {
canIUseGetUserProfile: false,
isAgreement: false
},
/**
* 组件的方法列表
*/
pageLifetimes: {
show() {
const self = this
getApp().watch(self.watchBack.bind(self));
}
},
lifetimes: {
attached: function () {
this.attachedIn()
},
},
attached: function () {
this.attachedIn()
},
methods: {
watchBack(value) {
if (value) {
this.triggerEvent('userClickLogin', {
data: {
regdatastep: 'success'
}
})
this.bindIsAccredit()
}
},
attachedIn() {
let that = this;
this.setData({
canIUseGetUserProfile: app.globalData.canIUseGetUserProfile
})
},
hidealert() {
},
getuserInfo(e) {
if (!this.data.isAgreement) {
wx.showToast({
title: '请阅读并勾选同意',
icon: 'none'
})
return
}
let that = this;
if (this.data.canIUseGetUserProfile) {
wx.getUserProfile({
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res1) => {
app.globalData.getUserInfoData = res1
miucms.getUserInfo(res1).then(res => {
this.triggerEvent('userClickLogin', {
data: res.data
})
}).catch(res => {
console.log(res)
})
}
})
return false;
}
if (e.detail.errMsg == 'getUserInfo:ok') {
//用户同意授权
miucms.getUserInfo(e.detail).then(res => {
this.triggerEvent('userClickLogin', {
data: res.data
})
}).catch(res => {
console.log(res)
})
}
},
agreement() {
this.setData({
isAgreement: !this.data.isAgreement
})
},
godetail(e) {
let {
link
} = e.currentTarget.dataset
console.log("link", link);
wx.navigateTo({
url: '/pages/webview/webview?url=' + link,
})
},
bindIsAccredit() {
this.setData({
islogin: true
})
this.triggerEvent("popClose")
// this.triggerEvent('closeUserClickLogin', {})
},
handScroll() {
return
},
isloginState: false,
go() {
if (!this.data.isAgreement) {
wx.showToast({
title: '请阅读并勾选同意',
icon: 'none'
})
return
}
if (this.isloginState) return
wx.login({
success: res => {
miucms.request("https://passport.gter.net/api/user/authorityInit", {
code: res.code
}).then(res => {
console.log("res", res);
if (res.code != 200) {
wx.showToast({
icon: "none",
title: res.message,
})
return
}
this.isloginState = false
let data = res.data
if (data.user) app.globalData.user = data.user
// if (data.step == "success") {
if (data.status == 3) {
app.globalData.setSate = true
this.triggerEvent('userClickLogin', {
data: res.data
})
this.setData({
isaccredit: !this.data.isaccredit
})
// } else if (data.step == "mobile") {
} else if (data.status == 1 || data.status == 2) {
let token = data.token
wx.navigateTo({
url: '/pagesSquare/pages/PCAuthorization/PCAuthorization?token=' + token + "&status=" + data.status,
})
} else if (data.status == 4) {
let token = data.token
wx.navigateTo({
url: "/pages/setAvatarNickname/setAvatarNickname?token=" + token
})
} else {
// 这个是所有情况的默认
app.globalData.user = data.user
this.triggerEvent('userClickLogin', {
data: res.data
})
this.setData({
isaccredit: !this.data.isaccredit
})
}
util.bindingUser(data.user)
}).finally(() => {
this.isloginState = false
})
},
fail: err => {
this.isloginState = false
},
})
}
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,40 @@
<!-- <view>
<view class='go_login' wx:if="{{ !islogin }}">
<view class="bg" catchtap="hidealert"></view>
<view class="inner">
<view class="text">需要授权登录哦~</view>
<button wx:if="{{canIUseGetUserProfile}}" class="btn" bindtap="getuserInfo"><image src="/img/wechart.png"></image>
微信登录</button>
<button wx:else class="btn" open-type="getUserInfo" bindgetuserinfo="getuserInfo">
<image src="/img/wechart.png"></image>
微信登录</button>
</view>
</view>
</view> -->
<view class="nowUserAccredit" wx:if="{{ !islogin }}">
<view class="bg" bindtap="bindIsAccredit" catchtouchmove="handScroll"></view>
<view class="bottom">
<view class="title">请阅读并勾选同意</view>
<!-- 用户发布协议开始 -->
<view class="protocol" catchtap="agreement">
<image class="image" src="https://app.gter.net/image/miniApp/project/u2506-u.png" wx:if="{{ isAgreement }}"></image>
<image class="image" src="https://app.gter.net/image/miniApp/project/u2506.svg" wx:else=""></image>
<text class="text">已阅读并同意</text>
<view catchtap="godetail" data-link="https://app.gter.net/alonepage/userprotocol" class="navigator">用户使用协议
</view>
<view catchtap="godetail" data-link="https://app.gter.net/alonepage/userprivacyclause" class="navigator">用户隐私条款
</view>
</view>
<!-- 用户发布协议结束 -->
<!-- <button class="btn" wx:if="{{ canIUseGetUserProfile }}" catchtap="getuserInfo">进入</button> -->
<!-- <button class="btn" wx:else open-type="getUserInfo" bindgetuserinfo="getuserInfo">进入</button> -->
<view class="btn" catchtap="go">进入</view>
</view>
</view>

View File

@ -0,0 +1,121 @@
/* template/goLogin/goLogin.wxss */
.go_login{
position: fixed;
left: 0;
top: 0;
z-index:90;
width: 100vw;
height: 100vh;
background: rgba(0,0,0,0.5);
}
.btn{
width: 300rpx;
height: 80rpx;
line-height: 80rpx;
background: #50AB42;
border-radius: 40rpx;
color: #fff;
font-size: 28rpx;
letter-spacing: 1px;
margin: 30rpx auto;
}
.btn image{
display: inline-block;
width: 46rpx;
height: 46rpx;
vertical-align: middle;
}
.inner{
position: fixed;
bottom: 0;
left: 0;
height: 300px;
width: 100vw;
background: #fff;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column
}
.text{
font-size: 30rpx;
color: #333;
}
/* components/nowUserAccredit/nowUserAccredit.wxss */
.nowUserAccredit{
position: fixed;
top: 0;
left: 0;
min-height: 100vh;
width: 100vw;
/* background-color: black; */
/* : 0.4; */
z-index: 5000;
display: flex;
}
.nowUserAccredit .bg {
flex: 1;
background-color: #000000;
opacity: 0.4;
}
.nowUserAccredit .protocol {
display: flex;
align-items: center;
font-size: 28rpx;
line-height: 28rpx;
padding: 10rpx 0;
}
.nowUserAccredit .protocol .image {
width: 25rpx;
height: 25rpx;
}
.nowUserAccredit .protocol .text {
margin: 0 7rpx 0 15rpx;
}
.nowUserAccredit .protocol .navigator {
color: #3cdda9;
padding: 0 5rpx;
overflow: hidden;
}
.nowUserAccredit .btn {
width: 100%;
background-color: #323232;
height: 105rpx;
color: #fff;
text-align: center;
line-height: 105rpx;
border-radius: 50rpx;
margin-top: 45rpx;
display: flex;
justify-content: center;
align-items: center;
}
.nowUserAccredit .bottom {
width: 750rpx;
box-sizing: border-box;
position: fixed;
bottom: 0;
background-color: #fff;
padding: 80rpx 50rpx 68rpx;
border-radius: 50rpx 50rpx 0 0;
}
.nowUserAccredit .bottom .title{
margin-bottom: 80rpx;
font-size: 34rpx;
line-height: 34rpx;
padding: 0;
overflow: hidden;
}

View File

@ -0,0 +1,347 @@
// template/headerNav/index.js
import util from '../../utils/util'
var app = getApp()
Component({
/**
* 组件的属性列表
*/
properties: {
showTab: String, // 需要显示的 列表按钮 offerlist summarylist mjlist
notShowIndex: Boolean,
isIndexPage: Boolean,
haveSearch: Boolean,
customBack: Boolean,
needback: Boolean,
bgcolor: String,
searchBtnShow: {
value: false,
type: Boolean
},
isToggleState: {
value: false,
type: Boolean
},
isUser: Boolean,
isUserAlone: Boolean,
islogin: {
type: Boolean,
value: true
},
user: {
type: Object,
value: {},
observer: function (newVal, oldVal) {
let {
initializeLoginState,
iswechatmessagepush,
popup,
offerkaipingadvertisement,
offerkaipingadvertisementState,
} = app.globalData
if (!offerkaipingadvertisementState) {
let data = offerkaipingadvertisement || {}
if (Date.now() < data.deadline * 1000) {
this.setData({
openDate: data
})
}
}
if (newVal && newVal['uid'] > 0 && iswechatmessagepush == null) {
if (app.globalData.iswechatmessagepushState >= 0) return
app.globalData.iswechatmessagepushState = 0
app.judgeWechatAlertsPop().then(res => {
let iswechatmessagepush = res.iswechatmessagepush
let capsulePopState = false
if (iswechatmessagepush == 0 && app.globalData['ishongkonganswer'] === 0) {
capsulePopState = true
} else {
capsulePopState = false
}
this.setData({
capsulePopState
})
})
}
if (iswechatmessagepush == 0 && app.globalData['ishongkonganswer'] === 0) {
this.setData({
capsulePopState: true
})
}
}
},
isNewVersions: { // 是否是新版本
type: Boolean,
value: false
},
isNeedSign: { // 是否需要签到按钮
type: Boolean,
value: false
},
isMessageCenter: { // 是否显示未读信息
type: Boolean,
value: false
},
isNeedUnread: { // 是否需要未读数
type: Boolean,
value: false,
},
newHeadOperate: Boolean, // 是否是 新的 二级页面 顶部 返回按钮
iswhitecolor: { // 是否显示白色图标
type: Boolean,
value: false,
},
},
/**
* 组件的初始数据
*/
data: {
// templateHeader:'templateHeadersss',
screen_data: {
windowHeight: 0,
totalTopHeight: 0,
statusBarHeight: 0,
titleBarHeight: 0,
},
// isIndexPage:false,
isTabPage: false,
capsulePopState: false, // 微信提醒弹窗状态
// reminderState: false, // 不再提醒的状态
socketTimer: null, // 轮询的定时器
messageCount: 0, // 未读消息
showTabObj: {
offerlist: "Offer列表",
summarylist: "总结列表",
mjlist: "面经列表",
votelist: "投票列表",
questionslist: "问答列表",
treelist: "笔记列表",
},
rentPopState: false,
openDate: {}, // 开屏广告数据
},
pageLifetimes: {
show: function () { // 页面被展示
setTimeout(() => {
this.pollPopup()
}, 200)
if (this.data.isMessageCenter || this.data.isNeedUnread) this.sendSocketMessageCount()
},
hide: function () { // 页面被隐藏
clearTimeout(this.data.socketTimer)
}
},
lifetimes: {
attached: function () {
this.attachedIn()
},
detached: function () {
// 在组件实例被从页面节点树移除时执行
clearTimeout(this.data.socketTimer)
},
},
attached: function () {
this.attachedIn()
},
/**
* 组件的方法列表
*/
methods: {
pollPopup() {
const popup = app.globalData.popup
if (popup === undefined) setTimeout(() => this.pollPopup(), 1000);
else {
if (popup != null && !popup['state']) {
app.globalData.popup['state'] = 1
this.setData({
rentPopState: true,
popup,
})
this.socketPopupOver()
}
}
},
// 只是弹窗后发生 回执
socketPopupOver() {
if (app.globalData.socketTask && app.globalData.socketTask.readyState == 1) {
app.globalData.socketTask.send({
data: JSON.stringify({
type: 'popupOver'
})
})
} else setTimeout(() => this.socketPopupOver(), 1000);
},
// 发送 获取问答信息
sendSocketMessageCount() {
// 主动发一个 获取 未读消息
if (app.globalData.socketTask && app.globalData.socketTask.readyState == 1) {
app.globalData.socketTask.send({
data: JSON.stringify({
type: 'messageCount'
})
})
// 发送后等 0.5s 后再去全局拿数据
setTimeout(() => this.getSocketMessageCount(), 500)
} else setTimeout(() => this.sendSocketMessageCount(), 1000);
},
// 轮询获取未读信息
getSocketMessageCount() {
// 先在全局获取数据
if (app.globalData.unreadMessageCount != 0) {
this.setData({
messageCount: app.globalData.unreadMessageCount
})
app.globalData.unreadMessageCount = 0
}
// 再开启一个定时器
this.data.socketTimer = setTimeout(() => this.getSocketMessageCount(), 3000);
},
attachedIn() {
this.getwindowHeight();
},
getwindowHeight() {
if (app.globalData.screen_data.totalTopHeight > 30) {
this.setData({
screen_data: app.globalData.screen_data
})
} else {
try {
app.computeNavigateBarHeight();
} catch (e) {
// 获取系统信息失败
} finally {
if (app.globalData.screen_data.totalTopHeight > 30) {
this.setData({
screen_data: app.globalData.screen_data
})
}
this.setData({
screen_data: {
bottomLift: 34,
statusBarHeight: 48,
titleBarHeight: 32,
totalTopHeight: 86,
windowHeight: 812,
windowWidth: 375,
}
})
}
}
},
backHome() {
wx.reLaunch({
url: `/pages/projectLibrary/projectLibrary`,
})
},
navigategoBack() {
if (this.properties.needback) {
this.triggerEvent('back', {}, {})
return false
}
var pages = getCurrentPages();
if (this.properties.customBack) {
this.triggerEvent('back', {}, {})
return false;
}
if (pages.length == 1) {
wx.reLaunch({
url: `/pages/projectLibrary/projectLibrary`
});
} else {
wx.navigateBack({
changed: true
}); //返回上一页
}
},
// 点击跳转搜索页面
toSearchBtn() {
wx.navigateTo({
url: '/pagesSquare/pages/searchall/searchall',
})
},
// 点击切换账号方法过几天就能删除了
toggle() {
this.triggerEvent("toggle")
},
// 跳转我的页面
toUserPage() {
wx.nextTick(() => {
this.setData({
messageCount: 0
})
})
if (!this.data.islogin) {
this.triggerEvent("openLogin")
this.triggerEvent("handleUnlockState") // offer详细和总结详细的
return
}
wx.navigateTo({
url: "/pages/user/user",
})
},
// 用户点击登录
userClickLogin(e) {
this.setData({
islogin: true,
})
},
// 跳转消息中心
goMessage() {
if (!this.data.islogin) {
this.triggerEvent("openLogin")
return
}
clearTimeout(this.data.socketTimer)
wx.navigateTo({
url: '/pagesLoginRequired/pages/messageCenter/messageCenter',
})
wx.nextTick(() => {
this.setData({
messageCount: 0
})
})
},
// 头部 跳转 中转
skipTransfer(e) {
const key = e.currentTarget.dataset.key
const pages = getCurrentPages();
if (key == 'back' && pages.length > 1) {
wx.navigateBack()
return
}
let url = ''
if (key == 'index' || key == 'back') url = '/pages/projectLibrary/projectLibrary'
if (key == 'offerlist') url = '/pages/victoryList/victoryList'
if (key == 'summarylist') url = '/pages/summaryList/summaryList'
if (key == 'mjlist') url = '/pages/mjList/mjList'
if (key == 'votelist') url = '/pages/voteList/voteList'
if (key == 'questionslist') url = '/pages/questionsList/questionsList'
if (key == 'treelist') url = '/pages/treeList/treeList'
wx.redirectTo({
url,
})
},
}
})

View File

@ -0,0 +1,8 @@
{
"component": true,
"usingComponents": {
"wechat-alerts-pop": "/component/wechatAlertsPop/wechatAlertsPop",
"rent-pop": "/component/rent-pop/rent-pop",
"open-ad": "/component/open-ad/open-ad"
}
}

View File

@ -0,0 +1,105 @@
<!--template/headerNav/index.wxml-->
<view>
<view class="NavBar-holder" style="height:{{screen_data.totalTopHeight}}px"></view>
<new-features></new-features>
<!-- bgcolor 为头部组件的背景颜色, 需传值 -->
<view class="NavBar" style="height:{{screen_data.totalTopHeight}}px;background-color: {{ bgcolor }};">
<view class="NavBar-statusBar" style="height:{{screen_data.statusBarHeight}}px"></view>
<view class="NavBar-titlebar" style="height:{{screen_data.titleBarHeight}}px">
<view class="NavBar-content">
<!-- 这个段代码从我看来是 废的 -->
<view class='NavBar-left NavBar-left-more' style="width:{{screen_data.titleWidth}}px" wx:if="{{ isIndexPage=='isIndexPage' }}">
<navigator url='../search/search' class='Btn search-btn' hover-class='hover' style='top:{{ screen_data.statusBarHeight }}px'>
<image class='searchbtn' src="../../img/searchbtn-3.png" />
</navigator>
<navigator url='../user/user' hover-class='hover' class='Btn'>
<image class="NavBar-HomeIcon user" hover-class='hover' src="../../img/userblack.png"></image>
</navigator>
</view>
<view wx:if="{{ newHeadOperate }}" class="NavBar-left left-operate-box">
<view class="left-operate-item" bind:tap="skipTransfer" data-key="back">
<image class="left-operate-icon" src="https://app.gter.net/image/miniApp/offer/arrow-return.svg" mode="widthFix"></image>
返回
</view>
<view class="left-operate-item" bind:tap="skipTransfer" data-key="index">
<image class="left-operate-icon" src="https://app.gter.net/image/miniApp/offer/home-page.png" mode="widthFix"></image>
首页
</view>
<view wx:if="{{ showTab }}" class="left-operate-item" bind:tap="skipTransfer" data-key="{{ showTab }}">
<image class="left-operate-icon" src="https://app.gter.net/image/miniApp/offer/offer-top.png" mode="widthFix"></image>
{{ showTabObj[showTab]}}
</view>
</view>
<view wx:else class="NavBar-left NavBar-left-more">
<!-- 切换账号 -->
<view wx:if="{{ isToggleState }}" class="toggle" bindtap="toggle">
<image class="toggle-icon" src="https://app.gter.net/image/miniApp/offer/u122.svg"></image>
<text>切换账号</text>
</view>
<view class="searchBtn" wx:if="{{ searchBtnShow }}" bindtap="toSearchBtn">
<image class="searchBtnImg" mode="heightFix" src="https://app.gter.net/image/miniApp/project/u277.svg"></image>
</view>
<block wx:if="{{ !isIndexPage }}">
<view bindtap="navigategoBack" class='Btn'>
<image wx:if="{{ iswhitecolor }}" class="NavBar-BackIcon" src="https://app.gter.net/image/miniApp/project/back-f.svg" mode="heightFix"></image>
<image wx:else class="NavBar-BackIcon" src="https://app.gter.net/image/miniApp/project/Back.svg" mode="heightFix"></image>
</view>
<!-- <view bindtap="backHome" wx:if="{{ !notShowIndex && !isNewVersions }}" class='Btn'>
<image class="NavBar-HomeIcon backToHome" src="../../img/indexblack.png"></image>
</view> -->
<!-- 新的 -->
<view bindtap="backHome" wx:if="{{ !notShowIndex }}" class='Btn'>
<image wx:if="{{ iswhitecolor }}" class="home-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/project/home-white.png"></image>
<image wx:else class="home-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/project/home.png"></image>
</view>
<view class="Btn search-btn" wx:if="{{ isUser }}" bindtap="toUserPage">
<image wx:if="{{ user.avatar }}" class='headPortrait' src="{{ user.avatar }}" />
<image wx:else class='headPortrait' src="https://app.gter.net/image/miniApp/project/defaultAvatar.png" />
</view>
<navigator url='../search/search' class='Btn search-btn' hover-class='hover' wx:if="{{ haveSearch }}">
<image class='searchbtn' src="../../img/searchbtn-3.png" />
</navigator>
</block>
<!-- 消息中心 -->
<view wx:if="{{ isMessageCenter }}" class="message-center" bind:tap="goMessage">
<image wx:if="{{ iswhitecolor }}" class="message-center-icon" src="https://app.gter.net/image/miniApp/offer/message-center-c.svg" mode="widthFix"></image>
<image wx:else class="message-center-icon" src="https://app.gter.net/image/miniApp/offer/message-center.svg" mode="widthFix"></image>
<view class="red {{ messageCount <= 9 && 'circle' }}" wx:if="{{ messageCount != 0 }}">{{ messageCount }}</view>
</view>
<block wx:if="{{ isUserAlone }}">
<view bindtap="toUserPage" class='Btn search-btn' hover-class='none' style="padding: 0 15rpx;margin-left: 7rpx;position: relative;">
<image wx:if="{{ user.avatar }}" class='headPortrait' src="{{ user.avatar }}" />
<image wx:else class='headPortrait' src="https://app.gter.net/image/miniApp/project/defaultAvatar.png" />
<view class="red {{ messageCount <= 9 && 'circle' }}" wx:if="{{ messageCount != 0 }}">{{ messageCount }}</view>
</view>
</block>
<navigator wx:if="{{ isNeedSign }}" class="sign-btn" url="/pages/signIn/signIn" hover-class="none">签到领币</navigator>
</view>
<!-- <view class="NavBar-content-title" style="padding-left:{{!notShowIndex && haveSearch ? 0 :11}}px"> -->
<view class="NavBar-content-title">
<slot></slot>
</view>
<!-- 顶部标题偏右的修改 直接复制 NavBar-left 的 view 就行 -->
<view class="NavBar-left NavBar-left-more"></view>
</view>
<!-- <view class="capsule-holder"></view> -->
</view>
</view>
<wechat-alerts-pop capsulePopState="{{ capsulePopState }}"></wechat-alerts-pop>
<rent-pop popup="{{ popup }}"></rent-pop>
<open-ad openDate="{{ openDate }}"></open-ad>
</view>

View File

@ -0,0 +1,254 @@
/* template/headerNav/index.wxss */
.NavBar {
position: fixed;
/* position: sticky; */
top: 0;
left: 0;
width: 100%;
background: #fff;
z-index: 99;
/* border-bottom: 1px solid #f2f2f2; */
transition: all .2s;
}
.NavBar-statusBar {
width: 100%;
}
.NavBar-titlebar {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.capsule-holder {
width: 100px;
height: 100%;
}
.NavBar-SearchBar {
flex: 1;
padding: 0 16px;
overflow: hidden;
}
.NavBar-content {
display: flex;
align-items: center;
flex: 1;
margin: 0;
overflow: hidden;
}
.NavBar-left {
/* width: 55px; */
height: 32px;
border-radius: 32px;
/* border: solid 1px #f6f6f6; */
text-align: center;
display: flex;
align-items: center;
}
.NavBar-content-title {
font-size: 17px;
font-weight: 600;
/* flex: 1; */
text-align: center;
line-height: 32px;
height: 32px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* padding-left: 11px; */
}
.backToHome {
height: 32px;
}
.search-btn {
padding: 5px
}
.search-btn image {
height: 18px;
width: 18px;
}
.NavBar-HomeIcon {
width: 20px;
height: 20px;
}
.NavBar-left-area {
width: 87px;
}
.NavBar-left-more {
/* width: 87px; */
height: 32px;
display: flex;
flex: 1;
}
.NavBar-left-more .backToHome {
/* flex: 1; */
}
.NavBar-BackIcon {
/* flex: 1; */
width: 12px;
height: 18px;
padding: 1px 0;
box-sizing: border-box;
/* border-right: solid 1px #d2d2d2; */
}
.Btn {
display: flex;
flex: 1;
max-width: 44px;
height: 32px;
padding: 1px 0;
text-align: left;
box-sizing: border-box;
justify-content: center;
align-items: center;
}
.Btn .user {
width: 20px;
height: 21px;
margin: 0;
}
.navigator-hover {
background-color: #fff;
opacity: 1
}
.hover {
background: #fff;
opacity: 1
}
.searchBtn {
display: flex;
flex: 1;
max-width: 44px;
height: 32px;
padding: 1px 0;
text-align: left;
box-sizing: border-box;
justify-content: center;
align-items: center;
}
.searchBtn .searchBtnImg {
width: 17px;
height: 17px;
}
.search-btn .headPortrait {
width: 48rpx;
height: 48rpx;
border-radius: 50%;
}
.toggle {
display: flex;
align-items: center;
font-size: 24rpx;
padding-left: 22rpx;
height: 100%;
}
.toggle .toggle-icon {
width: 24rpx;
height: 24rpx;
border-radius: 50%;
margin-right: 9rpx;
}
.home-icon {
width: 57rpx;
height: 57rpx;
}
.sign-btn {
/* margin-left: 10rpx; */
font-size: 25rpx;
padding: 0 15rpx;
}
.message-center {
padding: 0 15rpx;
display: flex;
align-items: center;
position: relative;
}
.message-center .message-center-icon {
width: 37.5rpx;
height: 30rpx;
}
.search-btn .red,
.message-center .red {
font-size: 18rpx;
color: #FFFFFF;
padding: 0 7rpx;
height: 24rpx;
line-height: 24rpx;
border-radius: 12rpx;
background-color: #f95d5d;
position: absolute;
top: -10rpx;
right: 0;
box-sizing: border-box;
text-align: center;
}
.search-btn .red.circle,
.message-center .red.circle {
border-radius: 50%;
width: 24rpx;
}
.search-btn .red {
top: 0rpx;
right: 15rpx;
}
.left-operate-box {
height: 57rpx;
background-color: rgba(255, 255, 255, 0);
border: 1rpx solid rgba(215, 215, 215, 1);
border-radius: 66rpx;
margin-left: 15rpx;
display: flex;
align-items: center;
box-sizing: border-box;
}
.left-operate-box .left-operate-item {
font-size: 24rpx;
line-height: 37.5rpx;
color: #333;
display: flex;
align-items: center;
padding: 0 19rpx;
box-sizing: border-box;
}
.left-operate-box .left-operate-item:not(:last-of-type) {
border-right: 1rpx solid #d7d7d7;
}
.left-operate-box .left-operate-item .left-operate-icon {
width: 30rpx;
height: 30rpx;
margin-right: 9rpx;
}

View File

@ -0,0 +1,26 @@
// template/helper-pop/helper-pop.js
Component({
/**
* 组件的属性列表
*/
properties: {
type: String
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
close() {
this.triggerEvent('close', {})
}
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,20 @@
<!--template/helper-pop/helper-pop.wxml-->
<view class="helper-pop flexflex" bindtap="close" catchtouchmove="return">
<view class="helper-box flexacenter" catchtap="return false">
<image class="cross-grey" catchtap="close" src="https://app.gter.net/image/miniApp/offer/cross-grey.png"></image>
<!-- <image class="helper-text helper-text1" mode="heightFix" src="https://app.gter.net/image/miniApp/offer/assistantbackground.png"></image> -->
<image class="helper-text helper-text1" mode="heightFix" src="https://app.gter.net/image/miniApp/offer/apply-for-name.png"></image>
<view class="helper-box-box flexflex">
<view class="helper-QRcode-box flexcenter">
<image class="left-top helper-QRcode-box-icon" src="https://app.gter.net/image/miniApp/offer/yellow-border.svg"></image>
<image class="left-bottom helper-QRcode-box-icon" src="https://app.gter.net/image/miniApp/offer/yellow-border.svg"></image>
<image class="right-top helper-QRcode-box-icon" src="https://app.gter.net/image/miniApp/offer/yellow-border.svg"></image>
<image class="right-bottom helper-QRcode-box-icon" src="https://app.gter.net/image/miniApp/offer/yellow-border.svg"></image>
<image class="helper-QRcode-img" mode="widthFix" src="https://u.gter.net/assistantwxqrcode.png" show-menu-by-longpress="true"></image>
</view>
<text class="helper-box-text">长按识别二维码</text>
</view>
<image class="helper-bottom" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/helper-bottom-yellow.svg"></image>
<image class="helper-bottom" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/helper-bottom-blue.svg"></image>
</view>
</view>

View File

@ -0,0 +1,182 @@
/* template/helper-pop/helper-pop.wxss */
/* 公共的 css 样式 */
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
@keyframes slidebj {
0% {
background-color: rgba(0, 0, 0, 0);
}
100% {
background-color: rgba(0, 0, 0, 0.717647058823529);
}
}
.helper-pop {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.717647058823529);
position: fixed;
top: 0;
left: 0;
z-index: 1004;
align-items: flex-end;
box-sizing: border-box;
animation: slidebj 0.5s forwards;
}
@keyframes slideUp {
0% {
top: 100%;
}
100% {
top: 0;
}
}
.helper-pop .helper-box {
animation: slideUp 0.5s forwards;
box-sizing: border-box;
flex-direction: column;
width: 750rpx;
height: 891rpx;
background: -webkit-linear-gradient(270.192914353533deg, rgba(193, 206, 250, 1) 0%, rgba(226, 237, 251, 1) 28%, rgba(255, 255, 255, 1) 60%);
background: -moz-linear-gradient(179.807085646467deg, rgba(193, 206, 250, 1) 0%, rgba(226, 237, 251, 1) 28%, rgba(255, 255, 255, 1) 60%);
background: linear-gradient(179.807085646467deg, rgba(193, 206, 250, 1) 0%, rgba(226, 237, 251, 1) 28%, rgba(255, 255, 255, 1) 60%);
border: none;
border-radius: 30rpx;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
-moz-box-shadow: 0px 0px 22.5rpx rgba(0, 0, 0, 0.101960784313725);
-webkit-box-shadow: 0px 0px 22.5rpx rgba(0, 0, 0, 0.101960784313725);
box-shadow: 0px 0px 22.5rpx rgba(0, 0, 0, 0.101960784313725);
position: relative;
}
.helper-pop .helper-box .cross-grey {
width: 24rpx;
height: 24rpx;
position: absolute;
top: 20rpx;
right: 20rpx;
padding: 10rpx;
}
.helper-pop .helper-box .helper-text {
box-sizing: border-box;
/* width: 384rpx; */
/* height: 110rpx; */
/* height: 150rpx; */
height: 155rpx;
margin: 88rpx auto 45rpx;
}
.helper-pop .helper-box .helper-text1 {
/* width: 424rpx; */
}
.helper-pop .helper-box .helper-box-box {
position: absolute;
bottom: 121.5rpx;
box-sizing: border-box;
width: 420rpx;
background: -webkit-linear-gradient(310.572423002443deg, rgba(101, 137, 242, 1) 0%, rgba(116, 177, 240, 1) 100%);
background: -moz-linear-gradient(139.427576997557deg, rgba(101, 137, 242, 1) 0%, rgba(116, 177, 240, 1) 100%);
background: linear-gradient(139.427576997557deg, rgba(101, 137, 242, 1) 0%, rgba(116, 177, 240, 1) 100%);
border: none;
border-radius: 30rpx;
-moz-box-shadow: 0px 0px 22.5rpx rgba(0, 0, 0, 0.176470588235294);
-webkit-box-shadow: 0px 0px 22.5rpx rgba(0, 0, 0, 0.176470588235294);
box-shadow: 0px 0px 22.5rpx rgba(0, 0, 0, 0.176470588235294);
flex-direction: column;
align-items: center;
padding-top: 30rpx;
padding-bottom: 30rpx;
z-index: 1;
}
.helper-pop .helper-box .helper-box-box .helper-box-text {
box-sizing: border-box;
font-size: 24rpx;
color: #FFFFFF;
text-align: center;
line-height: 42rpx;
margin-top: 30rpx;
}
.helper-pop .helper-box .helper-QRcode-box {
box-sizing: border-box;
width: 360rpx;
height: 360rpx;
background-color: rgba(255, 255, 255, 1);
border-radius: 9rpx;
position: relative;
}
.helper-pop .helper-box .helper-QRcode-box .helper-QRcode-box-icon {
width: 36rpx;
height: 36rpx;
position: absolute;
}
.helper-pop .helper-box .helper-QRcode-box .left-top {
top: 0;
left: 0;
transform: rotate(-90deg);
}
.helper-QRcode-box .left-bottom {
bottom: 0;
left: 0;
transform: rotate(180deg);
}
.helper-pop .helper-box .helper-QRcode-box .right-top {
right: 0;
top: 0;
}
.helper-pop .helper-box .helper-QRcode-box .right-bottom {
right: 0;
bottom: 0;
transform: rotate(90deg);
}
.helper-pop .helper-box .helper-QRcode-box .helper-QRcode-img {
width: 330rpx;
height: 330rpx;
box-sizing: border-box;
}
.helper-pop .helper-box .helper-bottom {
position: absolute;
bottom: 0;
left: 0;
width: 100vw;
height: 226rpx;
}

View File

@ -0,0 +1,208 @@
// template/indexSidebar/indexSidebar.js
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
const app = getApp()
Component({
/**
* 组件的属性列表
*/
properties: {
isInitFinish: {
type: Boolean,
observer(res) {
if (res) {
this.openSidebarTwoHide()
const ishongkongoffer = app.globalData.user.ishongkongoffer
this.setData({
gtergreenonionqrcode: app.globalData.gtergreenonionqrcode
})
if (this.data.ishongkongoffer == 0) {
this.setData({
ishongkongoffer,
})
}
}
},
value: false,
},
sidebarType: {
type: String,
value: "offer",
},
islogin: {
type: Boolean,
value: true
},
followschool: {
type: Number,
observer(res) {
if (res) this.judgeIsHK(res)
}
},
},
/**
* 组件的初始数据
*/
data: {
helperPopState: false, // offer捷报右侧-申请小助手弹窗的状态
isSidebarShowState: true, // 侧边栏的展开状态 相反的是 收起
sidebarState: 1, // 侧边栏有三种内容状态 1 只有申请助手 2 申请 + offer按钮 3 申请 + offer按钮 + 置顶
sidebarTimer: null, // 侧边栏的定时器
btnText: {
offer: "Offer\n捷报",
summary: "申请\n总结",
mj: "发布\n面经",
vote: "创建\n投票",
questions: "我要\n提问",
find: "我要\n发布",
note: "发布\n笔记",
},
opinionState: false, // 意见反馈 弹窗显示状态
ishongkongoffer: 0, // 是否报告 香港 offer
gtergreenonionqrcode: "", // 群 二维码
groupState: false, // 群 弹窗显示状态
},
/**
* 组件的方法列表
*/
methods: {
// 判断显示
judgeIsHK(value) {
if (this.data.isInitFinish) {
const arr = [308, 309, 310, 311, 312, 313, 314, 315, 316, 453, 1662, 2971, 2972]
value = Number(value)
let ishongkongoffer = 0
if (arr.includes(value)) ishongkongoffer = 1
this.setData({
ishongkongoffer,
})
} else setTimeout(() => this.judgeIsHK(value), 1000)
},
// 开启两秒后收起
openSidebarTwoHide() {
clearTimeout(this.data.sidebarTimer)
if (!this.data.isSidebarShowState) {
this.setData({
isSidebarShowState: true
})
}
this.data.sidebarTimer = setTimeout(() => {
this.setData({
isSidebarShowState: false
})
}, 2000);
},
// 专门处理侧边栏的事件 隐藏消失
sidebarShowHide(e) {
clearTimeout(this.data.sidebarTimer)
if (!this.data.isSidebarShowState) {
this.openSidebarTwoHide()
return
}
const type = e.currentTarget.dataset.type
if (type == 'group') {
// const url = "https://form.gter.net/D8i0iS5uXCWG#/qr"
// common.goPage(`/pages/webview/webview?url=${url}`)
this.setData({
groupState: true,
})
util.statistics({
name: "side-group"
})
return
}
if (type == 'gx') {
wx.navigateToMiniProgram({
appId: "wxcf0a799771cf2ae6",
page: "/pages/index/index"
})
util.statistics({
name: "side-gx"
})
return
}
if (type == 'top') {
wx.pageScrollTo({
scrollTop: 0
})
return
}
if (type == 'issue') {
if (!this.data.islogin) {
this.triggerEvent("openLogin")
return
}
const type = this.data.sidebarType || ''
if (type == 'questions') {
this.triggerEvent('openSelectTheme')
return
}
let url = '/pagesLoginRequired/pages/postOffer/postOffer'
if (type == 'summary') url = '/pages/summaryPost/summaryPost'
else if (type == 'mj') url = '/pagesSquare/pages/mjIssue/mjIssue'
else if (type == 'vote') url = '/pagesSquare/pages/voteCcreate/voteCcreate'
else if (type == 'find') url = '/pagesSquare/pages/publish/publish'
else if (type == 'note') url = '/pages/treeIssue/treeIssue'
wx.navigateTo({
url
})
}
if (type == 'apply') {
this.setData({
helperPopState: true
})
// 调用统计代码
util.statistical({
type: "documentassistant"
}).then(res => {})
}
if (type == 'xg') {
this.setData({
opinionState: true,
})
}
this.openSidebarTwoHide()
},
// 关闭 申请小助手的弹窗
closeHelperPopState() {
this.setData({
// sidebarState: 1,
helperPopState: false
})
},
closeOpinion() {
this.setData({
opinionState: false,
})
},
closeGroup() {
this.setData({
groupState: false,
})
},
}
})

View File

@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"helper-pop": "/component/helperPop/helperPop"
}
}

View File

@ -0,0 +1,326 @@
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.sidebar-box {
position: fixed;
right: 15rpx;
bottom: 200rpx;
width: 72rpx;
background-color: rgb(246, 246, 246);
border-radius: 18rpx;
box-shadow: rgba(0, 0, 0, 0.24) 0 0 12rpx;
transition: all .3s;
&.sidebar-hide-box {
right: 0;
transform: translateX(50%);
}
.sidebar-item {
&:not(:last-of-type) {
border-bottom: 1rpx solid #ebebeb;
}
&.toTop {
width: 100%;
padding-top: 30rpx;
padding-bottom: 24rpx;
.toTop-icon {
width: 36rpx;
height: 36rpx;
}
}
&.offerBtn {
flex-direction: column;
padding-top: 31.5rpx;
padding-bottom: 19.5rpx;
.offerBtn-icon {
width: 48rpx;
height: 48rpx;
border-radius: 50%;
background-color: #fff;
box-shadow: 0px 0px 10rpx rgba(0, 0, 0, 0.349019607843137);
margin-bottom: 7.5rpx;
.offerBtn-img {
width: 30rpx;
height: 30rpx;
}
.zufang-img {
width: 33rpx;
height: 33rpx;
}
.wx-img {
width: 40rpx;
height: 40rpx;
}
}
.offerBtn-text {
text-align: center;
color: rgba(51, 51, 51, 1);
font-size: 21rpx;
white-space: break-spaces;
}
}
&.applyFor {
flex-direction: column;
padding-top: 31.5rpx;
padding-bottom: 28.5rpx;
.applyFor-icon {
width: 63rpx;
height: 63rpx;
}
.applyFor-text {
text-align: center;
color: rgba(51, 51, 51, 1);
font-size: 21rpx;
.applyFor-text-text {
display: block;
}
}
}
}
}
@keyframes slideUp {
0% {
top: 100%;
}
100% {
top: 0;
}
}
.opinion-box {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.705882352941177);
display: flex;
align-items: flex-end;
animation: slidebj 0.5s forwards;
.box {
width: 100vw;
height: 960rpx;
background: linear-gradient(180deg, rgba(245, 246, 242, 1) 1%, rgba(255, 246, 223, 1) 35%, rgba(242, 175, 28, 1) 100%);
border: none;
border-radius: 30rpx 30rpx 0 0;
box-shadow: 0 0 22.5rpx rgba(0, 0, 0, 0.101960784313725);
padding: 45rpx 48rpx 0;
animation: slideUp 0.5s forwards;
position: relative;
.sun {
width: 180rpx;
height: 159rpx;
position: absolute;
top: 30rpx;
right: 30rpx;
}
.title {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-style: normal;
font-size: 54rpx;
color: #000000;
margin-bottom: 30rpx;
}
.hint {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 28rpx;
color: #555555;
line-height: 45rpx;
white-space: pre;
margin-bottom: 42rpx;
}
.case {
width: 654rpx;
height: 603rpx;
background-color: rgba(246, 246, 246, 1);
border-radius: 30rpx;
box-shadow: 0 0 22.5rpx rgba(0, 0, 0, 0.101960784313725);
flex-direction: column;
.QRcode {
width: 360rpx;
height: 360rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 9rpx;
margin-bottom: 24rpx;
.img {
width: 327rpx;
height: 327rpx;
}
}
.prompt {
font-size: 24rpx;
letter-spacing: 1.5rpx;
color: #555555;
text-align: center;
line-height: 42rpx;
}
}
}
}
.huddle-box {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.705882352941177);
display: flex;
align-items: flex-end;
animation: slidebj 0.5s forwards;
.box {
width: 100vw;
height: 1078.5rpx;
border-radius: 45rpx 45rpx 0 0;
box-shadow: 0 0 22.5rpx rgba(0, 0, 0, 0.101960784313725);
animation: slideUp 0.5s forwards;
background: linear-gradient(0.079688098148992deg, rgba(51, 50, 117, 1) 0%, rgba(66, 0, 128, 1) 100%);
position: relative;
flex-direction: column;
align-items: center;
padding-top: 48rpx;
z-index: 1;
.code {
width: 100vw;
}
.bj {
width: 750rpx;
height: 1078.5rpx;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
z-index: -1;
}
.bj-bottom {
width: 189rpx;
height: 201rpx;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
.top {
width: 298.5rpx;
height: 54rpx;
margin-bottom: 19.5rpx;
}
.title {
width: 466.5rpx;
height: 129rpx;
margin-bottom: 6rpx;
}
.text {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 30rpx;
color: #FFFFFF;
text-align: center;
line-height: 45rpx;
margin-bottom: 37.5rpx;
}
.case {
width: 540rpx;
height: 600rpx;
background: linear-gradient(180deg, rgba(242, 242, 242, 1) 0%, rgba(235, 235, 235, 1) 100%);
border-radius: 22.5rpx;
flex-direction: column;
align-items: center;
padding-top: 75rpx;
margin: 0 auto;
.QRcode {
width: 360rpx;
height: 360rpx;
background-color: rgba(255, 255, 255, 1);
border-color: rgba(242, 242, 242, 1);
border-radius: 15rpx;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.184313725490196);
margin-bottom: 39rpx;
.img {
width: 327rpx;
height: 327rpx;
}
}
.hint {
.img {
width: 48rpx;
height: 48rpx;
&.img-left {
transform: rotate(180deg);
}
}
.hint-text {
font-size: 27rpx;
color: #000000;
text-align: center;
line-height: 42rpx;
margin: 0 22.5rpx;
}
}
}
}
}

View File

@ -0,0 +1,83 @@
<!--template/indexSidebar/indexSidebar.wxml-->
<view class="sidebar-box {{ !isSidebarShowState ? 'sidebar-hide-box' : '' }}">
<view class="sidebar-item toTop flexcenter" wx:if="{{ sidebarState == 3 }}" bind:tap="sidebarShowHide" data-type="top">
<image class="toTop-icon" src="https://app.gter.net/image/miniApp/offer/toTop-icon.png" mode="widthFix"></image>
</view>
<view class="sidebar-item offerBtn flexcenter" wx:if="{{ sidebarState >= 2 && btnText[sidebarType] }}" bind:tap="sidebarShowHide" data-type="issue">
<view class="offerBtn-icon flexcenter">
<image class="offerBtn-img" src="https://app.gter.net/image/miniApp/project/u1434.png" mode="widthFix"></image>
</view>
<view class="offerBtn-text">{{ btnText[sidebarType] }}</view>
</view>
<view wx:if="{{ sidebarType != 'find' && sidebarType != 'note' && sidebarType != 'xg' }}" class="sidebar-item applyFor flexcenter" data-type="top" bind:tap="sidebarShowHide" data-type="apply">
<image class="applyFor-icon" src="https://app.gter.net/image/miniApp/offer/applyFor-icon.svg" mode="widthFix"></image>
<view class="applyFor-text">
<text class="applyFor-text-text">申请</text>
<text class="applyFor-text-text">小助手</text>
</view>
</view>
<view class="sidebar-item offerBtn flexcenter" wx:if="{{ sidebarType == 'xg' }}" bind:tap="sidebarShowHide" data-type="xg">
<view class="offerBtn-icon flexcenter">
<image class="offerBtn-img" src="https://app.gter.net/image/miniApp/offer/opinion-icon.png" mode="widthFix"></image>
</view>
<view class="offerBtn-text">意见</view>
<view class="offerBtn-text">反馈</view>
</view>
<view wx:if="{{ sidebarType == 'xg' }}" class="sidebar-item offerBtn flexcenter" bind:tap="sidebarShowHide" data-type="group">
<view class="offerBtn-icon flexcenter">
<image class="wx-img" src="https://app.gter.net/image/miniApp/offer/wx-icon.svg" mode="widthFix"></image>
</view>
<view class="offerBtn-text">进群</view>
<view class="offerBtn-text">抱团</view>
</view>
<!-- 不在 找飞友 笔记出现 -->
<view class="sidebar-item offerBtn flexcenter" wx:if="{{ sidebarType != 'find' && sidebarType != 'note' && ishongkongoffer }}" bind:tap="sidebarShowHide" data-type="gx">
<view class="offerBtn-icon flexcenter">
<image class="zufang-img" src="https://app.gter.net/image/miniApp/offer/renting-icon.png" mode="widthFix"></image>
</view>
<view class="offerBtn-text">港校</view>
<view class="offerBtn-text">租房</view>
</view>
</view>
<helper-pop wx:if="{{ helperPopState }}" bindclose="closeHelperPopState"></helper-pop>
<view wx:if="{{ opinionState }}" class="opinion-box" bindtap="closeOpinion" catch:touchmove="return">
<view class="box" catch:tap="return">
<image class="sun" src="https://app.gter.net/image/miniApp/offer/sun-icon.png"></image>
<view class="title">意见反馈</view>
<view class="hint">项目库正在火热公测中!发现有错误的地方\n告诉我呀有建议也欢迎来聊聊~</view>
<view class="case flexcenter">
<view class="QRcode flexcenter">
<image class="img" src="https://app.gter.net/image/miniApp/offer/brother-onion.png" mode="widthFix" show-menu-by-longpress></image>
</view>
<view class="prompt">长按识别二维码</view>
</view>
</view>
</view>
<view class="huddle-box" wx:if="{{ groupState }}" bindtap="closeGroup" catch:touchmove="return">
<view class="box flexflex" catch:tap="return">
<!-- <image class="code" src="https://app.gter.net/image/miniApp/offer/group-code.jpg" mode="widthFix"></image> -->
<image class="bj" src="https://app.gter.net/image/miniApp/offer/group-bj.svg"></image>
<image class="bj-bottom" src="https://app.gter.net/image/miniApp/offer/group-bottom.png"></image>
<image class="top" src="https://app.gter.net/image/miniApp/offer/group-top.png" mode="widthFix"></image>
<image class="title" src="https://app.gter.net/image/miniApp/offer/group-title.png" mode="widthFix"></image>
<view class="text">抱团 / 信息共享 / 互助申学</view>
<view class="case flexflex">
<view class="QRcode flexcenter">
<image class="img" src="{{ gtergreenonionqrcode }}" mode="widthFix" show-menu-by-longpress></image>
</view>
<view class="hint flexcenter">
<image class="img img-left" src="https://app.gter.net/image/miniApp/offer/group-arrows.png" mode="widthFix"></image>
<text class="hint-text">添加寄托葱哥进群</text>
<image class="img" src="https://app.gter.net/image/miniApp/offer/group-arrows.png" mode="widthFix"></image>
</view>
</view>
</view>
</view>

View File

@ -0,0 +1,276 @@
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.sidebar-box {
position: fixed;
right: 15rpx;
bottom: 200rpx;
width: 72rpx;
background-color: #f6f6f6;
border-radius: 18rpx;
box-shadow: rgba(0, 0, 0, 0.24) 0 0 12rpx;
transition: all 0.3s;
}
.sidebar-box.sidebar-hide-box {
right: 0;
transform: translateX(50%);
}
.sidebar-box .sidebar-item:not(:last-of-type) {
border-bottom: 1rpx solid #ebebeb;
}
.sidebar-box .sidebar-item.toTop {
width: 100%;
padding-top: 30rpx;
padding-bottom: 24rpx;
}
.sidebar-box .sidebar-item.toTop .toTop-icon {
width: 36rpx;
height: 36rpx;
}
.sidebar-box .sidebar-item.offerBtn {
flex-direction: column;
padding-top: 31.5rpx;
padding-bottom: 19.5rpx;
}
.sidebar-box .sidebar-item.offerBtn .offerBtn-icon {
width: 48rpx;
height: 48rpx;
border-radius: 50%;
background-color: #fff;
box-shadow: 0px 0px 10rpx rgba(0, 0, 0, 0.34901961);
margin-bottom: 7.5rpx;
}
.sidebar-box .sidebar-item.offerBtn .offerBtn-icon .offerBtn-img {
width: 30rpx;
height: 30rpx;
}
.sidebar-box .sidebar-item.offerBtn .offerBtn-icon .zufang-img {
width: 33rpx;
height: 33rpx;
}
.sidebar-box .sidebar-item.offerBtn .offerBtn-icon .wx-img {
width: 40rpx;
height: 40rpx;
}
.sidebar-box .sidebar-item.offerBtn .offerBtn-text {
text-align: center;
color: #333333;
font-size: 21rpx;
white-space: break-spaces;
}
.sidebar-box .sidebar-item.applyFor {
flex-direction: column;
padding-top: 31.5rpx;
padding-bottom: 28.5rpx;
}
.sidebar-box .sidebar-item.applyFor .applyFor-icon {
width: 63rpx;
height: 63rpx;
}
.sidebar-box .sidebar-item.applyFor .applyFor-text {
text-align: center;
color: #333333;
font-size: 21rpx;
}
.sidebar-box .sidebar-item.applyFor .applyFor-text .applyFor-text-text {
display: block;
}
@keyframes slideUp {
0% {
top: 100%;
}
100% {
top: 0;
}
}
.opinion-box {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.70588235);
display: flex;
align-items: flex-end;
animation: slidebj 0.5s forwards;
}
.opinion-box .box {
width: 100vw;
height: 960rpx;
background: linear-gradient(180deg, #f5f6f2 1%, #fff6df 35%, #f2af1c 100%);
border: none;
border-radius: 30rpx 30rpx 0 0;
box-shadow: 0 0 22.5rpx rgba(0, 0, 0, 0.10196078);
padding: 45rpx 48rpx 0;
animation: slideUp 0.5s forwards;
position: relative;
}
.opinion-box .box .sun {
width: 180rpx;
height: 159rpx;
position: absolute;
top: 30rpx;
right: 30rpx;
}
.opinion-box .box .title {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-style: normal;
font-size: 54rpx;
color: #000000;
margin-bottom: 30rpx;
}
.opinion-box .box .hint {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 28rpx;
color: #555555;
line-height: 45rpx;
white-space: pre;
margin-bottom: 42rpx;
}
.opinion-box .box .case {
width: 654rpx;
height: 603rpx;
background-color: #f6f6f6;
border-radius: 30rpx;
box-shadow: 0 0 22.5rpx rgba(0, 0, 0, 0.10196078);
flex-direction: column;
}
.opinion-box .box .case .QRcode {
width: 360rpx;
height: 360rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 9rpx;
margin-bottom: 24rpx;
}
.opinion-box .box .case .QRcode .img {
width: 327rpx;
height: 327rpx;
}
.opinion-box .box .case .prompt {
font-size: 24rpx;
letter-spacing: 1.5rpx;
color: #555555;
text-align: center;
line-height: 42rpx;
}
.huddle-box {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.70588235);
display: flex;
align-items: flex-end;
animation: slidebj 0.5s forwards;
}
.huddle-box .box {
width: 100vw;
height: 1078.5rpx;
border-radius: 45rpx 45rpx 0 0;
box-shadow: 0 0 22.5rpx rgba(0, 0, 0, 0.10196078);
animation: slideUp 0.5s forwards;
background: linear-gradient(0.0796881deg, #333275 0%, #420080 100%);
position: relative;
flex-direction: column;
align-items: center;
padding-top: 48rpx;
z-index: 1;
}
.huddle-box .box .code {
width: 100vw;
}
.huddle-box .box .bj {
width: 750rpx;
height: 1078.5rpx;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
z-index: -1;
}
.huddle-box .box .bj-bottom {
width: 189rpx;
height: 201rpx;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
.huddle-box .box .top {
width: 298.5rpx;
height: 54rpx;
margin-bottom: 19.5rpx;
}
.huddle-box .box .title {
width: 466.5rpx;
height: 129rpx;
margin-bottom: 6rpx;
}
.huddle-box .box .text {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 30rpx;
color: #FFFFFF;
text-align: center;
line-height: 45rpx;
margin-bottom: 37.5rpx;
}
.huddle-box .box .case {
width: 540rpx;
height: 600rpx;
background: linear-gradient(180deg, #f2f2f2 0%, #ebebeb 100%);
border-radius: 22.5rpx;
flex-direction: column;
align-items: center;
padding-top: 75rpx;
margin: 0 auto;
}
.huddle-box .box .case .QRcode {
width: 360rpx;
height: 360rpx;
background-color: #ffffff;
border-color: #f2f2f2;
border-radius: 15rpx;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.18431373);
margin-bottom: 39rpx;
}
.huddle-box .box .case .QRcode .img {
width: 327rpx;
height: 327rpx;
}
.huddle-box .box .case .hint .img {
width: 48rpx;
height: 48rpx;
}
.huddle-box .box .case .hint .img.img-left {
transform: rotate(180deg);
}
.huddle-box .box .case .hint .hint-text {
font-size: 27rpx;
color: #000000;
text-align: center;
line-height: 42rpx;
margin: 0 22.5rpx;
}

View File

@ -0,0 +1,92 @@
// template/open-ad/open-ad.js
const app = getApp()
Component({
/**
* 组件的属性列表
*/
properties: {
openDate: {
type: Object,
observer: function (res) {
if (res && res.image && !this.data.load) {
this.data.load = true
wx.setStorage({
key: "openAdTimer",
data: Date.now()
})
this.downloadImg(res.image)
}
}
}
},
/**
* 组件的初始数据
*/
data: {
num: 5,
state: false,
timer: null,
url: "",
},
/**
* 组件的方法列表
*/
methods: {
downloadImg(url) {
wx.downloadFile({
url,
success: (res) => {
if (res.statusCode === 200) {
this.setData({
url: res.tempFilePath
})
this.startstart()
}
},
complete: () => {
this.data.load = false
}
})
},
startstart() {
app.globalData.offerkaipingadvertisementState = true
this.setData({
state: true,
})
this.data.timer = setInterval(() => {
this.setData({
num: this.data.num - 1
})
if (this.data.num <= 0) {
this.setData({
state: false,
})
clearInterval(this.data.timer)
}
}, 1000)
},
skip() {
let url = this.data.openDate['url']
if (url.indexOf('http') == 0) url = `/pages/webview/webview?url=${url}`
else url = url
wx.navigateTo({
url
})
},
jumpOver() {
this.setData({
state: false,
})
clearInterval(this.data.timer)
},
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,73 @@
/* template/open-ad/open-ad.wxss */
.pop {
position: fixed;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.8);
width: 100vw;
height: 100vh;
z-index: 9999999;
display: flex;
justify-content: center;
align-items: center;
.btn {
position: absolute;
// top: 180rpx;
// right: 20rpx;
top: 80rpx;
left: 20rpx;
width: 130rpx;
height: 45rpx;
line-height: 45rpx;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 40rpx;
color: #FFFFFF;
font-size: 26rpx;
display: flex;
align-items: center;
.num {
width: 45rpx;
height: 45rpx;
border-radius: 50%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.text {
flex: 1;
text-align: center;
}
}
.img {
width: 80vw;
max-height: 100vh;
}
.skip {
position: fixed;
left: 50%;
transform: translateX(-50%);
bottom: 300rpx;
width: 45vw;
height: 80rpx;
line-height: 80rpx;
border-radius: 40vh;
background-color: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.8);
font-size: 32rpx;
.icon {
width: 24rpx;
height: 24rpx;
margin-left: 15rpx;
}
}
}

View File

@ -0,0 +1,12 @@
<!--template/open-ad/open-ad.wxml-->
<view class="pop" wx:if="{{ state }}">
<view class="btn" bind:tap="jumpOver">
<view class="num">{{ num }}</view>
<view class="text">跳过</view>
</view>
<image class="img" show-menu-by-longpress src="{{ url }}" mode="widthFix"></image>
<view class="skip" wx:if="{{ openDate.url }}" bind:tap="skip">
<view class="text">点击查看详情</view>
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/right-double-arrow.png"></image>
</view>
</view>

View File

@ -0,0 +1,65 @@
/* template/open-ad/open-ad.wxss */
.pop {
position: fixed;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.8);
width: 100vw;
height: 100vh;
z-index: 9999999;
display: flex;
justify-content: center;
align-items: center;
}
.pop .btn {
position: absolute;
top: 80rpx;
left: 20rpx;
width: 130rpx;
height: 45rpx;
line-height: 45rpx;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 40rpx;
color: #FFFFFF;
font-size: 26rpx;
display: flex;
align-items: center;
}
.pop .btn .num {
width: 45rpx;
height: 45rpx;
border-radius: 50%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.pop .btn .text {
flex: 1;
text-align: center;
}
.pop .img {
width: 80vw;
max-height: 100vh;
}
.pop .skip {
position: fixed;
left: 50%;
transform: translateX(-50%);
bottom: 300rpx;
width: 45vw;
height: 80rpx;
line-height: 80rpx;
border-radius: 40vh;
background-color: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.8);
font-size: 32rpx;
}
.pop .skip .icon {
width: 24rpx;
height: 24rpx;
margin-left: 15rpx;
}

View File

@ -0,0 +1,301 @@
import util from '../../utils/util'
Component({
/**
* 组件的属性列表
*/
properties: {
},
/**
* 组件的初始数据
*/
data: {
baseURl: "https://passport.gter.net",
tab: 'usertype',
// tab: 'cooperationCcontact',
topTitle: '请完善个人信息后再继续操作',
info: {},
nickname: "",
token: "",
startyear: [],
tabListUse: [],
tabList: [
[
"regstage",
"applyentryseasonyear",
"applyentryseason",
"planningstudycountry",
"feelinterest",
],
["regregion", "startyear"],
["regidentity", "cooperationCcontact"],
], // 完善个人信息的 流程 数据
submitList: ['planningstudycountry', 'feelinterest', 'startyear', 'cooperationCcontact'], // 最后一步的 tab
nextStepList: ['planningstudycountry', 'feelinterest', 'startyear', 'cooperationCcontact'], // 切换下一步的 tab 数据
},
/**
* 组件的方法列表
*/
methods: {
init() {
let that = this
util.wxpost("/miniprogram/Userdata").then(res => {
if (res.data.code = 200) {
// res.data.config[0].feelinterest = [{
// id: 1,
// value: '哈哈'
// }]
let data = res.data
that.setData({
config: data.config[0],
info: data.info,
nickname: data.nickname,
token: data.token
})
let planningstudycountry = that.data.config.planningstudycountry
let feelinterest = that.data.config.feelinterest
for (let i = 0; i < planningstudycountry.length; i++) {
planningstudycountry[i]['state'] = 0
}
if (feelinterest.length == 0) {
let index1 = that.data.submitList.indexOf("feelinterest")
let index2 = that.data.nextStepList.indexOf("feelinterest")
that.data.submitList.splice(index1, 1)
that.data.nextStepList.splice(index1, 1)
let index = that.data.tabList[0].indexOf('feelinterest')
that.data.tabList[0].splice(index, 1)
} else {
let index1 = that.data.submitList.indexOf("planningstudycountry")
let index2 = that.data.nextStepList.indexOf("planningstudycountry")
that.data.submitList.splice(index1, 1)
that.data.nextStepList.splice(index2, 1)
for (let i = 0; i < feelinterest.length; i++) {
feelinterest[i]["state"] = 0
}
that.data.feelinterest = feelinterest
}
that.setData({
planningstudycountry,
feelinterest,
startyear: that.data.config.startyear.slice(12)
})
}
})
},
// 分流程
flow(e) {
let index = e.currentTarget.dataset.index
let value = e.currentTarget.dataset.value
let that = this
if (index == 1) {
this.setData({
tabListUse: this.data.tabList[0]
})
} else if (index == 5) {
this.setData({
tabListUse: this.data.tabList[2]
})
} else {
this.setData({
tabListUse: this.data.tabList[1]
})
}
this.collect('usertype', value).then(res => {
if (res.code == 200) {
that.setData({
tab: this.data.tabListUse[0]
})
}
})
this.data.info['usertype'] = value
},
// 单项
selectInfo(e) {
let {
key,
value,
step
} = e.currentTarget.dataset
if (value) {
// this.data.info[key] = value
let index = 'info.' + key
this.setData({
[index]: value
})
}
if (
(key == "startyear" && value.length == 0) ||
(key == "regidentity" && value.length == 0)
) {
return;
}
if (
(this.data.tab == "planningstudycountry" &&
this.data.info.planningstudycountry.length == 0) ||
(this.data.tab == "feelinterest" && this.data.info.feelinterest.length == 0)
) {
wx.showToast({
title: '请选择选项',
icon: 'error',
})
return;
}
// 提交数据 并且 切换数据
this.collect(key, value).then(res => {
if (res.code == 200) {
if (this.data.info[key] == undefined || this.data.info[key].length != 0) {
for (let i = 0; i < this.data.tabListUse.length; i++) {
if (this.data.tab === this.data.tabListUse[i]) {
this.setData({
tab: this.data.tabListUse[i + 1]
})
break;
}
}
if (this.data.submitList.indexOf(key) != -1) {
this.skip()
}
// 判断 是否需要修改头部的 title
if (this.data.nextStepList.indexOf(this.data.tab) != -1) {
this.amendTopTitle()
}
} else {
// this.$swal("请选择选项", "", "info");
wx.showToast({
title: '请选择选项',
icon: 'error'
})
}
}
})
},
// 1.多项
multipleChoice(e) {
let {
key,
value,
} = e.currentTarget.dataset
let keyList = e.currentTarget.dataset.keylist
// 判断是否已经选中
if (!value.state) {
this.data.info[key].push(value);
} else {
for (let i = 0; i < this.data.info[key].length; i++) {
if (this.data.info[key][i].id == value.id) {
this.data.info[key].splice(i, 1);
}
}
}
if (keyList) {
for (let i = 0; i < this.data[keyList].length; i++) {
if (this.data[keyList][i].value == value.value) {
this.data[keyList][i]["state"] = this.data[keyList][i].state ? 0 : 1
this.setData({
[keyList]: this.data[keyList]
})
}
}
}
this.setData({
info: this.data.info
})
},
bindPickerChange(e) {
this.setData({
'info.startyear': this.data.config.startyear[e.detail.value * 1 + 12].id
})
},
// 提交数据
submit() {},
bindInput(e) {
let value = e.detail.value
let key = e.target.dataset.key
let index = 'info.' + key
this.setData({
[index]: value
})
},
// 提示选项没选
promptOption() {
wx.showToast({
title: '请选择对应的选项',
icon: 'none'
})
},
// 点击跳转页面
skip() {
util.wxpost("/miniprogram/userdata/success", {
token: this.data.token
}).then(res => {
console.log(res);
})
wx.setNavigationBarColor({
backgroundColor: '#ffffff',
frontColor: '#000000',
})
wx.showToast({
title: '已完成,感谢操作!',
icon: 'none',
})
this.triggerEvent("revampInformationState")
},
// 判断是否是最后一步 需要修改 头部 topTitle
amendTopTitle() {
this.setData({
topTitle: '感谢你的操作,这是最后一步'
})
},
//
collect(step, value) {
return new Promise((resolve, reject) => {
util.wxpost("/miniprogram/Userdata/collect", {
token: this.data.token,
step: step,
value: value
}).then(res => {
resolve(res)
}).catch(res => {
reject(res)
})
})
},
copy() {
util.copy(this.data.config.cooperation.email, "复制成功")
}
},
// 生命周期
lifetimes: {
attached() {
this.init()
wx.setNavigationBarColor({
backgroundColor: '#ffffff',
frontColor: '#ffffff',
})
}
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,137 @@
<view class="mask">
<view class="main">
<view class="reminder">{{ topTitle }}</view>
<view class="daBox">
<!-- 您目前的状态? -->
<view wx:if="{{tab == 'usertype'}}">
<view class="Title">您目前的状态?</view>
<!-- 目前的状态? -->
<view class="box">
<view class="twoLines">
<view class="twoLines-item" wx:for="{{ config.usertype }}" wx:key="id" bindtap="flow" data-index="{{ item.id }}" data-value="{{ item.value }}">
<i class="icon" style="background-image: url('{{ item.icon }}');"></i>
<text>{{ item.value }}</text>
</view>
</view>
</view>
</view>
<!-- 所处阶段 -->
<view wx:elif="{{tab == 'regstage'}}">
<template is="twoLinesIcon" data="{{ data:config.regstage ,title:'所处阶段',key:'regstage' }}"></template>
</view>
<!-- 申请入学年份 -->
<view wx:elif="{{ tab == 'applyentryseasonyear'}}">
<view class="Title">申请入学年份</view>
<view class="applyentryseasonyear-box">
<view class="applyentryseasonyear-item" wx:for="{{config.applyentryseasonyear}}" wx:key="id" bindtap="selectInfo" data-key="applyentryseasonyear" data-value="{{ item.id }}">
{{ item.id }}<text class="nian">年</text>
</view>
</view>
</view>
<!-- 申请入学季节 -->
<view wx:elif="{{ tab == 'applyentryseason'}}">
<template is="twoLinesIcon" data="{{ data:config.applyentryseason,title:'申请入学季节',key:'applyentryseason'}}"></template>
</view>
<!-- 计划留学国家/地区 -->
<view wx:elif="{{ tab == 'planningstudycountry'}}">
<template is="threeLines" data="{{ data:planningstudycountry,title:'计划留学国家/地区',key:'planningstudycountry' }}"></template>
<view wx:if="{{ info.planningstudycountry.length > 0 }}" class="OK" bindtap="selectInfo" data-key="planningstudycountry" data-value="{{ info.planningstudycountry }}">OK</view>
<view wx:else class="OK" bindtap="promptOption">OK</view>
</view>
<!-- 选择你感觉兴趣的 -->
<view wx:elif="{{ tab == 'feelinterest'}}">
<template is="threeLines" data="{{ data:feelinterest, title:'选择你感觉兴趣的', key:'feelinterest'}}"></template>
<view wx:if="{{ info.feelinterest.length > 0 }}" class="OK" bindtap="selectInfo" data-key="feelinterest" data-value="{{ info.feelinterest }}">OK</view>
<view wx:else class="OK" bindtap="promptOption">OK</view>
</view>
<!-- 留学国家/地区 -->
<view wx:elif="{{ tab == 'regregion'}}">
<view class="Title">留学国家/地区</view>
<view class="threeLines">
<view class="threeLines-item {{ item.state == 1 ? 'greenPitchOn' : ''}}" wx:for="{{ config.regregion }}" wx:key="id" bindtap="selectInfo" data-key="{{ 'regregion' }}" data-value="{{ item.value }}">
{{ item.value }}
</view>
</view>
</view>
<!-- 入学年份 -->
<view wx:elif="{{ tab == 'startyear'}}">
<view class="Title">入学年份</view>
<view class="year-box">
<view class="enrollmentYearline"></view>
<view class="enrollmentYearline" style="left: 423.75rpx;"></view>
<view class="year-item" wx:for="{{ config.startyear }}" wx:key="id" wx:if="{{index < 12}}" bindtap="selectInfo" data-key="{{'startyear'}}" data-value="{{ item.id }}">
{{ item.id }}<text class="nian">年</text>
</view>
</view>
<!-- 其它 -->
<view class="other">
<label for="other">其它:</label>
<picker class="otherPicker" bindchange="bindPickerChange" value="{{index}}" range="{{startyear}}" range-key="value">
<input class="otherInput" id="other" model:value="{{info.startyear}}" disabled placeholder="请选择" />
</picker>
<view wx:if="{{info.startyear > 0}}" class="otherOK greenBj" bindtap="selectInfo" data-value="{{ info.startyear }}" data-key="startyear">OK</view>
<view wx:else class="otherOK">OK</view>
</view>
</view>
<!-- 你是? -->
<view wx:elif="{{ tab == 'regidentity'}}">
<template is="twoLines" data="{{data:config.regidentity,title:'您是?',key:'regidentity'}}"></template>
<!-- 其它 -->
<view class="other">
<label for="other">其它:</label>
<input class="otherInput" id="other" value="" placeholder="请填写" model:value="{{info.regidentity}}" bindinput="bindInput" data-key="regidentity" />
<view wx:if="{{info.regidentity.length > 0}}" class="otherOK greenBj'" bindtap="selectInfo" data-key="regidentity" data-value="{{info.regidentity}}">OK</view>
<view wx:else class="'otherOK">OK</view>
</view>
</view>
<!-- 合作请联系 -->
<view class="cooperationCcontact" wx:elif="{{ tab == 'cooperationCcontact'}}">
<view class="cooperationCcontact-Title">合作请联系</view>
<view class="cooperationCcontact-box">
<view class="cooperationCcontact-yx">{{ config.cooperation.email }}</view>
<view class="cooperationCcontact-btn" catchtap="copy">复制Email</view>
</view>
<view class="skip" bindtap="skip">知道了</view>
</view>
</view>
</view>
</view>
<!-- 信息中两列的模板 有图标 -->
<template name="twoLinesIcon">
<view class="Title">{{ title}}</view>
<view class="twoLines">
<view class="twoLines-item" wx:for="{{ data }}" wx:key="id" bindtap="selectInfo" data-key="{{key}}" data-value="{{ item.value }}">
<i class="icon" style="background-image: url('{{ item.icon }}')"></i>
<text>{{ item.value }}</text>
</view>
</view>
</template>
<!-- 信息中两列的模板 没有图标 -->
<template name="twoLines">
<view class="Title">{{ title}}</view>
<view class="twoLines">
<view class="twoLines-item" wx:for="{{ data }}" wx:key="id" bindtap="selectInfo" data-key="{{key}}" data-value="{{ item.value }}">
<text>{{ item.value }}</text>
</view>
</view>
</template>
<!-- 信息中三列的模板 -->
<template name="threeLines">
<view class="Title">{{ title }}</view>
<view class="threeLines">
<view class="threeLines-item {{ item.state == 1 ? 'greenPitchOn' : ''}}" wx:for="{{ data }}" wx:key="id" bindtap="multipleChoice" data-key="{{ key }}" data-value="{{ item }}" data-keyList="{{ key }}">
{{ item.value }}
</view>
</view>
</template>

View File

@ -0,0 +1,278 @@
.mask {
height: 1000%;
width: 100vw;
background-color: rgba(0, 0, 0, 0.5);
/* position: absolute; */
position: fixed;
top: 0;
z-index: 1004;
}
.main {
position: fixed;
bottom: 0;
left: 0;
border-radius: 25rpx 25rpx 0 0;
background-color: #fff;
overflow: hidden;
z-index: 9;
}
.daBox {
padding: 50rpx 65rpx 60rpx;
}
.Title {
font-size: 30rpx;
font-weight: bold;
margin-bottom: 50rpx;
}
.box {
background-color: #fff;
}
.reminder {
height: 75rpx;
line-height: 75rpx;
width: 100vw;
font-size: 25rpx;
background-color: #e0f9f1;
color: #2dd8a2;
text-align: center;
/* border-radius: 50rpx 50rpx 0 0; */
}
.icon {
margin-right: 16rpx;
display: block;
width: 48rpx;
height: 48rpx;
background-size: contain;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAES0lEQVR4nO2aXWhURxiGn5hIRUxUSEBR1Avv2m2pQgMi2EpKNVoh9qJNqReFXlgVpDeiXqkQUGmLaEEK7YVCxIChhVCspaVgU1B60yooSGktqGkVwb+akL/1YvYks9/O2T2zZ87MqvvCsGfOz/t977uzM2dnBup4vtEYIOYCYBfwOnAV+D9ADkExCOQL5XzgXIJgnGkDxgLnQkOAmPkayGEKM0IGrwXUDQidQGjUDQidQGhUMqADuAv8CazPPp1U6AI+A9pdkv7A9Jg9WgiSFpMa56QDPoB9GucIsNwRL79pxK5MuKrxXUnJBcXio/KeA14AOlFvay5NWAEMFMqrKfMzif8XaE3JW4QPgAnct4S0MIm/DbycRbDthmAhTfAqPsJ+Q9BR1M/EJ0zi75Cx+AhHDcGv+whcQJchvjfxoP65nRAJ/O0rOPApAcVHaAIOAxeBn4E3PMZuB4ZR4ocIIL4W0AzkgNmhE6njWUDQ6ShgLtBS+JxA/enyOk9YrQFNqMTnoZLXhbRox/NFXT+eZ+B9BHwJ7EW9Y9QU5gA9qGFPjsWuSx/hW2cRWlDDXtbC9fKOF2UJcZxsRA4D/wHXgFviWp8PYU0J71tnOPegUO6L43vaOXktuh7V9d/5auAXrb4kqYg0SGqAfOl4E/jRcS4yxohjfiOSTopeE/UeVKfoEi2ift8xvxFJW8DXqCYa4TXgDLAJd8PVXFG3NaADlc8LFe77C/gCy1XpBuA0pZ1YL+6m1j8R3Mcsns1ROmtVrnwbPZg0+TywBfhGnH8f+Nwi0XJI0wJy2H0Ra6MDm4fGgHcpNWEn8JEFTxyaRf2BxbPnsTNsIDpI2gdEGAN2AG9R3Gt3A19ZckmkaQE3gJdQ3+ysCvcOAWejiq0BbcD3lA5Zg5Y8JqQdBW4AJx3kEYs24BKlHUo/MNMB/znBW1NLcVmLB7gguFc54k0NH+JBLZPp/C865K4avsQD3BQxFjvmt0Yb8Ad+xAM8FHFkp+gVvsU3UrxsPkHAzRu+xYOaOtNj3csoTkW0kp34hahtsiYsFfH+SRmrKswAfiUb8XtQO0THC8cSORHzcsp4VWEj2Yg3rebuE/esFtfLvVlmshcI4BB+xJtM6BTXvovh01eHR1H/Rp3hmEgiS/HShG5x/lQMp1wdngC2psxzCjtikqsGcTs4zhrO96BmnPRzcZMh7ahvXr93EtidItcptKH+gaU1IU58DtWq+g3XZfm4DP9mSk3IAwdxsJjytoHcxoQke3cqmXCb0rkBiTgTjuPgBarLQJ7EBJuNSzOBIxS//eVRiyMrE+YZZ0IvDl7YbE2odtfWMmAbqh/YjnnBtBziTDhgyWNEUhOCbFnTYDLhJ1fklUwIumVNw2bgMdND44euyaUJPYVSC+IjzEf1H4uyIN+AWqsrN3T5bPZBUM6EZ158hDXA7xS/ip7D4f78pwULgFdQv7s66niK8QQ3olH2ufUz2wAAAABJRU5ErkJggg==);
}
.twoLines {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.twoLines-item {
border-radius: 5rpx;
background-color: #f2f2f2;
display: flex;
align-items: center;
justify-content: center;
width: 292rpx;
height: 105rpx;
line-height: 105rpx;
margin-bottom: 30rpx;
font-size: 25rpx;
overflow: hidden;
}
.applyentryseasonyear-box {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.applyentryseasonyear-item,
.year-item {
font-size: 34rpx;
font-weight: bolder;
text-align: center;
width: 292rpx;
height: 105rpx;
line-height: 105rpx;
background-color: #f2f2f2;
margin-bottom: 30rpx;
border-radius: 5rpx;
overflow: hidden;
}
.nian {
font-size: 20rpx;
font-weight: normal;
}
.threeLines {
display: flex;
flex-wrap: wrap;
font-size: 28rpx;
}
.threeLines-item {
width: 192rpx;
height: 105rpx;
line-height: 105rpx;
text-align: center;
background-color: #f2f2f2;
margin-bottom: 30rpx;
margin-right: 18rpx;
border-radius: 5rpx;
overflow: hidden;
}
.threeLines-item:nth-of-type(3n) {
margin-right: 0;
}
.OK {
height: 90rpx;
line-height: 90rpx;
text-align: center;
border-radius: 50rpx;
color: #fff;
background-color: #26d79f;
margin-top: 23rpx;
}
.other {
display: flex;
background-color: #f2f2f2;
height: 75rpx;
line-height: 75rpx;
padding-left: 28rpx;
border-radius: 5rpx;
font-size: 26rpx;
}
.other .otherInput {
line-height: 75rpx;
height: 75rpx;
padding-left: 14rpx;
flex: 1;
}
.other .otherPicker {
line-height: 75rpx;
height: 75rpx;
padding-left: 14rpx;
flex: 1;
}
.other .otherOK {
line-height: 75rpx;
height: 75rpx;
width: 135rpx;
background-color: #d7d7d7;
border-radius: 0 5rpx 5rpx 0;
text-align: center;
font-size: 22rpx;
font-weight: bold;
color: #fff;
}
.cooperationCcontact {
text-align: center;
}
.QRcode {
/* background-image: url(https://ada.xiaoapi.com/gter/yifang/images/%E3%80%905_0%E3%80%91%E5%AE%8C%E5%96%84%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF/u1036.svg); */
background-size: cover;
width: 195rpx;
height: 195rpx;
display: block;
margin: 0 auto;
}
.skip {
width: 240rpx;
height: 70rpx;
line-height: 70rpx;
text-align: center;
border-radius: 50rpx;
border: 2rpx solid #d4d4d4;
margin: 0 auto;
font-size: 26rpx;
}
.hint {
font-size: 21rpx;
line-height: 21rpx;
text-align: center;
margin-top: 36rpx;
}
.indication {
text-align: center;
height: 40rpx;
line-height: 40rpx;
background-color: #fbf6eb;
font-size: 25rpx;
color: #d48f29;
padding: 0 20rpx;
display: inline-block;
margin: 0 auto;
vertical-align: middle;
margin-top: 28rpx;
margin-bottom: 97rpx;
border-radius: 5rpx;
}
.cooperationCcontact-Title {
margin-top: 32rpx;
margin-bottom: 50rpx;
font-weight: bold;
font-size: 32rpx;
line-height: 32rpx;
}
.year-box {
display: flex;
position: relative;
flex-wrap: wrap;
flex-direction: column;
flex-flow: column wrap;
place-content: space-between;
height: 390rpx;
margin-bottom: 50rpx;
}
.enrollmentYearline {
position: absolute;
height: 380rpx;
border-left: 3rpx dotted rgb(215, 215, 215);
left: 196.25rpx;
}
.year-item {
width: 165rpx;
height: 75rpx;
line-height: 75rpx;
margin-bottom: 10rpx;
overflow: hidden;
}
.greenBj {
background-color: rgb(38, 215, 159) !important;
}
.greenPitchOn {
background-color: rgba(38, 215, 159, 0.204) !important;
}
.cooperationCcontact-box {
height: 150rpx;
background-color: rgb(242, 242, 242);
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-bottom: 50rpx;
border-radius: 7.5rpx;
padding: 20rpx;
}
.cooperationCcontact-btn {
width: 150rpx;
height: 60rpx;
line-height: 60rpx;
font-size: 26rpx;
background-color: rgb(51, 51, 51);
color: #fff;
border-radius: 750rpx;
margin-top: 20rpx;
}

View File

@ -0,0 +1,73 @@
// template/projectShowText/projectShowText.js
var miucms = require('../../utils/miucms.js');
let app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Component({
/**
* 组件的属性列表
*/
properties: {
className: String,
titleName: String,
text: {
type: String,
observer(res) {
if (res && res.length > 20) this.init()
}
}
},
/**
* 组件的初始数据
*/
data: {
text: "",
height: 0,
page: [],
current: 0,
isswiper: false,
},
/**
* 组件的方法列表
*/
methods: {
init() {
// const height = util.rpxTopx(510)
const lineHeight = util.rpxTopx(51)
const height = lineHeight * 10
const query = wx.createSelectorQuery();
query.select(`.main >>> .hide.text.${ this.data.className }`).boundingClientRect(rect => {
const page = rect.height / height
// console.log("rect.height", rect.height);
let arr = []
for (let i = 0; i < Math.floor(page); i++) {
arr.push(height)
}
const decimalPart = parseFloat('0.' + page.toString().split('.')[1]);
if (decimalPart > 0) arr.push(height * decimalPart)
this.setData({
page: arr,
height,
isswiper: true,
})
}).exec();
},
// 招生官 轮播图 修改状态
bindchange(e) {
this.setData({
current: e.detail.current
})
},
},
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,67 @@
/* template/projectShowText/projectShowText.wxss */
.box {
position: relative;
padding-top: 30rpx;
padding-bottom: 34.5rpx;
.head {
position: relative;
text-align: center;
font-weight: 650;
font-size: 30rpx;
color: #000000;
padding-bottom: 30rpx;
.icon {
position: absolute;
top: -30rpx;
width: 24rpx;
height: 13.5rpx;
left: 50%;
transform: translateX(-50%);
}
}
swiper {
height: 510rpx;
}
.text {
word-break: break-all;
// height: 510rpx;
font-size: 27rpx;
color: #000000;
line-height: 51rpx;
white-space: pre-line;
padding: 0 22.5rpx;
overflow: hidden;
width: 567rpx;
&.hide {
position: absolute;
height: auto;
}
}
.pilot {
margin-top: 24rpx;
display: flex;
justify-content: center;
align-items: center;
.item {
width: 15rpx;
height: 6rpx;
background-color: rgba(215, 215, 215, 1);
border-radius: 30rpx;
&.pitch {
background-color: rgba(250, 107, 17, 1);
}
&:not(:last-of-type) {
margin-right: 6rpx;
}
}
}
}

View File

@ -0,0 +1,25 @@
<!--template/projectShowText/projectShowText.wxml-->
<view class="box">
<view class style="position: relative;height: 0;width: 0;overflow: hidden;">
<view class="hide text {{ className }}">{{ text }}</view>
</view>
<view class="head" wx:if="{{ titleName }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
{{ titleName }}
</view>
<block wx:if="{{ isswiper }}">
<swiper bindchange="bindchange" style="height: {{ page[0] }}px;">
<swiper-item wx:for="{{ page }}" wx:key="index">
<view class="text" style="margin-top: -{{ index * height }}px;">{{ text }}</view>
</swiper-item>
</swiper>
<view class="pilot" wx:if="{{ page.length > 1 }}">
<view class="item {{ index == current ? 'pitch' : '' }}" wx:for="{{ page }}" wx:key="index"></view>
</view>
</block>
<view wx:else class="text" style="text-align: center;">{{ text }}</view>
</view>

View File

@ -0,0 +1,57 @@
/* template/projectShowText/projectShowText.wxss */
.box {
position: relative;
padding-top: 30rpx;
padding-bottom: 34.5rpx;
}
.box .head {
position: relative;
text-align: center;
font-weight: 650;
font-size: 30rpx;
color: #000000;
padding-bottom: 30rpx;
}
.box .head .icon {
position: absolute;
top: -30rpx;
width: 24rpx;
height: 13.5rpx;
left: 50%;
transform: translateX(-50%);
}
.box swiper {
height: 510rpx;
}
.box .text {
word-break: break-all;
font-size: 27rpx;
color: #000000;
line-height: 51rpx;
white-space: pre-line;
padding: 0 22.5rpx;
overflow: hidden;
width: 567rpx;
}
.box .text.hide {
position: absolute;
height: auto;
}
.box .pilot {
margin-top: 24rpx;
display: flex;
justify-content: center;
align-items: center;
}
.box .pilot .item {
width: 15rpx;
height: 6rpx;
background-color: #d7d7d7;
border-radius: 30rpx;
}
.box .pilot .item.pitch {
background-color: #fa6b11;
}
.box .pilot .item:not(:last-of-type) {
margin-right: 6rpx;
}

View File

@ -0,0 +1,54 @@
// template/rent-pop/rent-pop.js
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Component({
/**
* 组件的属性列表
*/
properties: {
popup: {
type: Object,
observer(res) {
if (!res) return
this.setData({
state: true,
})
}
}
},
/**
* 组件的初始数据
*/
data: {
state: false,
},
/**
* 组件的方法列表
*/
methods: {
close() {
this.setData({
state: false
})
},
skip() {
util.statistics({
name: this.data.popup.statEvent
})
if (this.data.popup.applet?.appid) {
wx.navigateToMiniProgram({
appId: this.data.popup.applet.appid,
path: this.data.popup.applet.path,
})
} else {
common.goPage("/pages/webview/webview?url=" + encodeURIComponent(this.data.popup.url || ''))
}
this.close()
},
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,301 @@
/* template/rent-pop/rent-pop.wxss */
view {
box-sizing: border-box;
}
/* 公共的 css 样式 */
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.flexcolumn {
display: flex;
flex-direction: column;
}
.pop {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.717647058823529);
z-index: 100;
}
.box {
width: 630rpx;
height: 990rpx;
position: relative;
z-index: 1;
margin-bottom: 49.5rpx;
transform-style: preserve-3d;
// animation: rotateAnimation .3s;
@keyframes rotateAnimation {
0% {
transform: rotateY(180deg);
}
100% {
transform: rotateY(0deg);
}
}
.star {
position: absolute;
}
.star1 {
width: 60rpx;
height: 60rpx;
top: 649.5rpx;
left: -60rpx;
}
.star2 {
width: 72rpx;
height: 72rpx;
top: -85.5rpx;
right: 66rpx;
}
.star3 {
width: 78rpx;
height: 78rpx;
right: -30rpx;
bottom: -76.5rpx;
}
.bj {
width: 630rpx;
height: 990rpx;
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
.city-bj {
width: 630rpx;
height: 517.5rpx;
position: absolute;
left: 0;
bottom: 0;
z-index: -1;
}
.head {
position: relative;
margin: 0 auto;
width: 300rpx;
display: flex;
.head-bj {
position: absolute;
left: -7.5rpx;
top: -7.5rpx;
width: 315rpx;
height: 228rpx;
transform: rotate(180deg);
z-index: -1;
}
.head-box {
height: 84rpx;
position: relative;
z-index: 1;
width: 300rpx;
.icon {
width: 30rpx;
height: 30rpx;
margin-right: 6rpx;
}
.xg {
width: 67.5rpx;
height: 43.5rpx;
}
}
}
.main {
width: 561rpx;
height: 843rpx;
background: linear-gradient(180deg, rgba(247, 247, 247, 1) 1%, rgba(242, 242, 242, 1) 100%);
border: 1rpx solid rgba(51, 51, 51, 1);
margin-left: 40.5rpx;
position: relative;
z-index: 1;
.main-bj {
position: absolute;
top: 10.5rpx;
left: -10.5rpx;
width: 561rpx;
height: 843rpx;
background: linear-gradient(180deg, rgba(247, 247, 247, 1) 1%, rgba(242, 242, 242, 1) 100%);
border: 1rpx solid rgba(51, 51, 51, 1);
z-index: -10;
padding-top: 24rpx;
.title {
width: 487.5rpx;
height: 75rpx;
margin-bottom: 18rpx;
}
.title-line {
width: 481.5rpx;
height: 3rpx;
margin-bottom: 22.5rpx;
}
.hint {
width: 387rpx;
height: 54rpx;
margin-bottom: 28.5rpx;
}
.data {
position: relative;
width: 480rpx;
height: 136rpx;
z-index: 1;
margin-bottom: 35rpx;
.data-bj {
width: 480rpx;
height: 136rpx;
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
.item {
text-align: center;
.value {
font-family: 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 42rpx;
color: #000000;
text-align: center;
}
.text {
color: #333333;
font-size: 27rpx;
}
}
.line {
width: 1rpx;
height: 94.5rpx;
border-right: 1rpx dotted #797979;
margin: 0 52.5rpx;
}
}
.img-box {
width: 480rpx;
height: 376.5rpx;
position: relative;
z-index: 1;
margin-bottom: 10rpx;
.img {
position: absolute;
left: -10.5rpx;
top: -10.5rpx;
width: 501rpx;
height: 397.5rpx;
z-index: -1;
}
.text {
font-weight: 400;
font-style: normal;
font-size: 22.5rpx;
color: #555555;
text-align: center;
position: absolute;
width: 100%;
text-align: center;
bottom: 20rpx;
}
}
.arrows {
.icon {
&:nth-child(2) {
margin: 0 15rpx;
}
width: 45rpx;
height: 45rpx;
}
}
}
}
}
.btn {
position: relative;
width: 450rpx;
height: 96rpx;
background: -webkit-linear-gradient(270deg, rgba(252, 253, 206, 1) 0%, rgba(210, 213, 29, 1) 52%, rgba(251, 252, 203, 1) 100%);
background: -moz-linear-gradient(180deg, rgba(252, 253, 206, 1) 0%, rgba(210, 213, 29, 1) 52%, rgba(251, 252, 203, 1) 100%);
background: linear-gradient(180deg, rgba(252, 253, 206, 1) 0%, rgba(210, 213, 29, 1) 52%, rgba(251, 252, 203, 1) 100%);
border: none;
border-radius: 225rpx;
.img {
width: 199.5rpx;
height: 70.5rpx;
margin-right: 18rpx;
}
.arrows {
width: 45rpx;
height: 45rpx;
}
}
.close {
width: 36rpx;
height: 36rpx;
position: absolute;
bottom: -100rpx;
}
.imgimg {
width: 100vw;
height: 500rpx;
}

View File

@ -0,0 +1,57 @@
<!--template/rent-pop/rent-pop.wxml-->
<!-- <view class="pop flexcenter flexcolumn" wx:if="{{ state }}" bind:tap="close" catch:touchmove="return"> -->
<view class="pop flexcenter flexcolumn" wx:if="{{ state }}" bind:tap="close" catch:touchmove="return">
<block wx:if="{{ false }}">
<view class="box flexcolumn" catch:tap="return">
<image class="star star1" src="https://app.gter.net/image/miniApp/offer/rent-pop/star.png" mode="widthFix"></image>
<image class="star star2" src="https://app.gter.net/image/miniApp/offer/rent-pop/star.png" mode="widthFix"></image>
<image class="star star3" src="https://app.gter.net/image/miniApp/offer/rent-pop/star.png" mode="widthFix"></image>
<image class="city-bj" src="https://app.gter.net/image/miniApp/offer/rent-pop/city-bj.svg" mode="widthFix"></image>
<image class="bj" src="https://app.gter.net/image/miniApp/offer/rent-pop/bj.svg" mode="widthFix"></image>
<view class="head">
<view class="head-box flexcenter">
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/rent-pop/location.png"></image>
<image class="xg" mode="" src="https://app.gter.net/image/miniApp/offer/rent-pop/xg.png"></image>
</view>
<image class="head-bj" src="https://app.gter.net/image/miniApp/offer/rent-pop/trapezoid.svg" mode="widthFix"></image>
</view>
<view class="main">
<view class="main-bj flexacenter flexcolumn">
<image class="title" src="https://app.gter.net/image/miniApp/offer/rent-pop/title.png"></image>
<image class="title-line" src="https://app.gter.net/image/miniApp/offer/rent-pop/title-line.svg"></image>
<image class="hint" src="https://app.gter.net/image/miniApp/offer/rent-pop/hint.png"></image>
<view class="data flexcenter">
<image class="data-bj" src="https://app.gter.net/image/miniApp/offer/rent-pop/data-bj.svg"></image>
<view class="item">
<view class="value">40+</view>
<view class="text">学生公寓</view>
</view>
<view class="line"></view>
<view class="item">
<view class="value">5000+</view>
<view class="text">真实房源</view>
</view>
</view>
<view class="img-box">
<image class="img" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/rent-pop/apartment-img.svg"></image>
<view class="text">@ 学生公寓实景照片</view>
</view>
<view class="arrows flexacenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/rent-pop/arrows3.png" mode="widthFix"></image>
<image class="icon" src="https://app.gter.net/image/miniApp/offer/rent-pop/arrows3.png" mode="widthFix"></image>
<image class="icon" src="https://app.gter.net/image/miniApp/offer/rent-pop/arrows3.png" mode="widthFix"></image>
</view>
</view>
</view>
</view>
<view class="btn flexcenter" catch:tap="skip">
<image class="img" src="https://app.gter.net/image/miniApp/offer/rent-pop/btn-text.png" mode="widthFix"></image>
<image class="arrows" src="https://app.gter.net/image/miniApp/offer/rent-pop/arrows.png" mode="widthFix"></image>
<image class="close" catch:tap="close" src="https://app.gter.net/image/miniApp/offer/close-icon.png"></image>
</view>
</block>
<image wx:else class="imgimg" src="{{ popup.image }}" mode="widthFix" catch:tap="skip"></image>
</view>

View File

@ -0,0 +1,251 @@
/* template/rent-pop/rent-pop.wxss */
view {
box-sizing: border-box;
}
/* 公共的 css 样式 */
.flexflex {
display: flex;
}
.flexcenter {
display: flex;
justify-content: center;
align-items: center;
}
.flexjcenter {
display: flex;
justify-content: center;
}
.flexacenter {
display: flex;
align-items: center;
}
.flex1 {
flex: 1;
}
.flexcolumn {
display: flex;
flex-direction: column;
}
.pop {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.71764706);
z-index: 100;
}
.box {
width: 630rpx;
height: 990rpx;
position: relative;
z-index: 1;
margin-bottom: 49.5rpx;
transform-style: preserve-3d;
}
@keyframes rotateAnimation {
0% {
transform: rotateY(180deg);
}
100% {
transform: rotateY(0deg);
}
}
.box .star {
position: absolute;
}
.box .star1 {
width: 60rpx;
height: 60rpx;
top: 649.5rpx;
left: -60rpx;
}
.box .star2 {
width: 72rpx;
height: 72rpx;
top: -85.5rpx;
right: 66rpx;
}
.box .star3 {
width: 78rpx;
height: 78rpx;
right: -30rpx;
bottom: -76.5rpx;
}
.box .bj {
width: 630rpx;
height: 990rpx;
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
.box .city-bj {
width: 630rpx;
height: 517.5rpx;
position: absolute;
left: 0;
bottom: 0;
z-index: -1;
}
.box .head {
position: relative;
margin: 0 auto;
width: 300rpx;
display: flex;
}
.box .head .head-bj {
position: absolute;
left: -7.5rpx;
top: -7.5rpx;
width: 315rpx;
height: 228rpx;
transform: rotate(180deg);
z-index: -1;
}
.box .head .head-box {
height: 84rpx;
position: relative;
z-index: 1;
width: 300rpx;
}
.box .head .head-box .icon {
width: 30rpx;
height: 30rpx;
margin-right: 6rpx;
}
.box .head .head-box .xg {
width: 67.5rpx;
height: 43.5rpx;
}
.box .main {
width: 561rpx;
height: 843rpx;
background: linear-gradient(180deg, #f7f7f7 1%, #f2f2f2 100%);
border: 1rpx solid #333333;
margin-left: 40.5rpx;
position: relative;
z-index: 1;
}
.box .main .main-bj {
position: absolute;
top: 10.5rpx;
left: -10.5rpx;
width: 561rpx;
height: 843rpx;
background: linear-gradient(180deg, #f7f7f7 1%, #f2f2f2 100%);
border: 1rpx solid #333333;
z-index: -10;
padding-top: 24rpx;
}
.box .main .main-bj .title {
width: 487.5rpx;
height: 75rpx;
margin-bottom: 18rpx;
}
.box .main .main-bj .title-line {
width: 481.5rpx;
height: 3rpx;
margin-bottom: 22.5rpx;
}
.box .main .main-bj .hint {
width: 387rpx;
height: 54rpx;
margin-bottom: 28.5rpx;
}
.box .main .main-bj .data {
position: relative;
width: 480rpx;
height: 136rpx;
z-index: 1;
margin-bottom: 35rpx;
}
.box .main .main-bj .data .data-bj {
width: 480rpx;
height: 136rpx;
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
.box .main .main-bj .data .item {
text-align: center;
}
.box .main .main-bj .data .item .value {
font-family: 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 42rpx;
color: #000000;
text-align: center;
}
.box .main .main-bj .data .item .text {
color: #333333;
font-size: 27rpx;
}
.box .main .main-bj .data .line {
width: 1rpx;
height: 94.5rpx;
border-right: 1rpx dotted #797979;
margin: 0 52.5rpx;
}
.box .main .main-bj .img-box {
width: 480rpx;
height: 376.5rpx;
position: relative;
z-index: 1;
margin-bottom: 10rpx;
}
.box .main .main-bj .img-box .img {
position: absolute;
left: -10.5rpx;
top: -10.5rpx;
width: 501rpx;
height: 397.5rpx;
z-index: -1;
}
.box .main .main-bj .img-box .text {
font-weight: 400;
font-style: normal;
font-size: 22.5rpx;
color: #555555;
position: absolute;
width: 100%;
text-align: center;
bottom: 20rpx;
}
.box .main .main-bj .arrows .icon {
width: 45rpx;
height: 45rpx;
}
.box .main .main-bj .arrows .icon:nth-child(2) {
margin: 0 15rpx;
}
.btn {
position: relative;
width: 450rpx;
height: 96rpx;
background: -webkit-linear-gradient(270deg, #fcfdce 0%, #d2d51d 52%, #fbfccb 100%);
background: -moz-linear-gradient(180deg, #fcfdce 0%, #d2d51d 52%, #fbfccb 100%);
background: linear-gradient(180deg, #fcfdce 0%, #d2d51d 52%, #fbfccb 100%);
border: none;
border-radius: 225rpx;
}
.btn .img {
width: 199.5rpx;
height: 70.5rpx;
margin-right: 18rpx;
}
.btn .arrows {
width: 45rpx;
height: 45rpx;
}
.close {
width: 36rpx;
height: 36rpx;
position: absolute;
bottom: -100rpx;
}
.imgimg {
width: 100vw;
height: 500rpx;
}

View File

@ -0,0 +1,67 @@
// template/territorySelect/territorySelect.js
Component({
/**
* 组件的属性列表
*/
properties: {
type: String, // major subject
list: {
type: Object,
observer(res) {
console.log("res", res);
}
},
value: String,
},
/**
* 组件的初始数据
*/
data: {
titleObj: {
major: "请选择专业",
subject2: "请选择专业",
subject: "请选择学科领域",
school: "请选择学院领域",
},
},
/**
* 组件的方法列表
*/
methods: {
select(e) {
const key = e.currentTarget.dataset.key
const value = e.currentTarget.dataset.value || {}
let yearList = []
for (const key in value) {
yearList.push(key)
}
this.triggerEvent('closeselect', {
key,
yearList,
})
},
close() {
this.triggerEvent('closeselect')
},
// 选择学校相关的
selectSchool(e) {
const label = e.currentTarget.dataset.label
const disciplineid = e.currentTarget.dataset.disciplineid
const university = e.currentTarget.dataset.university
this.triggerEvent('closeselect', {
label,
disciplineid,
university,
})
}
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,87 @@
/* template/territorySelect/territorySelect.wxss */
.territory {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.705882352941177);
position: fixed;
top: 0;
left: 0;
z-index: 100;
display: flex;
align-items: flex-end;
.box {
width: 100vw;
background-color: rgba(255, 255, 255, 1);
border-radius: 45rpx 45rpx 0 0;
padding-top: 48rpx;
padding-bottom: 80rpx;
.title {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 30rpx;
color: #000000;
text-align: center;
margin-bottom: 31.5rpx;
}
.list {
.item {
height: 84rpx;
padding-left: 37.5rpx;
display: flex;
align-items: center;
&.pitch {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 24rpx;
color: #9A9D02;
}
&:not(:last-of-type) {
.content {
border-bottom: 1rpx dotted #ebebeb;
}
}
.dot {
width: 12rpx;
height: 12rpx;
background-color: rgba(246, 246, 189, 1);
border: 1rpx solid rgba(204, 208, 3, 1);
border-radius: 58.5rpx;
margin-right: 33rpx;
}
.content {
height: 100%;
padding-right: 37.5rpx;
display: flex;
align-items: center;
flex: 1;
.name {
font-size: 27rpx;
color: #333333;
flex: 1;
}
.sum {
// width: 32px;
height: 33rpx;
line-height: 33rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 225rpx;
font-size: 21rpx;
color: #026277;
padding: 0 12rpx;
}
}
}
}
}
}

View File

@ -0,0 +1,15 @@
<!--template/territorySelect/territorySelect.wxml-->
<view class="territory" catch:touchmove="return" bind:tap="close">
<view class="box" catch:tap="return">
<view class="title">{{ titleObj[type] }}</view>
<scroll-view class="list" scroll-y="{{ true }}" style="max-height: 65vh;">
<view class="item {{ value === index ? 'pitch' : '' }}" wx:for="{{ list }}" wx:key="index" catch:tap="{{ type == 'subject2' || type == 'subject' || type == 'school' ? 'selectSchool' : 'select'}}" data-key="{{ index }}" data-value="{{ item }}" data-label="{{ item.name }}" data-disciplineid="{{ item.disciplineid }}" data-university="{{ item.value }}">
<view class="dot"></view>
<view class="content">
<view class="name">{{ type == 'subject2' ? item.label : (item.value || item.name || index) }}</view>
<view class="sum" wx:if="{{ (type == 'subject' || type == 'school') && item.count > 0 }}">{{ item.count }}</view>
</view>
</view>
</scroll-view>
</view>
</view>

View File

@ -0,0 +1,72 @@
/* template/territorySelect/territorySelect.wxss */
.territory {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.70588235);
position: fixed;
top: 0;
left: 0;
z-index: 100;
display: flex;
align-items: flex-end;
}
.territory .box {
width: 100vw;
background-color: #ffffff;
border-radius: 45rpx 45rpx 0 0;
padding-top: 48rpx;
padding-bottom: 80rpx;
}
.territory .box .title {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 30rpx;
color: #000000;
text-align: center;
margin-bottom: 31.5rpx;
}
.territory .box .list .item {
height: 84rpx;
padding-left: 37.5rpx;
display: flex;
align-items: center;
}
.territory .box .list .item.pitch {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 24rpx;
color: #9A9D02;
}
.territory .box .list .item:not(:last-of-type) .content {
border-bottom: 1rpx dotted #ebebeb;
}
.territory .box .list .item .dot {
width: 12rpx;
height: 12rpx;
background-color: #f6f6bd;
border: 1rpx solid #ccd003;
border-radius: 58.5rpx;
margin-right: 33rpx;
}
.territory .box .list .item .content {
height: 100%;
padding-right: 37.5rpx;
display: flex;
align-items: center;
flex: 1;
}
.territory .box .list .item .content .name {
font-size: 27rpx;
color: #333333;
flex: 1;
}
.territory .box .list .item .content .sum {
height: 33rpx;
line-height: 33rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 225rpx;
font-size: 21rpx;
color: #026277;
padding: 0 12rpx;
}

31
component/toTop/toTop.js Normal file
View File

@ -0,0 +1,31 @@
// template/toTop/toTop.js
var app = getApp()
Component({
/**
* 组件的属性列表
*/
properties: {
},
/**
* 组件的初始数据
*/
data: {
show: false
},
/**
* 组件的方法列表
*/
methods: {
toTop() {
wx.pageScrollTo({
scrollTop: 0,
})
this.triggerEvent('closeToTop')
},
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,3 @@
<view class="to-top-btn" bindtap='toTop'>
<image mode="widthFix" src="https://app.gter.net/image/miniApp/project/totop.png"></image>
</view>

View File

@ -0,0 +1,24 @@
.to-top-btn{
position: fixed;
/* right: 5px; */
right: 22rpx;
bottom: 110px;
display: flex;
align-items: center;
justify-content: center;
/* width: 50px;
height: 50px; */
width: 72rpx;
height: 72rpx;
/* line-height:50px; */
/* border:1px solid #e4e4e4; */
border-radius: 50%;
background: rgba(0,0,0,0.4);
z-index: 1003;
}
.to-top-btn image{
/* width: 23px; */
width: 32rpx;
height: 32rpx;
/* height: 23px; */
}

View File

@ -0,0 +1,50 @@
// template/wechatAlertsPop/wechatAlertsPop.js
import util from '../../utils/util'
let app = getApp()
Component({
/**
* 组件的属性列表
*/
properties: {
capsulePopState: Boolean
},
/**
* 组件的初始数据
*/
data: {
reminderState: false, // 不再提醒的状态
},
/**
* 组件的方法列表
*/
methods: {
// 点击关闭微信提醒
cutCapsulePop() {
this.setData({
capsulePopState: !this.data.capsulePopState
})
app.globalData['iswechatmessagepush'] = 1
},
// 点击不再提醒
cutReminderSate() {
this.setData({
reminderState: !this.data.reminderState
})
util.wxpost("/miniprogram/user/rejectPopup").then(res => {})
},
// 点击微信提醒的立即开启
goReminder() {
wx.navigateTo({
url: '/pagesLoginRequired/pages/wechatReminder/wechatReminder',
})
this.setData({
capsulePopState: false
})
app.globalData['iswechatmessagepush'] = 1
}
}
})

View File

@ -0,0 +1,5 @@
{
"component": true,
"usingComponents": {
}
}

View File

@ -0,0 +1,18 @@
<!-- 微信提醒的弹窗 -->
<view class="capsulePop" wx:if="{{ capsulePopState }}">
<view class="capsulePop-box">
<image bindtap="cutCapsulePop" mode="widthFix" class="capsulePop-close" src="https://app.gter.net/image/miniApp/project/close.png"></image>
<view class="capsulePop-content">
<image mode="widthFix" class="capsulePop-img" src="https://app.gter.net/image/miniApp/offer/u92.png"></image>
<view class="capsulePop-title">请开启消息通知</view>
<view class="capsulePop-hint">使用微信服务号接受实时【消息提醒】</view>
<view class="capsulePop-btn" bindtap="goReminder">立即开启</view>
</view>
<view class="capsulePop-operation" bindtap="cutReminderSate">
不再提醒
<view class="capsulePop-circle flexcenter">
<view class="capsulePop-circle-circle" wx:if="{{ reminderState }}"></view>
</view>
</view>
</view>
</view>

View File

@ -0,0 +1,118 @@
/* template/wechatAlertsPop/wechatAlertsPop.wxss */
.capsulePop {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, .5);
position: fixed;
top: 0;
left: 0;
z-index: 1100;
display: flex;
justify-content: center;
align-items: center;
}
.capsulePop .capsulePop-box {
position: relative;
width: 487.4rpx;
height: 726rpx;
display: flex;
flex-direction: column;
}
.capsulePop .capsulePop-box .capsulePop-content {
width: 487.4rpx;
height: 649.6rpx;
position: relative;
}
.capsulePop .capsulePop-box .capsulePop-img {
width: 487.4rpx;
height: 649.6rpx;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.capsulePop .capsulePop-box .capsulePop-btn {
width: 361rpx;
height: 73rpx;
border-radius: 37rpx;
background: linear-gradient(90deg, #4FE3C1, #61FEDA);
color: #fff;
font-size: 30rpx;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
bottom: 65rpx;
left: 50%;
transform: translate(-50%);
}
.capsulePop .capsulePop-box .capsulePop-hint {
width: 300rpx;
height: 68rpx;
font-size: 26rpx;
color: #555555;
line-height: 42rpx;
position: absolute;
bottom: 180rpx;
left: 50%;
transform: translate(-50%);
text-align: center;
}
.capsulePop .capsulePop-box .capsulePop-title {
color: #323232;
font-size: 36rpx;
font-weight: 600;
width: 266rpx;
position: absolute;
bottom: 280rpx;
left: 50%;
transform: translate(-50%);
text-align: center;
}
.capsulePop .capsulePop-box .capsulePop-close {
width: 44rpx;
height: 44rpx;
align-self: flex-end;
margin-right: -38rpx;
}
.capsulePop .capsulePop-box .capsulePop-operation {
color: #fff;
font-size: 31rpx;
line-height: 42rpx;
display: flex;
align-items: center;
align-self: center;
margin-top: 25rpx;
}
.capsulePop .capsulePop-box .capsulePop-operation .capsulePop-circle {
width: 28rpx;
height: 28rpx;
margin-left: 14rpx;
border: 3rpx solid #fff;
border-radius: 50%;
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.capsulePop .capsulePop-box .capsulePop-operation .capsulePop-circle-circle {
width: 10rpx;
height: 10rpx;
background-color: #fff;
border-radius: 50%;
}
.offer {
width: 100vw;
}

View File

@ -0,0 +1,97 @@
// template/xg-bottom/xg-bottom.js
const app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Component({
/**
* 组件的属性列表
*/
properties: {
type: String,
bezier: {
type: Object,
observer(res) {
if (res.x == undefined) return
this.setData({
// amount: this.data.amount + 1,
bezierX: res.x,
bezierY: res.y,
hideIcon: true,
}, () => {
setTimeout(() => {
this.setData({
jumpingState: true,
})
}, 10)
})
const pos = this.data.pos
setTimeout(() => {
this.setData({
bezierX: pos['x'],
bezierY: pos['y'],
})
}, 30)
setTimeout(() => {
this.setData({
hideIcon: false,
jumpingState: false,
})
}, 330)
}
},
amount: Number,
islogin: Boolean,
sid: String,
},
/**
* 组件的初始数据
*/
data: {
typeObj: {
index: "搜索项目",
school: "搜索本校项目"
},
jumpingState: false,
hideIcon: false,
bezierX: 0,
bezierY: 0,
pos: {
x: 321,
y: 750,
},
},
lifetimes: {
ready() {
const screen_data = app.globalData.screen_data
this.data.pos = {
x: util.rpxTopx(630),
y: screen_data.windowHeight - util.rpxTopx(110)
}
},
},
/**
* 组件的方法列表
*/
methods: {
// 跳转搜索
goSearch() {
common.goPage(`/pages/search/search?type=xg&sid=${ this.data.sid }`)
},
goPage(e) {
if (!this.data.islogin) {
this.triggerEvent('openLoginBtnState')
return
}
const url = e.currentTarget.dataset.url
common.goPage(url)
},
}
})

View File

@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@ -0,0 +1,92 @@
/* template/xg-bottom/xg-bottom.wxss */
.bottom {
width: 660rpx;
height: 99rpx;
background-color: rgba(246, 246, 189, 1);
border: 1rpx solid rgba(204, 208, 3, 1);
border-radius: 237rpx;
-moz-box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
-webkit-box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
position: fixed;
left: 45rpx;
bottom: 60rpx;
padding: 7.5rpx;
z-index: 3;
display: flex;
align-items: center;
box-sizing: border-box;
.search {
width: 346.5rpx;
height: 84rpx;
background-color: #ffffff;
border-radius: 237rpx 100rpx 100rpx 237rpx;
border: 1rpx solid rgba(215, 215, 215, 0.8);
padding-left: 24rpx;
font-size: 24rpx;
color: #AAAAAA;
margin-right: 7.5rpx;
display: flex;
align-items: center;
.icon {
width: 39rpx;
height: 39rpx;
margin-right: 15rpx;
}
}
.contrast {
border-radius: 100rpx 237rpx 237rpx 100rpx;
height: 84rpx;
background-color: #ffffff;
border: 1rpx solid rgba(215, 215, 215, 0.8);
width: 291rpx;
font-size: 27rpx;
color: #333333;
display: flex;
// justify-content: center;
justify-content: space-between;
align-items: center;
padding: 0 30rpx;
.text {
display: flex;
align-items: center;
white-space: nowrap;
}
.icon {
width: 45rpx;
height: 33rpx;
margin-right: 15rpx;
}
.amount {
height: 33rpx;
font-size: 21rpx;
color: #F95D5D;
padding: 0 12.75rpx;
background-color: rgba(253, 243, 245, 1);
border: 1rpx solid rgba(244, 207, 218, 1);
border-radius: 225rpx;
margin-left: 15rpx;
}
}
}
.dot {
position: fixed;
width: 15rpx;
height: 15rpx;
background-color: red;
border-radius: 50%;
top: -5%;
left: -5%;
z-index: 99;
// transition: left .3s linear, top .3s cubic-bezier(0.5, -0.5, 1, 1);
transition: left .3s linear, top .3s cubic-bezier(0.5, -0.5, 1, 1);
}

View File

@ -0,0 +1,17 @@
<!--template/xg-bottom/xg-bottom.wxml-->
<view class="dot {{ jumpingState ? 'jumpingState' : '' }}" wx:if="{{ hideIcon }}" style="left: {{ bezierX }}px; top: {{ bezierY }}px;"></view>
<view class="bottom">
<view class="search" bind:tap="goSearch">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/search-fine.png" mode="widthFix"></image>
{{ typeObj[type] }}
</view>
<view class="contrast" bind:tap="goPage" data-url="/pages/projectMy/projectMy">
<view class="text">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/vs-icon.png" mode="widthFix"></image>
项目对比
</view>
<view wx:if="{{ amount != 0 }}" class="amount">{{ amount }}</view>
</view>
</view>

View File

@ -0,0 +1,81 @@
/* template/xg-bottom/xg-bottom.wxss */
.bottom {
width: 660rpx;
height: 99rpx;
background-color: #f6f6bd;
border: 1rpx solid #ccd003;
border-radius: 237rpx;
-moz-box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.07058824);
-webkit-box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.07058824);
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.07058824);
position: fixed;
left: 45rpx;
bottom: 60rpx;
padding: 7.5rpx;
z-index: 3;
display: flex;
align-items: center;
box-sizing: border-box;
}
.bottom .search {
width: 346.5rpx;
height: 84rpx;
background-color: #ffffff;
border-radius: 237rpx 100rpx 100rpx 237rpx;
border: 1rpx solid rgba(215, 215, 215, 0.8);
padding-left: 24rpx;
font-size: 24rpx;
color: #AAAAAA;
margin-right: 7.5rpx;
display: flex;
align-items: center;
}
.bottom .search .icon {
width: 39rpx;
height: 39rpx;
margin-right: 15rpx;
}
.bottom .contrast {
border-radius: 100rpx 237rpx 237rpx 100rpx;
height: 84rpx;
background-color: #ffffff;
border: 1rpx solid rgba(215, 215, 215, 0.8);
width: 291rpx;
font-size: 27rpx;
color: #333333;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 30rpx;
}
.bottom .contrast .text {
display: flex;
align-items: center;
white-space: nowrap;
}
.bottom .contrast .icon {
width: 45rpx;
height: 33rpx;
margin-right: 15rpx;
}
.bottom .contrast .amount {
height: 33rpx;
font-size: 21rpx;
color: #F95D5D;
padding: 0 12.75rpx;
background-color: #fdf3f5;
border: 1rpx solid #f4cfda;
border-radius: 225rpx;
margin-left: 15rpx;
}
.dot {
position: fixed;
width: 15rpx;
height: 15rpx;
background-color: red;
border-radius: 50%;
top: -5%;
left: -5%;
z-index: 99;
transition: left 0.3s linear, top 0.3s cubic-bezier(0.5, -0.5, 1, 1);
}

60
pages/index/index.js Normal file
View File

@ -0,0 +1,60 @@
// index.js
const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
Page({
data: {
motto: 'Hello World',
userInfo: {
avatarUrl: defaultAvatarUrl,
nickName: '',
},
hasUserInfo: false,
canIUseGetUserProfile: wx.canIUse('getUserProfile'),
canIUseNicknameComp: wx.canIUse('input.type.nickname'),
},
onLoad(options) {
wx.navigateTo({
url: '/pages/projectLibrary/projectLibrary',
})
},
bindViewTap() {
wx.navigateTo({
url: '../logs/logs'
})
},
onChooseAvatar(e) {
const {
avatarUrl
} = e.detail
const {
nickName
} = this.data.userInfo
this.setData({
"userInfo.avatarUrl": avatarUrl,
hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
})
},
onInputChange(e) {
const nickName = e.detail.value
const {
avatarUrl
} = this.data.userInfo
this.setData({
"userInfo.nickName": nickName,
hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
})
},
getUserProfile(e) {
// 推荐使用wx.getUserProfile获取用户信息开发者每次通过该接口获取用户个人信息均需用户确认开发者妥善保管用户快速填写的头像昵称避免重复弹窗
wx.getUserProfile({
desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
console.log(res)
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
},
})

4
pages/index/index.json Normal file
View File

@ -0,0 +1,4 @@
{
"usingComponents": {
}
}

27
pages/index/index.wxml Normal file
View File

@ -0,0 +1,27 @@
<!--index.wxml-->
<scroll-view class="scrollarea" scroll-y type="list">
<view class="container">
<view class="userinfo">
<block wx:if="{{canIUseNicknameComp && !hasUserInfo}}">
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
<image class="avatar" src="{{userInfo.avatarUrl}}"></image>
</button>
<view class="nickname-wrapper">
<text class="nickname-label">昵称</text>
<input type="nickname" class="nickname-input" placeholder="请输入昵称" bind:change="onInputChange" />
</view>
</block>
<block wx:elif="{{!hasUserInfo}}">
<button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
<view wx:else> 请使用2.10.4及以上版本基础库 </view>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
<view class="usermotto">
<text class="user-motto">{{motto}}</text>
</view>
</view>
</scroll-view>

62
pages/index/index.wxss Normal file
View File

@ -0,0 +1,62 @@
/**index.wxss**/
page {
height: 100vh;
display: flex;
flex-direction: column;
}
.scrollarea {
flex: 1;
overflow-y: hidden;
}
.userinfo {
display: flex;
flex-direction: column;
align-items: center;
color: #aaa;
width: 80%;
}
.userinfo-avatar {
overflow: hidden;
width: 128rpx;
height: 128rpx;
margin: 20rpx;
border-radius: 50%;
}
.usermotto {
margin-top: 200px;
}
.avatar-wrapper {
padding: 0;
width: 56px !important;
border-radius: 8px;
margin-top: 40px;
margin-bottom: 40px;
}
.avatar {
display: block;
width: 56px;
height: 56px;
}
.nickname-wrapper {
display: flex;
width: 100%;
padding: 16px;
box-sizing: border-box;
border-top: .5px solid rgba(0, 0, 0, 0.1);
border-bottom: .5px solid rgba(0, 0, 0, 0.1);
color: black;
}
.nickname-label {
width: 105px;
}
.nickname-input {
flex: 1;
}

18
pages/logs/logs.js Normal file
View File

@ -0,0 +1,18 @@
// logs.js
const util = require('../../utils/util.js')
Page({
data: {
logs: []
},
onLoad() {
this.setData({
logs: (wx.getStorageSync('logs') || []).map(log => {
return {
date: util.formatTime(new Date(log)),
timeStamp: log
}
})
})
}
})

4
pages/logs/logs.json Normal file
View File

@ -0,0 +1,4 @@
{
"usingComponents": {
}
}

6
pages/logs/logs.wxml Normal file
View File

@ -0,0 +1,6 @@
<!--logs.wxml-->
<scroll-view class="scrollarea" scroll-y type="list">
<block wx:for="{{logs}}" wx:key="timeStamp" wx:for-item="log">
<view class="log-item">{{index + 1}}. {{log.date}}</view>
</block>
</scroll-view>

16
pages/logs/logs.wxss Normal file
View File

@ -0,0 +1,16 @@
page {
height: 100vh;
display: flex;
flex-direction: column;
}
.scrollarea {
flex: 1;
overflow-y: hidden;
}
.log-item {
margin-top: 20rpx;
text-align: center;
}
.log-item:last-child {
padding-bottom: env(safe-area-inset-bottom);
}

View File

@ -0,0 +1,358 @@
// pages/projectComparison/projectComparison.js
var miucms = require('../../utils/miucms.js');
let app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Page({
/**
* 页面的初始数据
*/
data: {
projectState: "", // 项目弹窗的状态 '' replace add
screen_data: {},
totalTopHeight: 86,
islogin: false,
briefness: false, // 是否开启头部的简单模式
isquick: false, // 快速保存按钮显示
list: [],
projectList: [],
projectPage: 1,
stateObj: {
0: "待定",
1: "主申",
2: "冲刺",
3: "保底",
},
showObj: {},
loading: true,
isInitFinish: false,
},
/**
* 生命周期函数--监听页面加载
*/
ids: [],
onLoad(options) {
this.ids = options.ids.split(",") || [];
miucms.pageStart(app).then(() => {
const screen_data = app.globalData.screen_data
this.setData({
screen_data,
totalTopHeight: screen_data.totalTopHeight,
islogin: app.globalData.user.uid > 0 ? true : false,
isInitFinish: true,
})
if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
common.xgBasicData(this, app).then(data => {
let obj = {}
const discipline = JSON.parse(JSON.stringify(data.discipline))
discipline.forEach(element => {
obj[element.value] = element.label
})
this.setData({
disciplineObj: obj,
})
this.initData()
})
})
},
initData() {
wx.showLoading({
title: '加载中...',
})
this.setData({
loading: true,
})
util.wxpost("/api/project.contrast", {
projectid: this.ids,
}).then(res => {
if (res.code != 200) return
const data = res.data
const list = data.data || []
let allArr = []
list.forEach(element => allArr.push(common.decodeKey(element)))
const obj = this.data.disciplineObj
// console.log("discipline", obj);
Promise.allSettled(allArr).then(res => {
console.log("res", res);
let list = []
res.forEach(element => list.push(element.status === "fulfilled" ? element.value : {}));
list.forEach(element => {
element['tuition_fee_text'] = common.formatNumberWithSpaces(element['tuition_fee'] || '')
element['admission_deposit_text'] = common.formatNumberWithSpaces(element['admission_deposit'] || '')
if (element.language_of_instruction) {
let strOutput = element.language_of_instruction.join(',');
element['language_of_instruction_text'] = strOutput
}
if (Array.isArray(element.english_proficiency)) {
const english = element.english_proficiency
let text = ""
english.forEach(element => {
text += `${element.name_zh}(${element.name_en}) ${element.total}分以上 \n`
})
element['english_proficiency_text'] = text
}
if (element.scholarship) element['scholarshipText'] = this.JudgmentScholarshipText(element.scholarship)
element['disciplinename'] = obj[element.disciplineid] || ''
})
console.log("list", list[0].disciplineid);
this.setData({
isquick: data.isquick,
list,
}, () => wx.nextTick(() => this.getAllItemHeight()))
}).catch(err => {
common.toast("出错了,请联系管理员。")
})
}).finally(() => {
wx.hideLoading()
this.setData({
loading: false,
})
})
},
// 判断奖学金文案
JudgmentScholarshipText(obj) {
let text = ""
if (obj.local && obj.nonlocal) text = '均有'
else if (!obj.local && !obj.nonlocal) text = '均无'
else if (obj.local && !obj.nonlocal) text = '非本地学生无'
else if (!obj.local && obj.nonlocal) text = '非本地学生有'
return text
},
getAllItemHeight() {
this.createSelectorQuery().selectAll(".lump .block").boundingClientRect(data => {
let showObj = {}
data.forEach(element => {
const type = element.dataset?.type
if (type != undefined && element.height > 200) {
showObj[type] = {
show: true,
unfold: true,
}
}
})
this.setData({
showObj
})
}).exec();
},
selectIndex: null, // 选中要替换或增加的 下标
// 点击 顶部的 增加 或者 替换 项目
handleProject(e) {
const type = e.currentTarget.dataset.type
const index = e.currentTarget.dataset.index
this.selectIndex = index
this.setData({
projectState: type,
projectList: [],
projectPage: 1,
})
this.getListData()
},
// 点击 关闭 项目弹窗
closeProject() {
this.setData({
projectState: ""
})
},
// 点击 选择项目
selectProject(e) {
const index = e.currentTarget.dataset.index
const type = this.data.projectState
const projectList = this.data.projectList
const target = projectList[index]
// 替换
if (type == 'replace') this.ids[this.selectIndex] = `${target.projectid}`
else this.ids.push(`${target.projectid}`) // 增加
this.initData()
this.setData({
projectState: "",
})
},
// 点击 删除项目
deleteProject(e) {
const index = e.currentTarget.dataset.index || 0
wx.showModal({
title: "确认删除?",
success: res => {
if (!res.confirm) return
this.ids.splice(index, 1); // 从指定下标删除一个元素
const list = this.data.list
list.splice(index, 1); // 从指定下标删除一个元素
this.setData({
list,
})
}
})
},
// 获取项目列表数据
loading: false,
getListData() {
if (this.data.projectPage == 0 || this.loading) return
this.loading = true
wx.showLoading({
title: '加载中...',
})
util.wxpost("/api/project.user", {
limit: 2000,
}).then(res => {
if (res.code != 200) return
const data = res.data
let list = data.data || []
const ids = this.ids
list = list.filter(obj => obj.status === 1 && !ids.includes(`${obj.projectid}`));
this.setData({
projectList: list,
projectPage: data.count > data.limit * data.page ? this.data.projectPage + 1 : 0,
})
}).finally(() => {
wx.hideLoading()
this.loading = false
})
},
// 点击保存
save() {
util.wxpost("/api/project.contrast/addQuick", {
projectid: this.ids
}).then(res => {
common.toast(res.message)
this.setData({
isquick: true,
})
app.globalData['isquickState'] = true
})
},
cutShow(e) {
const type = e.currentTarget.dataset.type
let showObj = this.data.showObj
showObj[type]['show'] = !showObj[type]['show']
this.setData({
showObj,
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
this.initData()
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
// onShareAppMessage() {
// return {
// title: "【寄托港校项目库】 - 项目对比",
// }
// },
// onShareTimeline() {
// util.statistics({
// name: "share-timeline"
// })
// return {
// title: "【寄托港校项目库】 - 项目对比",
// }
// },
indexSidebar: null,
windowHeight: 812,
onPageScroll(e) {
const scrollTop = e.scrollTop
let briefness = true
if (scrollTop < 10) briefness = false
// 如果和 data 值 是一样的则 return
if (this.data.briefness == briefness) return
this.setData({
briefness
})
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()
},
})

View File

@ -0,0 +1,6 @@
{
"usingComponents": {
"header-nav": "/component/headerNav/headerNav",
"index-sidebar": "/component/indexSidebar/indexSidebar"
}
}

View File

@ -0,0 +1,432 @@
view {
box-sizing: border-box;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
}
.container {
min-height: 100vh;
padding: 0 15rpx;
}
.lump {
.title {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 15rpx;
}
.block {
.item {
// display: flex;
// justify-content: center;
// align-items: center;
}
}
}
.block {
background-color: rgba(251, 247, 249, 1);
border: 1rpx solid rgba(241, 241, 241, 1);
border-radius: 12rpx;
margin-bottom: 27rpx;
position: relative;
.title {
font-size: 21rpx;
color: #7F7F7F;
}
.item {
&:not(:last-of-type) {
border-right: 1rpx solid rgba(241, 241, 241, 1);
}
&:nth-child(2) {
background-color: rgba(245, 252, 253, 1);
}
&:nth-child(3) {
background-color: rgba(251, 251, 243, 1);
}
.mode1 {
// height: 60rpx;
line-height: 60rpx;
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 24rpx;
color: #000000;
}
.mode2 {
// height: 60rpx;
line-height: 60rpx;
font-size: 24rpx;
color: #000000;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.mode3 {
// height: 60rpx;
line-height: 60rpx;
font-size: 21rpx;
color: #555555;
.amount {
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 24rpx;
color: #333333;
margin-right: 8rpx;
}
}
.mode4 {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-size: 24rpx;
line-height: 42rpx;
padding: 18rpx 15rpx;
white-space: pre-line;
}
.mode6 {
padding: 18rpx 15rpx 0;
.mode6-item {
.name {
font-size: 24rpx;
color: #333333;
margin-bottom: 6rpx;
}
.english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 18rpx;
}
}
}
}
&.show {
.item {
height: 200px;
overflow: hidden;
}
.more {
.more-icon {
transform: rotate(90deg) !important;
}
}
}
&.unfold {
padding-bottom: 75rpx;
.more {
display: flex;
.more-icon {
transform: rotate(-90deg);
}
}
}
.more {
position: absolute;
bottom: 0;
width: 100%;
height: 75rpx;
background-color: rgba(251, 251, 251, 1);
border-top: 1rpx solid rgba(241, 241, 241, 1);
border-radius: 12rpx;
display: none;
transition: all .3s;
.more-icon {
width: 27rpx;
height: 27rpx;
transform: rotate(90deg);
}
}
&.head-box {
position: sticky;
top: 86px;
z-index: 1;
&.briefness {
.item {
.name {
margin-bottom: 18rpx;
}
.english {
height: 0;
overflow: hidden;
margin-bottom: 0;
}
.operate {
height: 0;
overflow: hidden;
border-top-color: transparent;
}
}
}
.item {
padding-top: 24rpx;
.name {
width: calc(100vw / 3 - 30rpx);
font-weight: 650;
font-size: 24rpx;
color: #000000;
padding: 0 15rpx;
margin-bottom: 9rpx;
}
.english {
width: calc(100vw / 3 - 30rpx);
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-size: 21rpx;
color: #7F7F7F;
line-height: 24rpx;
padding: 0 15rpx;
margin-bottom: 27rpx;
transition: all .3s;
}
.school {
padding: 0 15rpx;
.icon {
width: 24rpx;
height: 27rpx;
margin-right: 10rpx;
}
font-size: 24rpx;
margin-bottom: 16.5rpx;
.semester {
font-size: 21rpx;
color: #9A9D02;
text-align: right;
flex: 1;
}
}
.operate {
border-top: 1rpx solid #f1f1f1;
height: 73.5rpx;
position: relative;
transition: all .3s;
.operate-item {
height: 100%;
&:not(:last-of-type) {
// border-right: 1rpx solid #ebebeb;
}
.icon {
width: 27rpx;
height: 27rpx;
}
}
.increase {
position: absolute;
right: 0;
transform: translateX(50%);
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 73.5rpx;
height: 73.5rpx;
}
.icon {
width: 33rpx;
height: 33rpx;
}
}
}
}
}
}
.end {
padding: 45rpx 0 195rpx;
text-align: center;
font-size: 19.5rpx;
color: #D7D7D7;
}
.base {
position: fixed;
left: 0;
bottom: 0;
width: 100vw;
height: 150rpx;
background-color: rgba(246, 246, 246, 1);
border-top: 1rpx solid rgba(235, 235, 235, 1);
font-size: 24rpx;
color: #333333;
.icon {
width: 30rpx;
height: 30rpx;
margin-left: 15rpx;
margin-right: 28.5rpx;
}
.btn {
width: 255rpx;
height: 90rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 172.5rpx;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-style: normal;
font-size: 30rpx;
color: #026277;
}
}
.handle-project-mask {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.705882352941177);
display: flex;
align-items: flex-end;
z-index: 99;
.handle-project {
width: 100vw;
background-color: rgba(255, 255, 255, 1);
border-radius: 45rpx;
.title {
margin: 0 30rpx;
padding-top: 45rpx;
padding-bottom: 33rpx;
border-bottom: 1rpx dotted #ebebeb;
font-size: 24rpx;
color: #555555;
text-align: center;
}
.scroll-view {
.item {
padding-top: 31.5rpx;
padding-bottom: 30rpx;
margin: 0 30rpx;
justify-content: space-between;
&:not(:last-of-type) {
border-bottom: 1rpx dotted #ebebeb;
}
&:last-of-type {
padding-bottom: 100rpx;
}
.left {
.name {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
}
.english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 18rpx;
}
.bottom {
.icon {
width: 27rpx;
height: 27rpx;
margin-right: 7.5rpx;
}
font-size: 24rpx;
color: #333333;
.line {
width: 1rpx;
height: 25.5rpx;
border-right: 1rpx solid #d7d7d7;
margin: 0 18rpx;
}
.state {
font-size: 22.5rpx;
color: #7F7F7F;
width: 60rpx;
height: 33rpx;
background-color: rgba(240, 241, 236, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
border-radius: 9rpx;
}
}
}
.btn {
width: 60rpx;
height: 60rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 52.5rpx;
.icon {
width: 30rpx;
height: 27rpx;
}
}
}
}
}
}
.empty {
margin: 0 30rpx 30rpx;
background-color: rgba(255, 255, 255, 1);
flex-direction: column;
height: 60vh;
.icon {
width: 120rpx;
height: 141rpx;
margin-bottom: 40.5rpx;
}
.text {
font-size: 24rpx;
color: #7F7F7F;
line-height: 45rpx;
}
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,290 @@
<!--pages/projectComparison/projectComparison.wxml-->
<header-nav>项目对比</header-nav>
<view class="container" wx:if="{{ !loading }}">
<block wx:key="index">
<view class="block head-box flexflex {{ briefness ? 'briefness' : '' }}" style="top: {{ totalTopHeight }}px;">
<view class="item flex1 " wx:for="{{ list }}" wx:key="index">
<view class="name one-line-display" style="width: calc(100vw / {{ list.length }} - 30rpx);">{{ item.name_zh }}</view>
<view class="english one-line-display" style="width: calc(100vw / {{ list.length }} - 30rpx);">{{ item.name_en }}</view>
<view class="school flexacenter">
<image class="icon" src="{{ item.schoollogo }}" mode="widthFix"></image>
{{ item.schoolalias }}
<view class="semester">{{ item.semester.text }}</view>
</view>
<view class="operate flexacenter">
<view class="operate-item flexcenter flex1" bind:tap="handleProject" data-type="replace" data-index="{{ index }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/refresh-two-icon.png" mode="widthFix"></image>
</view>
<view wx:if="{{ list.length == 3 }}" class="operate-item flexcenter flex1" bind:tap="deleteProject" data-index="{{ index }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/delete-gray.svg" mode="widthFix"></image>
</view>
<view wx:if="{{ index == 0 && list.length == 2 }}" class="increase flexcenter" bind:tap="handleProject" data-type="add" data-index="{{ index }}">
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/plus-case.png"></image>
</view>
</view>
</view>
</view>
</block>
<view class="lump">
<view class="title">专业排名</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode1" data="{{ text: item.rank || '-' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">学校合排名</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<!-- <template is="mode2" data="{{ text: item.rankingsMin || '-' }}"></template> -->
<template is="mode2" data="{{ text: item.rankings[0].rank || '-' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">学科领域</view>
<view class="block flexflex {{ showObj['disciplinename']['unfold'] ? 'unfold' : '' }} {{ showObj['disciplinename']['show'] ? 'show' : '' }}" data-type="disciplinename">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.disciplinename }}" is="mode2" data="{{ text: item.disciplinename }}"></template>
<template wx:else is="mode2" data="{{ text: '-'}}"></template>
</view>
<view class="more flexcenter" bind:tap="cutShow" data-type="disciplinename">
<image class="more-icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="lump">
<view class="title">学费</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.tuition_fee_text }}" is="mode3" data="{{ text: item.tuition_fee_text || '-' }}"></template>
<template wx:else is="mode2" data="{{ text: '待确认' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">入学保证金</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode3" data="{{ text: item.admission_deposit_text || '-' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">奖学金</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode2" data="{{ text: item.scholarshipText || '-' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">一般学习时长</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode2" data="{{ text: item.ft_normal_period || '-' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">授课语言</view>
<view class="block flexflex">
<view class="item flex1 flexcenter" wx:for="{{ list }}" wx:key="index">
<template is="mode2" data="{{ text: item.language_of_instruction_text || '-' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">专业方向</view>
<view class="block flexflex {{ showObj['concentration']['unfold'] ? 'unfold' : '' }} {{ showObj['concentration']['show'] ? 'show' : '' }}" data-type="concentration">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.concentration }}" is="mode4" data="{{ text: item.concentration }}"></template>
<template wx:else is="mode2" data="{{ text: '-' }}"></template>
</view>
<view class="more flexcenter" bind:tap="cutShow" data-type="concentration">
<image class="more-icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="lump">
<view class="title">学术要求</view>
<view class="block flexflex {{ showObj['entrance_requirements']['unfold'] ? 'unfold' : '' }} {{ showObj['entrance_requirements']['show'] ? 'show' : '' }}" data-type="entrance_requirements">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.entrance_requirements }}" is="mode4" data="{{ text: item.entrance_requirements }}"></template>
<template wx:else is="mode2" data="{{ text: '-'}}"></template>
</view>
<view class="more flexcenter" bind:tap="cutShow" data-type="entrance_requirements">
<image class="more-icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="lump">
<view class="title">英语能力要求</view>
<view class="block flexflex {{ showObj['english_proficiency_text']['unfold'] ? 'unfold' : '' }} {{ showObj['english_proficiency_text']['show'] ? 'show' : '' }}" data-type="english_proficiency_text">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.english_proficiency_text }}" is="mode4" data="{{ text: item.english_proficiency_text }}"></template>
<template wx:else is="mode2" data="{{ text: '-'}}"></template>
</view>
<view class="more flexcenter" bind:tap="cutShow" data-type="english_proficiency_text">
<image class="more-icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="lump">
<view class="title">必要文件</view>
<view class="block flexflex {{ showObj['documents_required']['unfold'] ? 'unfold' : '' }} {{ showObj['documents_required']['show'] ? 'show' : '' }}" data-type="documents_required">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.documents_required }}" is="mode4" data="{{ text: item.documents_required }}"></template>
<template wx:else is="mode2" data="{{ text: '-'}}"></template>
</view>
<view class="more flexcenter" bind:tap="cutShow" data-type="documents_required">
<image class="more-icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="lump">
<view class="title">专业认证</view>
<view class="block flexflex {{ showObj['accreditation']['unfold'] ? 'unfold' : '' }} {{ showObj['accreditation']['show'] ? 'show' : '' }}" data-type="accreditation">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.accreditation }}" is="mode4" data="{{ text: item.accreditation }}"></template>
<template wx:else is="mode2" data="{{ text: '-'}}"></template>
</view>
<view class="more flexcenter" bind:tap="cutShow" data-type="accreditation">
<image class="more-icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="lump">
<view class="title">是否含论文课程</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode2" data="{{ text: item.has_dissertation_course ? '是' : '否' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">是否含项目课程</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode2" data="{{ text: item.has_project_course ? '是' : '否' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">是否含实习课程</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template is="mode2" data="{{ text: item.has_placement_course ? '是' : '否' }}"></template>
</view>
</view>
</view>
<view class="lump">
<view class="title">录取通知时间</view>
<view class="block flexflex">
<view class="item flex1" wx:for="{{ list }}" wx:key="index">
<template wx:if="{{ item.result_date }}" is="mode4" data="{{ text: item.result_date }}"></template>
<template wx:else is="mode2" data="{{ text: '-' }}"></template>
</view>
</view>
</view>
<view class="end flexcenter">- End -</view>
<view class="base flexcenter" wx:if="{{ !isquick }}">
保存该组对比,方便下次快速查看
<image class="icon" src="https://app.gter.net/image/miniApp/offer/arrows-black-straight.png" mode="widthFix"></image>
<view class="btn flexcenter" bind:tap="save">保存</view>
</view>
<view class="handle-project-mask" wx:if="{{ projectState }}" bind:tap="closeProject" catch:touchmove="return">
<view class="handle-project" catch:touchmove="return" catch:tap="return">
<view class="title">{{ projectState == 'replace' ? '请选择替换的项目' : '还可以增加1个项目' }}</view>
<scroll-view class="scroll-view" scroll-y="{{ true }}" style="height: 70vh;">
<block wx:for="{{ projectList }}" wx:key="index">
<view class="item flexacenter" wx:if="{{ item.status == 1 }}">
<view class="left flex1">
<view class="name">{{ item.name_zh }}</view>
<view class="english">{{ item.name_en }}</view>
<view class="bottom flexacenter">
<image class="icon" src="{{ item.schoollogo }}" mode="widthFix"></image>
{{ item.schoolalias }}
<block wx:if="{{ item.ismanage == 1 }}">
<view class="line"></view>
<view class="state flexcenter">{{ stateObj[item.typeid] }}</view>
</block>
</view>
</view>
<view class="btn flexcenter" catch:tap="selectProject" data-index="{{ index }}">
<image wx:if="{{ projectState == 'replace' }}" class="icon" src="https://app.gter.net/image/miniApp/offer/replace-icon.png" mode="widthFix"></image>
<image wx:else class="icon" src="https://app.gter.net/image/miniApp/offer/arrows-straight-dark-cyan.png" mode="widthFix"></image>
</view>
</view>
</block>
<view class="empty flexcenter" wx:if="{{ projectList.length == 0 }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/empty-icon.png" mode="widthFix"></image>
<view class="text">暂无数据</view>
</view>
<view class="item"></view>
</scroll-view>
</view>
</view>
</view>
<index-sidebar id="index-sidebar" class="index-sidebar" sidebarType="xg" isInitFinish="{{ isInitFinish }}" bind:openLogin="openLoginBtnState" islogin="{{ islogin }}"></index-sidebar>
<!-- 居中 粗体 -->
<template name="mode1">
<view class="mode1 flexcenter">{{ text }}</view>
</template>
<!-- 居中 -->
<template name="mode2">
<view class="mode2 flexcenter">{{ text }}</view>
</template>
<!-- 居中 金钱 -->
<template name="mode3">
<view class="mode3 flexcenter">
<view class="amount">{{ text }}</view>
HK$
</view>
</template>
<!-- 正常显示文本 -->
<template name="mode4">
<view class="mode4">{{ text || ' - '}}</view>
</template>
<!-- 居中 显示一条横杠 -->
<template name="mode5">
<view class="mode5 flexcenter">-</view>
</template>
<template name="mode6">
<view class="mode6">
<view class="mode6-item" wx:for="{{ 5 }}" wx:key="index">
<view class="name">金融计算</view>
<view class="english">Financial Computing</view>
</view>
</view>
</template>

View File

@ -0,0 +1,336 @@
view {
box-sizing: border-box;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
}
.container {
min-height: 100vh;
padding: 0 15rpx;
}
.lump .title {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 15rpx;
}
.block {
background-color: #fbf7f9;
border: 1rpx solid #f1f1f1;
border-radius: 12rpx;
margin-bottom: 27rpx;
position: relative;
}
.block .title {
font-size: 21rpx;
color: #7F7F7F;
}
.block .item:not(:last-of-type) {
border-right: 1rpx solid #f1f1f1;
}
.block .item:nth-child(2) {
background-color: #f5fcfd;
}
.block .item:nth-child(3) {
background-color: #fbfbf3;
}
.block .item .mode1 {
line-height: 60rpx;
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 24rpx;
color: #000000;
}
.block .item .mode2 {
line-height: 60rpx;
font-size: 24rpx;
color: #000000;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.block .item .mode3 {
line-height: 60rpx;
font-size: 21rpx;
color: #555555;
}
.block .item .mode3 .amount {
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 24rpx;
color: #333333;
margin-right: 8rpx;
}
.block .item .mode4 {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-size: 24rpx;
line-height: 42rpx;
padding: 18rpx 15rpx;
white-space: pre-line;
}
.block .item .mode6 {
padding: 18rpx 15rpx 0;
}
.block .item .mode6 .mode6-item .name {
font-size: 24rpx;
color: #333333;
margin-bottom: 6rpx;
}
.block .item .mode6 .mode6-item .english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 18rpx;
}
.block.show .item {
height: 200px;
overflow: hidden;
}
.block.show .more .more-icon {
transform: rotate(90deg) !important;
}
.block.unfold {
padding-bottom: 75rpx;
}
.block.unfold .more {
display: flex;
}
.block.unfold .more .more-icon {
transform: rotate(-90deg);
}
.block .more {
position: absolute;
bottom: 0;
width: 100%;
height: 75rpx;
background-color: #fbfbfb;
border-top: 1rpx solid #f1f1f1;
border-radius: 12rpx;
display: none;
transition: all 0.3s;
}
.block .more .more-icon {
width: 27rpx;
height: 27rpx;
transform: rotate(90deg);
}
.block.head-box {
position: sticky;
top: 86px;
z-index: 1;
}
.block.head-box.briefness .item .name {
margin-bottom: 18rpx;
}
.block.head-box.briefness .item .english {
height: 0;
overflow: hidden;
margin-bottom: 0;
}
.block.head-box.briefness .item .operate {
height: 0;
overflow: hidden;
border-top-color: transparent;
}
.block.head-box .item {
padding-top: 24rpx;
}
.block.head-box .item .name {
width: calc(100vw / 3 - 30rpx);
font-weight: 650;
font-size: 24rpx;
color: #000000;
padding: 0 15rpx;
margin-bottom: 9rpx;
}
.block.head-box .item .english {
width: calc(100vw / 3 - 30rpx);
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-size: 21rpx;
color: #7F7F7F;
line-height: 24rpx;
padding: 0 15rpx;
margin-bottom: 27rpx;
transition: all 0.3s;
}
.block.head-box .item .school {
padding: 0 15rpx;
font-size: 24rpx;
margin-bottom: 16.5rpx;
}
.block.head-box .item .school .icon {
width: 24rpx;
height: 27rpx;
margin-right: 10rpx;
}
.block.head-box .item .school .semester {
font-size: 21rpx;
color: #9A9D02;
text-align: right;
flex: 1;
}
.block.head-box .item .operate {
border-top: 1rpx solid #f1f1f1;
height: 73.5rpx;
position: relative;
transition: all 0.3s;
}
.block.head-box .item .operate .operate-item {
height: 100%;
}
.block.head-box .item .operate .operate-item .icon {
width: 27rpx;
height: 27rpx;
}
.block.head-box .item .operate .increase {
position: absolute;
right: 0;
transform: translateX(50%);
}
.block.head-box .item .operate .increase::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 73.5rpx;
height: 73.5rpx;
}
.block.head-box .item .operate .increase .icon {
width: 33rpx;
height: 33rpx;
}
.end {
padding: 45rpx 0 195rpx;
text-align: center;
font-size: 19.5rpx;
color: #D7D7D7;
}
.base {
position: fixed;
left: 0;
bottom: 0;
width: 100vw;
height: 150rpx;
background-color: #f6f6f6;
border-top: 1rpx solid #ebebeb;
font-size: 24rpx;
color: #333333;
}
.base .icon {
width: 30rpx;
height: 30rpx;
margin-left: 15rpx;
margin-right: 28.5rpx;
}
.base .btn {
width: 255rpx;
height: 90rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 172.5rpx;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-style: normal;
font-size: 30rpx;
color: #026277;
}
.handle-project-mask {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.70588235);
display: flex;
align-items: flex-end;
z-index: 99;
}
.handle-project-mask .handle-project {
width: 100vw;
background-color: #ffffff;
border-radius: 45rpx;
}
.handle-project-mask .handle-project .title {
margin: 0 30rpx;
padding-top: 45rpx;
padding-bottom: 33rpx;
border-bottom: 1rpx dotted #ebebeb;
font-size: 24rpx;
color: #555555;
text-align: center;
}
.handle-project-mask .handle-project .scroll-view .item {
padding-top: 31.5rpx;
padding-bottom: 30rpx;
margin: 0 30rpx;
justify-content: space-between;
}
.handle-project-mask .handle-project .scroll-view .item:not(:last-of-type) {
border-bottom: 1rpx dotted #ebebeb;
}
.handle-project-mask .handle-project .scroll-view .item:last-of-type {
padding-bottom: 100rpx;
}
.handle-project-mask .handle-project .scroll-view .item .left .name {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
}
.handle-project-mask .handle-project .scroll-view .item .left .english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 18rpx;
}
.handle-project-mask .handle-project .scroll-view .item .left .bottom {
font-size: 24rpx;
color: #333333;
}
.handle-project-mask .handle-project .scroll-view .item .left .bottom .icon {
width: 27rpx;
height: 27rpx;
margin-right: 7.5rpx;
}
.handle-project-mask .handle-project .scroll-view .item .left .bottom .line {
width: 1rpx;
height: 25.5rpx;
border-right: 1rpx solid #d7d7d7;
margin: 0 18rpx;
}
.handle-project-mask .handle-project .scroll-view .item .left .bottom .state {
font-size: 22.5rpx;
color: #7F7F7F;
width: 60rpx;
height: 33rpx;
background-color: #f0f1ec;
border: 1rpx solid #ebebeb;
border-radius: 9rpx;
}
.handle-project-mask .handle-project .scroll-view .item .btn {
width: 60rpx;
height: 60rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 52.5rpx;
}
.handle-project-mask .handle-project .scroll-view .item .btn .icon {
width: 30rpx;
height: 27rpx;
}
.empty {
margin: 0 30rpx 30rpx;
background-color: #ffffff;
flex-direction: column;
height: 60vh;
}
.empty .icon {
width: 120rpx;
height: 141rpx;
margin-bottom: 40.5rpx;
}
.empty .text {
font-size: 24rpx;
color: #7F7F7F;
line-height: 45rpx;
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,729 @@
// pages/projectDetails/projectDetails.js
var miucms = require('../../utils/miucms.js');
let app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Page({
/**
* 页面的初始数据
*/
data: {
informationState: false, // 授权后可能需要弹出完成信息框 个人背景那些
islogin: false,
isloginBtnState: false,
isFirstPattern: true,
screen_data: {},
totalTopHeight: 82,
admissionCurrent: 0, // 招生官 轮播图的下标
admissionState: false, // 招生官 弹窗的状态
stateState: false, // 底部状态显示状态
headHeight: 0, // 头部 高度
rpx150: 150,
index: 0,
current: {},
headerObj: {
ranking: "专业排名",
brief: "简介",
},
info: {},
remark: "", // 备注
keyboardHeight: 0, // 键盘高度
remarkInput: "", // 备注输入文本
remarkFocus: false, // 备注输入框焦点状态
isadmission: 0, // 是否是招生官项目
urls: [], // 招生官项目
uniqid: "",
info: {},
side: {
pivotal: "关键信息",
basic: "基本信息",
apply: "申请信息",
attend: "就读信息",
graduate: "毕业&就业",
consult: "录取参考",
issue: "常见问题",
links: "相关链接",
},
sideKey: "pivotal", // 侧边栏选中 key
course: {}, // 课程
scrollTop: 0,
contras: {}, //
stateObj: {
0: "待定",
1: "主申",
2: "冲刺",
3: "保底",
},
rankingsObj: {}, // 排名对象
studyMode: 'ft', // 学习模式显示状态 ft 全日制 pt 兼读制
moldObj: {
1: "直播",
2: "回放",
3: "答疑"
},
isInitFinish: false,
sideFixed: false,
rpx30: 30,
user: {},
offerList: []
},
/**
* 生命周期函数--监听页面加载
*/
options: {},
onLoad(options) {
this.options = options
miucms.pageStart(app).then(() => {
const screen_data = app.globalData.screen_data || {}
this.setData({
screen_data,
totalTopHeight: screen_data.totalTopHeight,
islogin: app.globalData.user.uid > 0 ? true : false,
uniqid: options.uniqid,
rpx150: util.rpxTopx(150),
rpx30: util.rpxTopx(30),
user: app.globalData.user,
})
this.windowHeight = screen_data.windowHeight || 812
common.xgBasicData(this, app).then(data => {
this.setData({
rankingsObj: data.rankings,
})
this.getData()
})
})
},
getData() {
wx.showLoading({
title: '加载中...',
})
util.wxpost("/api/project.detail", {
uniqid: this.data.uniqid,
query: {
...this.options
},
}).then(res => {
const data = res.data
common.decodeKey(data.info).then(res => {
console.log("res", res);
data.info = res
let course = {
required: [],
requiredCount: 0,
elective: [],
electiveCount: 0,
}
const info = data.info || {}
const fields = ['tuition_fee', 'tuition_fee_per_credit', 'application_fee', 'admission_deposit'];
fields.forEach(field => {
const textKey = `${field}_text`;
info[textKey] = common.formatNumberWithSpaces(info[field] || '');
});
const curriculum = info.curriculum || []
if (info.language_of_instruction) {
let strOutput = info.language_of_instruction.join(',');
info['language_of_instruction_text'] = strOutput
}
curriculum.forEach(element => {
if (element.credit == 'N/A') element.credit = 0
element.type === '必修课' ? (course.required.push(element), course.requiredCount += element.credit) : (course.elective.push(element), course.electiveCount += element.credit);
})
let contras = data.contras
if (Array.isArray(contras)) contras = {}
const remark = contras.remarks || ''
// 算出最后申请时间
info['application_end'] = this.calculateApplicaDeadline(info.nonlocal_application_end || {})
// 算出面试轮时间
info['interviewRounds'] = this.calculateInterviewRound(info.nonlocal_application_end || {})
if (typeof info.mode_of_study == "string") info.mode_of_study = JSON.parse(info.mode_of_study)
let side = this.data.side
// 判断是否常见问题 ,没有则删除左侧
if (!info.faq || info.faq.length == 0) delete side.issue
// 判断 毕业就业 没有则删除左侧
if (!info.award_zh && !info.graduation_requirements && !info.domains && !info.employers && !info.positions) delete side.graduate
// 判断奖学金文案
if (info.scholarship) info['scholarshipText'] = this.JudgmentScholarshipText(info.scholarship)
if (info.leaflet_url) {
const leaflet_url = decodeURIComponent(info.leaflet_url)
const urlWithoutParams = leaflet_url.split('?')[0];
const urlParts = urlWithoutParams.split('/');
const fileName = urlParts[urlParts.length - 1];
info['leaflet_name'] = fileName
}
const isadmission = info.admissionsproject || 0
if (isadmission == 1) this.getAdmissionList()
const date = new Date()
const month = date.getMonth() + 1
const year = date.getFullYear()
const semester = info.semester || {}
if (month > semester.month && year + 1 <= semester.year) info['semesterState'] = true
let scores = info.language_proficiency_scores || []
console.log(scores);
const scoresList = scores
.map(element => {
let text = ""
if (["GMAT", "GMAT Focus Edition"].includes(element.name_zh)) text = `Verbal Reasoning ${element.verbal_reasoning} 分以上`
else if (["IELTS Academic", "TOEFL-iBT", "TOEFL-pBT"].includes(element.name_en)) {
const fields = {
total: "总分",
reading: "阅读",
speaking: "口语",
writing: "写作",
listening: "听力",
}
let scores = [element.reading, element.speaking, element.writing, element.listening]
if (scores.length == 4 && scores.every(score => score !== undefined && score > 0 && score === scores[0])) {
text = `总分 ${element.total} 分以上,各项分数不低于 ${scores[0]}`
} else {
for (const [key, label] of Object.entries(fields)) {
if (element[key]) text += `${label} ${element[key]} 分以上、`
}
if (text.endsWith("、")) text = text.slice(0, -1)
}
} else if (element.total && /^[A-Za-z]+$/.test(element.total)) text = `等级 ${element.total} 以上`
else if (element.total) text = `总分 ${element.total} 分以上`
return text ? {
name: element.name_zh,
text
} : null
})
.filter(item => item !== null)
info["scoresList"] = scoresList
this.getOfferData(info.id)
// 判断相关链接
if (!info.leaflet_url && !info.program_url && !info.catalog_url) delete side.links
this.setData({
info,
course,
contras,
remark,
side,
isadmission,
sideKey: "pivotal", // pivotal
isInitFinish: true,
}, () => {
setTimeout(() => {
this.getHeadHeight()
this.getIndexHeight()
}, 500)
})
}).catch(err => common.toast("出错了,请联系管理员。"))
}).finally(() => {
wx.hideLoading()
})
},
// 判断奖学金文案
JudgmentScholarshipText(obj) {
let text = ""
if (obj.local && obj.nonlocal) text = '均有'
else if (!obj.local && !obj.nonlocal) text = '均无'
else if (obj.local && !obj.nonlocal) text = '非本地学生无'
else if (!obj.local && obj.nonlocal) text = '非本地学生有'
return text
},
// 计算出外地申请截止时间
calculateApplicaDeadline(obj) {
// 初始化变量来存储最大时间点的属性和日期
let maxDate = null;
// 遍历对象的属性
for (const item in obj) {
// 如果当前日期是最大日期或是第一个日期,则更新最大日期和属性
if (maxDate === null || obj[item] > maxDate) maxDate = obj[item];
}
return maxDate
},
// 计算出面试轮的数组
calculateInterviewRound(obj) {
let rounds = [];
const chineseNumbers = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"];
const formatTime = (time, index) => {
return {
text: `${chineseNumbers[index]}`,
time,
};
};
Object.keys(obj).forEach((key, index) => {
rounds.push(formatTime(obj[key], index));
});
if (rounds.length == 0) rounds = [{}]
return rounds || [{}]
},
// 切换招生官 轮播图状态
cutAdmission() {
this.setData({
admissionState: !this.data.admissionState
})
},
// 招生官 轮播图 修改状态
admissionChange(e) {
this.setData({
admissionCurrent: e.detail.current
})
},
// 获取index的高度
getIndexHeight() {
const query = wx.createSelectorQuery();
query.select('.head-box').boundingClientRect(rect => {
this.setData({
headHeight: rect.height,
})
if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
}).exec();
},
// 获取头部 高度
sideHeight: {},
getHeadHeight() {
const query = wx.createSelectorQuery();
query.selectAll('.details-box .side-item').boundingClientRect(rect => {
if (!rect) return
let sideHeight = {}
rect.forEach(element => {
const type = element.dataset.type
sideHeight[type] = element.top
})
this.sideHeight = sideHeight
}).exec();
},
onPageScroll(e) {
if (Math.random() > 0.5) return
const scrollTop = e.scrollTop
const sideHeight = this.sideHeight
const sideHeightList = Object.keys(sideHeight) || []
if (sideHeightList.length == 0) return
let closestValue = sideHeightList.reduce((a, b) => Math.abs(sideHeight[b] - scrollTop) < Math.abs(sideHeight[a] - scrollTop) ? b : a);
const sideKey = closestValue || 'pivotal'
if (sideKey != this.data.sideKey) {
this.setData({
sideKey,
})
}
const headHeight = this.data.headHeight
const totalTopHeight = this.data.totalTopHeight
let sideFixed = false
if (scrollTop > headHeight - totalTopHeight - 15) sideFixed = true
if (sideFixed != this.data.sideFixed) {
this.setData({
sideFixed,
})
}
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()
},
// 点击复制
copy(e) {
const text = e.currentTarget.dataset.text
util.copy(text, '复制成功,浏览器打开')
},
// 打开文件
openFile(e) {
const url = e.currentTarget.dataset.url
common.goPage("/pages/webview/webview?url=" + encodeURIComponent(url))
},
// 打开 授权按钮
openLoginBtnState() {
this.setData({
isloginBtnState: true,
})
},
// 关闭授权登录事件
popClose() {
this.setData({
isloginBtnState: !this.data.isloginBtnState
})
},
userClickLogin(e) {
let data = e.detail.data
this.setData({
islogin: true,
isloginBtnState: false,
informationState: data.regdatastep == 'success' ? false : true,
})
this.onLoad(this.options)
},
// 子组件传值 修改 完善信息组件的状态
revampInformationState() {
this.setData({
informationState: false
})
},
// 打开状态
cutState() {
if (!this.data.islogin) {
this.openLoginBtnState()
return
}
this.setData({
stateState: !this.data.stateState,
})
},
//监听键盘
bindkeyboardheightchange(e) {
let keyboardHeight = e.detail.height || 0;
this.setData({
keyboardHeight,
});
},
// 监听输入 失去焦点
bindblur() {
this.setData({
keyboardHeight: 0,
});
},
// 打开备注弹窗
openRemark() {
if (!this.data.islogin) {
this.openLoginBtnState()
return
}
this.setData({
remarkState: true,
remarkFocus: false,
remarkInput: this.data.remark,
}, () => {
this.setData({
remarkFocus: true,
})
})
},
// 关闭备注
closeRemark() {
this.setData({
remarkState: false,
})
},
// 确定备注
confirmRemark() {
const contras = this.data.contras
util.wxpost("/api/project.user/remarks", {
token: contras.token,
remarks: this.data.remarkInput,
}).then(res => {
common.toast(res.message)
this.setData({
remark: this.data.remarkInput,
})
this.closeRemark()
})
},
// 点击 跳转 公共方法
goPage(e) {
const url = e.currentTarget.dataset.url
common.goPage(url)
},
goMyProject() {
if (!this.data.islogin) {
this.openLoginBtnState()
return
}
common.goPage("/pages/projectMy/projectMy?classify=manage")
},
handSide(e) {
const sideKey = e.currentTarget.dataset.key
const sideHeight = this.sideHeight
wx.pageScrollTo({
scrollTop: sideHeight[sideKey] - this.data.totalTopHeight || 0,
})
},
indexSidebar: null,
windowHeight: 812, // 屏幕高度
// 修改 项目 状态
changeType(e) {
const typeid = e.currentTarget.dataset.typeid
const contras = this.data.contras
util.wxpost("/api/project.user/changeType", {
token: contras.token || '',
typeid,
}).then(res => {
if (res.code != 200) return
common.toast(res.message)
contras['typeid'] = typeid
this.cutState()
this.setData({
contras,
})
})
},
delete() {
const contras = this.data.contras
util.wxpost("/api/project.user/delete", {
token: contras.token,
}).then(res => {
if (res.code != 200) return
common.toast(res.message)
contras['ismanage'] = 0
this.setData({
contras,
stateState: false,
})
})
},
// 点击加入对比单
addComparison() {
if (!this.data.islogin) {
this.openLoginBtnState()
return
}
const contras = this.data.contras
const info = this.data.info
util.wxpost("/api/project.contrast/add", {
projectid: info.id,
}).then(res => {
if (res.code != 200) return
const data = res.data
common.toast(res.message)
contras['status'] = 1
contras['ismanage'] = 1
contras['typeid'] = 0 // 默认是待定
contras['token'] = data.token
this.setData({
contras,
})
app.globalData.basicData['contrastcount'] = data.count
}).catch(err => {
if (err.code == 401) this.openLoginBtnState()
})
},
cutStudyMode(e) {
const type = e.currentTarget.dataset.type
this.setData({
studyMode: type,
})
},
// 获取招生官
getAdmissionList() {
util.wxget('/miniprogramApi/offer/home').then(res => {
if (res.code != 200) return
const data = res.data
let admissionsOfficer = data.admissionsOfficer || []
let urls = []
admissionsOfficer.forEach(element => {
let mold = null
if (element.date == null || element.date.indexOf("答疑") >= 0) mold = 3
else mold = this.isToday(element.date) ? 1 : 2
element.urls.forEach(ele => {
urls.push({
...ele,
mold,
logo: element['logo'],
})
})
})
const urlsOne = urls[0] || {}
const chunkedArray = [];
for (let i = 0; i < urls.length; i += 4) {
chunkedArray.push(urls.slice(i, i + 4));
}
this.setData({
urls: chunkedArray,
urlsOne,
})
})
},
isToday(dateString) {
const now = new Date().getTime()
const date = new Date(dateString).getTime()
return now <= date
},
getOfferData(projectid) {
util.wxget("/api/project.other/offerList?limit=2000&projectid=" + projectid, ).then(res => {
const data = res.data
const list = data.list || []
let side = this.data.side
if (list.length == 0) delete side.consult
list.forEach(element => {
element["timestamp"] = util.strtimeago(element["timestamp"], 3)
})
this.setData({
offerList: list,
side,
})
})
},
openPreview() {
wx.previewMedia({
sources: [{
url: '//framework.x-php.com/project//img/9dfc-c89f50deb0f906dd751540895bf0e303.jpg'
}],
showmenu: true,
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
this.getData()
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
this.getData()
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
return {
title: "【寄托港校项目库】 - " + this.data.info.name_zh,
}
},
onShareTimeline() {
util.statistics({
name: "share-timeline"
})
return {
title: "【寄托港校项目库】 - " + this.data.info.name_zh,
}
},
})

View File

@ -0,0 +1,9 @@
{
"usingComponents": {
"header-Nav": "/component/headerNav/headerNav",
"project-show-text": "/component/projectShowText/projectShowText",
"go-login": "/component/goLogin/goLogin",
"perfect-information": "/component/perfectInformation/perfectInformation",
"index-sidebar": "/component/indexSidebar/indexSidebar"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,728 @@
<!--pages/projectDetails/projectDetails.wxml-->
<header-Nav wx:if="{{ isadmission }}" class="header-nav" bgcolor="{{ !sideFixed ? 'transparent' : '#fbfbfb' }}" user="{{ user }}">
<view class="flexacenter" style="height: 100%;">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/admission-text-icon.png" mode="widthFix">
</image>
</view>
</header-Nav>
<header-Nav wx:else class="header-nav" bgcolor="{{ !sideFixed ? '#fff' : '#fbfbfb' }}">项目详情</header-Nav>
<view class="head-box {{ isadmission ? 'isadmission' : '' }}" style="padding-top: {{ totalTopHeight + 15 }}px">
<view class="name">{{ info.name_zh }}</view>
<view class="english">{{ info.name_en }}</view>
<view class="school flexacenter">
<view class="flexacenter" bind:tap="goPage" data-url="/pages/projectSchoolHomepage/projectSchoolHomepage?id={{ info.sid }}">
<image class="icon" src="{{ info.schoollogo }}" mode="heightFix"></image>
{{ info.schoolname || '' }}
</view>
<block wx:if="{{ info.au0 }}">
<view class="line">|</view>
{{ info.au0 }}
</block>
<block wx:if="{{ info.au1 }}">
<view class="line">|</view>
{{ info.au1 }}
</block>
</view>
</view>
<view class="main flexflex" style="min-height: calc(100vh - {{ headHeight - rpx30 }}px)">
<view class="side-box">
<view class="side {{ sideFixed ? 'sideFixed' : '' }}" style="top: {{ sideFixed ? totalTopHeight : 0 }}px;">
<view class="side-fill {{ sideKey == 'pivotal' ? 'side-fill-white' : '' }}"></view>
<view class="item flexcenter {{ index == sideKey ? 'pitch' : '' }}" wx:for="{{ side }}" bind:tap="handSide" data-key="{{ index }}" wx:key="index">
<view class="text">{{ item }}</view>
</view>
</view>
</view>
<view style="height: 100%" class="details-box flex1" scroll-y="{{ true }}" scroll-with-animation="{{ scrollAnimation }}">
<view class="side-item" wx:if="{{ false }}" type="answers">
<template is="item-header" data="{{ text: '招生官答网友问' }}"></template>
<view class="answer mb40">
<view class="hint flexflex">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/clock-icon.png"></image><text class="flex1">本期内容整理自2024年10月23日香港城市大学计算学院项目宣讲会。</text>
</view>
<scroll-view class="tab flexflex" scroll-x="{{ true }}">
<view class="tab-item pitch flexcenter">项目概述</view>
<view class="tab-item flexcenter">课程设置</view>
<view class="tab-item flexcenter">职业发展</view>
<view class="tab-item flexcenter">职业发展</view>
<view class="tab-item flexcenter">职业发展</view>
<view class="tab-item flexcenter">职业发展</view>
<view class="tab-item flexcenter">职业发展</view>
</scroll-view>
<view class="dialogue">
<view class="dialogue-left">
<view class="info flexacenter">
<image class="avatar" src="https://app.gter.net/image/miniApp/offer/avatar-default.svg"></image>
寄托网友
</view>
<view class="message">香港城市大学生物统计学系是一个什么样的系?香港城市大学生物统计学系是一个什么样的系?香港城市大学生物统计学系是一个什么样的系?</view>
<image class="message-img" mode="widthFix" bind:tap="openPreview" src="//framework.x-php.com/project//img/9dfc-c89f50deb0f906dd751540895bf0e303.jpg"></image>
</view>
<view class="dialogue-right">
<view class="info flexacenter">
招生官
<image class="avatar" src="https://app.gter.net/image/miniApp/offer/avatar-admission.png"></image>
</view>
<view class="message">香港城市大学生物统计学系是一个什么样的系?</view>
<image class="message-img" mode="widthFix" bind:tap="openPreview" src="//framework.x-php.com/project//img/9dfc-c89f50deb0f906dd751540895bf0e303.jpg"></image>
</view>
</view>
</view>
</view>
<!-- 招生官 -->
<view class="side-item" data-type="pivotal">
<view wx:if="{{ urls.length != 0 }}" class="admission-box block" bind:tap="cutAdmission">
<view class="head flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/talk-live-icon.png" mode="widthFix"></image>
<view class="text flexcenter">
<image class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-dark-cyan.svg"></image>
招生官为你答疑
</view>
</view>
<view class="content">
<view class="title">
<view class="admissionState state{{ urlsOne.mold }}">{{ moldObj[urlsOne.mold] }}</view>
{{ urlsOne.title }}
</view>
<view class="more flexcenter">
<text>more</text>
<image class="icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle.png" mode="widthFix"></image>
</view>
</view>
</view>
<!-- borderTop 招生官下需要一条线隔开 -->
<view class="semester-box flexacenter {{ urls.length != 0 ? 'borderTop' : '' }}">
<view class="text gray {{ info.semesterState ? 'semester' : '' }}">{{ info.semester.text || '' }}</view>
{{ info.semesterState ? "本项目招生信息已更新为" + (info.semester.text || '') : "学校尚未更新招生信息,请参考" + (info.semester.text || '') + "内容" }}
</view>
<view class="distinctive flexflex" wx:if="{{ info.distinctive }}">
<image class="img" src="https://app.gter.net/image/miniApp/offer/double-quotation-marks.png" mode="widthFix"></image>
<view class="flex1">{{ info.distinctive }}</view>
</view>
<view class="label flexflex">
<view class="item" wx:for="{{ info.tags }}" wx:key="index">{{ item }}</view>
</view>
<block wx:if="{{ info.rankings && info.rankings.length != 0 }}">
<view class="key-ranking block" bind:tap="goPage" data-url="/pages/projectList/projectList">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/major-icon.png" mode="widthFix">
</image>
<view class="list">
<view class="item flex1" wx:for="{{ info.rankings }}" wx:key="index">
<view class="quantity">{{ item.rank }}</view>
<view class="ranking-name">
{{ rankingsObj[item.system].name }}
<image wx:if="{{ item.system == 'QS' }}" class="ranking-icon" src="https://app.gter.net/image/miniApp/offer/triangle-QS.svg" mode="widthFix">
</image>
<image wx:if="{{ item.system == 'Times Higher Education' }}" class="ranking-icon" src="https://app.gter.net/image/miniApp/offer/triangle-TIMES.svg" mode="widthFix">
</image>
<image wx:if="{{ item.system == 'U.S. News' }}" class="ranking-icon" src="https://app.gter.net/image/miniApp/offer/triangle-US-News.svg" mode="widthFix">
</image>
<image wx:if="{{ item.system == 'Shanghai Ranking' }}" class="ranking-icon" src="https://app.gter.net/image/miniApp/offer/triangle-Soft.svg" mode="widthFix">
</image>
</view>
</view>
</view>
</view>
</block>
<!-- 总学费 -->
<view class="tuition block">
<view class="left flex1">
<view class="unit">{{ info.tuition_currency || 'HK$' }}</view>
<view class="number">{{ info.tuition_fee_text || '待确认' }}</view>
<view class="text">总学费</view>
</view>
<view class="right">
<view class="item flexacenter">
<view class="key">每学分学费</view>
<view class="value">{{ info.tuition_fee_per_credit_text || '-' }}</view>
</view>
<view class="item flexacenter">
<view class="key">申请费</view>
<view class="value">{{ info.application_fee_text || '-' }}</view>
</view>
<view class="item flexacenter">
<view class="key">入学保证金</view>
<view class="value">{{ info.admission_deposit_text || '-' }}</view>
</view>
</view>
</view>
<!-- 语言和奖金 -->
<view class="language-bonuses flexflex" wx:if="{{ info.scholarshipText || info.language_of_instruction_text }}">
<view class="item flex1 block">
<view class="name">{{ info.language_of_instruction_text || '-' }}</view>
<view class="value">教学语言</view>
</view>
<view class="item flex1 block">
<view class="name">{{ info.scholarshipText || '-' }}</view>
<view class="value">奖学金</view>
</view>
</view>
<view class="application-schedule block">
<view class="list">
<view class="time flexflex">
<view class="item flex1">
<view class="name">{{ info.application_start || '-' }}</view>
<view class="value">开始申请日期</view>
</view>
<view class="item flex1">
<view class="name">{{ info.application_end || '-' }}</view>
<view class="value">截止申请日期</view>
</view>
</view>
</view>
</view>
<view class="demand block" wx:if="{{ info.scoresList.length != 0 }}">
<view class="title">英语能力要求</view>
<view class="hint">满足以下其中一项即可</view>
<view class="list">
<view class="item" wx:for="{{ info.scoresList }}" wx:key="index">
<image class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
<view class="name">{{ item.name }}</view>
<view class="value">{{ item.text }}</view>
</view>
</view>
</view>
</view>
<view class="side-item" data-type="basic">
<block wx:if="{{ info.rankings && info.rankings.length != 0 }}">
<template is="item-header" data="{{ text: '专业排名', type: 'rankings' }}"></template>
<view class="ranking">
<view class="item flexflex" wx:for="{{ info.rankings }}" wx:key="index" bind:tap="goPage" data-url="/pages/projectList/projectList">
<view class="rank flexflex">
<view class="number {{ rankingsObj[item.system].alias }}">
{{ item.rank }}
<image wx:if="{{ item.system == 'QS' }}" class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-qs.svg" mode="widthFix"></image>
<image wx:if="{{ item.system == 'Shanghai Ranking' }}" class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-rk.svg" mode="widthFix"></image>
<image wx:if="{{ item.system == 'Times Higher Education' }}" class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-ti.svg" mode="widthFix"></image>
<image wx:if="{{ item.system == 'U.S. News' }}" class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-us.svg" mode="widthFix"></image>
</view>
<view class="name">{{ rankingsObj[item.system].name }}</view>
</view>
<view class="box flex1">
<view class="itemm flexacenter">
<view class="key">年份:</view>
<view class="value flex1">{{ item.year }}</view>
</view>
<view class="itemm flexacenter">
<view class="key">学科:</view>
<view class="value flex1">{{ item.subject }}</view>
</view>
</view>
</view>
</view>
</block>
<block wx:if="{{ info.intro }}">
<template is="item-header" data="{{ text: '项目简介' }}"></template>
<view class="block">
<project-show-text className="intro_zh" text="{{ info.intro || ' - ' }}"></project-show-text>
</view>
</block>
<block wx:if="{{ info.accreditation }}">
<template is="item-header" data="{{ text: '专业资格认证' }}"></template>
<view class="block">
<project-show-text className="accreditation" text="{{ info.accreditation || '无' }}"></project-show-text>
</view>
</block>
</view>
<view class="side-item" data-type="apply">
<template is="item-header" data="{{ text: '申请日程' }}"></template>
<view class="application-schedule block">
<view class="list" wx:for="{{ info.interviewRounds }}" wx:key="index">
<view class="index flexacenter" wx:if="{{ info.interviewRounds.length != 1 }}">
<view class="sum flexcenter">{{ index + 1 }}</view>
{{ item.text }}
</view>
<view class="time flexflex">
<view class="item flex1">
<view class="name">{{ info.application_start || '-' }}</view>
<view class="value">开始申请日期</view>
</view>
<view class="item flex1">
<view class="name">{{ item.time || '-' }}</view>
<view class="value">截止申请日期</view>
</view>
</view>
</view>
<view class="else" wx:if="{{ info.interview_date || info.result_date }}">
<view class="item flexacenter" wx:if="{{ info.interview_date }}">
<view class="name">面试时间:</view>
<view class="value flex1">{{ info.interview_date }}</view>
</view>
<view class="item flexacenter" wx:if="{{ info.result_date }}">
<view class="name">结果通知时间:</view>
<view class="value flex1">{{ info.result_date }}</view>
</view>
</view>
</view>
<template is="item-header" data="{{ text: '最低入学要求' }}"></template>
<view class="demand block">
<view class="text">{{ info.entrance_requirements || '-' }}</view>
<block wx:if="{{ info.language_proficiency_scores }}">
<view class="title">英语能力要求</view>
<view class="hint">满足以下其中一项即可</view>
<view class="list">
<block wx:for="{{ info.language_proficiency_scores }}" wx:key="index">
<view class="item" wx:if="{{ item.total }}">
<image class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
<view class="name">{{ item.name_zh }}</view>
<view class="value">总分 {{ item.total }} 分以上</view>
</view>
</block>
</view>
</block>
</view>
<block wx:if="{{ info.documents_required }}">
<template is="item-header" data="{{ text: '必须文件' }}"></template>
<view class="block">
<project-show-text className="documents_required" text="{{ info.documents_required || '无' }}">
</project-show-text>
</view>
</block>
<template is="item-header" data="{{ text: '费用' }}"></template>
<view class="tuition block">
<view class="left flex1">
<view class="unit">{{ info.tuition_currency || 'HK$' }}</view>
<view class="number">{{ info.tuition_fee_text || '待确认' }}</view>
<view class="text">总学费</view>
</view>
<view class="right">
<view class="item flexacenter">
<view class="key">每学分学费</view>
<view class="value">{{ info.tuition_fee_per_credit_text || '-' }}</view>
</view>
<view class="item flexacenter">
<view class="key">申请费</view>
<view class="value">{{ info.application_fee_text || '-' }}</view>
</view>
<view class="item flexacenter">
<view class="key">入学保证金</view>
<view class="value">{{ info.admission_deposit_text || '-' }}</view>
</view>
</view>
</view>
<block wx:if="{{ info.scholarships }}">
<template is="item-header" data="{{ text: '奖学金' }}"></template>
<view class="block">
<project-show-text className="scholarships" text="{{ info.scholarships || '-' }}"></project-show-text>
</view>
</block>
<block wx:if="{{ info.selection_criteria }}">
<template is="item-header" data="{{ text: '录取选择标准' }}"></template>
<view class="block">
<project-show-text className="selection_criteria" text="{{ info.selection_criteria || '- 暂无 -' }}"></project-show-text>
</view>
</block>
<block wx:if="{{ info.recent_admission }}">
<template is="item-header" data="{{ text: '近期录取信息' }}"></template>
<view class="block">
<project-show-text className="recent_admission" text="{{ info.recent_admission || '- 暂无 -' }}"></project-show-text>
</view>
</block>
</view>
<view class="side-item" data-type="attend">
<template is="item-header" data="{{ text: '学习模式' }}"></template>
<view class="pattern block">
<view class="tab flexacenter">
<view class="item flex1 flexcenter {{ studyMode == 'ft' ? 'pitch' : '' }}" bind:tap="cutStudyMode" data-type="ft">全日制</view>
<view class="item flex1 flexcenter {{ studyMode == 'pt' ? 'pitch' : '' }}" bind:tap="cutStudyMode" data-type="pt">兼读制</view>
</view>
<view wx:if="{{ studyMode == 'ft' }}" class="introduce flexflex">
<view class="item flex1">
<view class="value">{{ info.language_of_instruction_text || '-' }}</view>
<view class="name">教学语言</view>
</view>
<view class="item flex1">
<view class="value">{{ info.ft_normal_period || '-' }}</view>
<view class="name">正常学习时长</view>
</view>
<view class="item flex1">
<view class="value">{{ info.ft_maximum_period || '待确认' }}</view>
<view class="name">最长学习时长</view>
</view>
</view>
<view wx:else class="introduce flexflex">
<view class="item flex1">
<view class="value">{{ info.language_of_instruction_text || '-' }}</view>
<view class="name">教学语言</view>
</view>
<view class="item flex1">
<view class="value">{{ info.pt_normal_period || '-' }}</view>
<view class="name">正常学习时长</view>
</view>
<view class="item flex1">
<view class="value">{{ info.pt_maximum_period || '待确认' }}</view>
<view class="name">最长学习时长</view>
</view>
</view>
</view>
<block wx:if="{{ info.time_of_class }}">
<template is="item-header" data="{{ text: '上课时间' }}"></template>
<view class="block">
<project-show-text className="time_of_class" text="{{ info.time_of_class || '- 暂无 -' }}"></project-show-text>
</view>
</block>
<template wx:if="{{ course.required.length != 0 || course.required.length != 0 }}" is="item-header" data="{{ text: '课程设置' }}"></template>
<view wx:if="{{ course.required.length != 0 }}" class="course block">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
<view class="title">必修课程</view>
<view class="hint" wx:if="{{ course.requiredCount }}">(共 {{ course.requiredCount }} 学分)</view>
<view class="table-head flexacenter">
<view class="item number">课程编号</view>
<view class="item name flex1">课程名称</view>
<view class="item credit">学分</view>
</view>
<view class="table-body">
<view class="list" wx:for="{{ course.required }}" wx:key="index">
<view class="item number flexcenter">{{ item.course_code || '-' }}</view>
<view class="item name flex1">
<view class="text">{{ item.course_name_zh }}</view>
<view class="english">{{ item.course_name_en }}</view>
</view>
<view class="item credit flexcenter">{{ item.credit || '-' }}</view>
</view>
</view>
</view>
<view wx:if="{{ course.elective.length != 0 }}" class="course block">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
<view class="title">选修课程</view>
<view class="table-head flexacenter">
<view class="item number">课程编号</view>
<view class="item name flex1">课程名称</view>
<view class="item credit">学分</view>
</view>
<view class="table-body">
<view class="list" wx:for="{{ course.elective }}" wx:key="index">
<view class="item number flexcenter">{{ item.course_code || '-' }}</view>
<view class="item name flex1">
<view class="text">{{ item.course_name_zh }}</view>
<view class="english">{{ item.course_name_en }}</view>
</view>
<view class="item credit flexcenter">{{ item.credit || '-' }}</view>
</view>
</view>
</view>
<view class="link block" wx:if="{{ info.catalog_url }}">
<view class="title">申请页项目详情</view>
<view class="text">{{ info.catalog_url }}</view>
<view class="btn flexcenter" bind:tap="copy" data-text="{{ info.catalog_url }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/copy-icon.png" mode="widthFix">
</image>
复制链接
</view>
</view>
</view>
<view class="side-item" data-type="graduate">
<block wx:if="{{ info.award_zh }}">
<template is="item-header" data="{{ text: '学位' }}"></template>
<view class="degree block">
<view class="title flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/name-bj.svg" mode="widthFix">
</image>
学位名称
</view>
<view class="name">{{ info.award_zh }}</view>
<view class="english">{{ info.award_en }}</view>
</view>
</block>
<block wx:if="{{ info.graduation_requirements }}">
<template is="item-header" data="{{ text: '毕业要求' }}"></template>
<view class="block">
<project-show-text className="graduation_requirements" text="{{ info.graduation_requirements || '- 暂无 -' }}"></project-show-text>
</view>
</block>
<template wx:if="{{ info.domains || info.employers || info.positions }}" is="item-header" data="{{ text: '历届毕业生就业方向' }}"></template>
<view class="block" wx:if="{{ info.domains }}">
<project-show-text titleName="就业领域" className="domains" text="{{ info.domains || '- 暂无 -' }}"></project-show-text>
</view>
<view class="block" wx:if="{{ info.employers }}">
<project-show-text titleName="主要雇主名单" className="employers" text="{{ info.employers || '- 暂无 -' }}"></project-show-text>
</view>
<view class="block" wx:if="{{ info.positions }}">
<project-show-text titleName="职业岗位" className="positions" text="{{ info.positions || '- 暂无 -' }}"></project-show-text>
</view>
<!-- </block> -->
</view>
<view wx:if="{{ offerList.length != 0 }}" class="side-item" data-type="consult">
<template is="item-header" data="{{ text: '寄托录取参考', type: 'consult' }}"></template>
<view class="consult-list">
<navigator class="consult-item" target="miniProgram" app-id="wxa9296b07391c2bc7" wx:for="{{ offerList }}" wx:key="index" path="/pages/victoryDetails/victoryDetails?id={{ item.id || item.uniqid }}" hover-class="none">
<view class="school flexacenter">
<image class="img" src="{{ item.schoolimage }}" mode="widthFix"></image>
{{ item.schoolname }}
</view>
<view class="info-item flexflex" wx:if="{{item.professional}}">
<view class="info-major">专业</view>
<view class="info-value flex1" wx:if="{{item.professionalzhong}}">
<text>{{ item.professionaltou }}</text>
<text style="color: #509CE3;">{{ item.professionalzhong }}</text>
<text>{{ item.professionalend }}</text>
</view>
<view class="info-value flex1 " wx:else>{{ item.professional }}</view>
</view>
<view class="info-item flexflex" wx:if="{{item.project}}">
<view class="info-major">项目</view>
<view class="info-value flex1" wx:if="{{item.projecttzhong}}">
<text>{{ item.projecttou }}</text>
<text style="color: #509CE3;">{{ item.projecttzhong }}</text>
<text>{{ item.projecttend }}</text>
</view>
<view class="info-value flex1" wx:else>{{ item.project }}</view>
</view>
<view class="info-item flexacenter" style="align-items: center;font-size: 27rpx;">
{{ item.semester }}
<view class="line-between"></view>
{{ item.degree }}
<view class="line-between"></view>
<view class="info-item-results flexacenter results{{ item.apply_resultstatus }}">{{ item.apply_results }}</view>
</view>
<view class="info-xiaobox flexacenter" wx:if="{{ item.message }}">
<view class="info-content one-line-display" wx:if="{{ item.message }}">{{ item.message }}</view>
</view>
<view class="bottom flexacenter">
<view class="bottom-left flexacenter">
<image class="bottom-avatar" src="{{ item.avatar }}"></image>
{{ item.timestamp }}
</view>
<view wx:if="{{ isShowEmoji }}" class="numerical-box" style="display: flex;margin-left: 15rpx;">
<view class="emoji-item" wx:for="{{ items }}" wx:key="index">
<rich-text class="emoji-item-icon" nodes="&#x{{ item }};" />
</view>
</view>
<!-- 数值 -->
<view wx:else class="numerical-box flexacenter">
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/u884.png"></image>
{{ item.view || 0 }}
</view>
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" style="width: 20rpx;" src="https://app.gter.net/image/miniApp/offer/expression-icon.png"></image>
{{ item.ripostes || 0 }}
</view>
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/project/discuss-icon.png"></image>
{{ item.comments || 0 }}
</view>
<view class="item-bottom-item flexcenter">
<image class="item-bottom-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/bi-icon.png"></image>
{{ item.reward || 0 }}
</view>
</view>
</view>
</navigator>
</view>
</view>
<view class="side-item" data-type="issue" wx:if="{{ info.faq && info.faq.length != 0 }}">
<view class="issue-bj" wx:for="{{ info.faq }}" wx:key="index">
<view class="issue block">
<view class="index flexcenter">{{ item.num }}</view>
<image class="index-bj" src="https://app.gter.net/image/miniApp/offer/index-bj.svg"></image>
<view class="title">{{ item.question }}</view>
<view class="text">{{ item.answer }}</view>
</view>
</view>
</view>
<view wx:if="{{ info.leaflet_url || info.program_url || info.catalog_url }}" class="side-item" data-type="links">
<view class="pdf block" wx:if="{{ info.leaflet_url }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/pdf-icon.svg" mode="widthFix"></image>
<view class="title">官方宣传册</view>
<view class="name">{{ info.leaflet_name || '-' }}</view>
<view class="btn flexcenter" bind:tap="openFile" data-url="{{ info.leaflet_url }}">打开文件</view>
</view>
<view class="link block" wx:if="{{ info.program_url }}">
<view class="title">学院网站项目详情</view>
<view class="text">{{ info.program_url }}</view>
<view class="btn flexcenter" bind:tap="copy" data-text="{{ info.program_url }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/copy-icon.png" mode="widthFix"></image>
复制链接
</view>
</view>
<view class="link block" wx:if="{{ info.catalog_url }}">
<view class="title">项目目录项目详情</view>
<view class="text">{{ info.catalog_url }}</view>
<view class="btn flexcenter" bind:tap="copy" data-text="{{ info.catalog_url }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/copy-icon.png" mode="widthFix"></image>
复制链接
</view>
</view>
</view>
<text class="upglide flexcenter">- End -</text>
</view>
</view>
<!-- 底部导航栏 -->
<view class="bottom-base flexflex">
<view class="left flexcenter" bind:tap="goMyProject">
我的项目
<image class="icon" src="https://app.gter.net/image/miniApp/offer/arrows-circle-olivine.svg" mode="widthFix"></image>
</view>
<view class="right flex1 flexacenter">
<view class="btn flexcenter" wx:if="{{ (contras.ismanage == null || contras.ismanage == 0) && (contras.status == null || contras.status == 0) }}" bind:tap="addComparison">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/flyingFriend-add.svg" mode="widthFix"></image>
加入对比单
</view>
<block wx:elif="{{ contras.ismanage == 1 && contras.status == 1 }}">
<view class="remark flexacenter" bind:tap="openRemark">
<image class="icon" src="https://app.gter.net/image/miniApp/project/u1434.png" mode="widthFix"></image>
<view wx:if="{{ remark }}" class="text one-line-display">{{ remark }}</view>
<view wx:else class="text placeholder">添加备注…</view>
</view>
<view class="state-mask" wx:if="{{ stateState }}" bind:tap="cutState"></view>
<view class="state">
<view class="state-box {{ contras.typeid == 0 ? 'undetermined' : '' }} {{ stateState ? 'show' : '' }}">
<view class="state-list">
<view class="state-item flexcenter {{ contras.typeid == index ? 'pitch' : '' }}" wx:for="{{ stateObj }}" wx:key="index" catch:tap="changeType" data-typeid="{{ index }}">
{{ item }}
</view>
</view>
<view class="delete flexcenter" bind:tap="delete">
<view class="delete-btn flexcenter">
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/delete-light-grey.svg"></image>
</view>
</view>
<view class="state-pitch flexcenter" catch:tap="cutState">
{{ stateObj[contras.typeid || 0] }}
<image class="icon" src="https://app.gter.net/image/miniApp/offer/triangle-white.svg"></image>
</view>
</view>
</view>
</block>
<view wx:else class="btns flex1 flexacenter">
<view class="item flexcenter flex1 {{ contras.status == 1 ? 'already' : '' }}" bind:tap="addComparison">
<image wx:if="{{ contras.status == 1 }}" class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg"></image>
<image wx:else class="icon" src="https://app.gter.net/image/miniApp/offer/add-deep-blue.svg"></image>
{{ contras.status == 1 ? '已' : '' }}加入对比单
</view>
<view class="item flexcenter flex1 {{ contras.ismanage == 1 ? 'already' : '' }}" bind:tap="addComparison">
<image wx:if="{{ contras.ismanage == 1 }}" class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg"></image>
<image wx:else class="icon" src="https://app.gter.net/image/miniApp/offer/add-deep-blue.svg"></image>
{{ contras.ismanage == 1 ? '已' : '' }}加入项目管理
</view>
</view>
</view>
</view>
<!-- 招生官弹窗 -->
<view class="admission-pop" wx:if="{{ admissionState }}" catch:touchmove="return" bind:tap="cutAdmission">
<view class="admission-box" catch:tap="return">
<view class="head flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/talk-live-full-icon.png" mode="widthFix">
</image>
<view class="text flexcenter">
<image class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-dark-cyan.svg"></image>
招生官为你答疑
</view>
</view>
<view class="content">
<swiper class="swiper" bindchange="admissionChange">
<swiper-item class="swiper-item" wx:for="{{ urls }}" wx:key="index">
<view class="item flexacenter" wx:for="{{ item }}" wx:key="index">
<view class="flexcenter icon-box">
<image class="icon" src="{{ item.logo }}" mode="heightFix"></image>
</view>
<view class="text flex1">
<view class="admissionState state{{ item.mold }}">{{ moldObj[item.mold] }}</view>
{{ item.title }}
</view>
</view>
</swiper-item>
</swiper>
<view class="point flexcenter">
<view class="item {{ admissionCurrent == index ? 'pitch' : '' }}" wx:for="{{ urls }}" wx:key="index">
</view>
</view>
<image class="triangle" src="https://app.gter.net/image/miniApp/offer/triangle-white-lucency.svg" mode="widthFix"></image>
</view>
<view class="word flexcenter">
<image class="item" src="https://app.gter.net/image/miniApp/offer/word-live.png" mode="widthFix"></image>
<image class="item" src="https://app.gter.net/image/miniApp/offer/word-playback.png" mode="widthFix">
</image>
<image class="item" src="https://app.gter.net/image/miniApp/offer/word-answer.png" mode="widthFix"></image>
</view>
<view class="hint">请添加申请小助手</view>
<view class="QR-code flexcenter">
<image class="icon" src="https://u.gter.net/assistantwxqrcode.png" mode="widthFix" show-menu-by-longpress="{{ true }}"></image>
</view>
</view>
</view>
<!-- 输入备注弹窗 -->
<view wx:if="{{ remarkState }}" class="remark-mask flexflex" style="height: calc(100vh - {{ keyboardHeight }}px);" bind:tap="closeRemark" catchtouchmove="return">
<view class="remark" catch:tap="return">
<textarea class="remark-input" cursor-spacing="{{ 5 }}" placeholder="添加备注…" maxlength="{{ 100 }}" focus="{{ remarkFocus }}" auto-focus="{{ remarkFocus }}" model:value="{{ remarkInput }}" adjust-position="{{ false }}" show-confirm-bar="{{ false }}" bindkeyboardheightchange="bindkeyboardheightchange" bind:blur="bindblur"></textarea>
<view class="remark-bottom flexacenter">
<view class="remark-limit">{{ remarkInput.length }}/100</view>
<view class="remark-btn flexcenter" bindtap="confirmRemark">
<image class="remark-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/arrows-deep-blue-green.svg"></image>
</view>
</view>
</view>
</view>
<template name="item-header">
<view class="item-header flexacenter">
<view class="flexacenter">
<view class="greenDot"></view>
{{ text }}
</view>
<view wx:if="{{ type == 'rankings' }}" class="list-btn flexacenter" bind:tap="goPage" data-url="/pages/projectList/projectList">
榜单
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png"></image>
</view>
<navigator wx:if="{{ type == 'consult' }}" class="list-btn flexacenter" path="/pages/victoryList/victoryList" target="miniProgram" app-id="wxa9296b07391c2bc7" hover-class="none">
Offer榜
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png"></image>
</navigator>
</view>
</template>
<go-login wx:if="{{ isloginBtnState }}" islogin="{{ islogin }}" binduserClickLogin="userClickLogin" bindpopClose="popClose"></go-login>
<perfect-information wx:if="{{ informationState }}" bindrevampInformationState="revampInformationState"></perfect-information>
<index-sidebar id="index-sidebar" class="index-sidebar" sidebarType="xg" isInitFinish="{{ isInitFinish }}" bind:openLogin="openLoginBtnState" islogin="{{ islogin }}"></index-sidebar>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,700 @@
// pages/projectLibrary/projectLibrary.js
var miucms = require('../../utils/miucms.js');
let app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Page({
/**
* 页面的初始数据
*/
data: {
totalTopHeight: null,
isFirstPattern: true, // 是否是首屏模式
classify: "school", // school subject
current: 0,
discipline: [], // 学科
university: [], // 学校
bezier: {},
page: 1,
list: [],
listLeft: [],
listRight: [],
fateProject: [], // 缘分项目
admissionList: [], // 招生官项目
contrastcount: 0, // 项目对比 数量
informationState: false, // 授权后可能需要弹出完成信息框 个人背景那些
islogin: false,
isloginBtnState: false,
isInitFinish: false,
user: {},
},
/**
* 生命周期函数--监听页面加载
*/
headHeight: 0, // 头部高度
rpx15: 15,
searchBoxTop: 0,
options: {},
onLoad(options) {
this.options = options
miucms.pageStart(app).then(() => {
const screen_data = app.globalData.screen_data
const totalTopHeight = screen_data.totalTopHeight || 0
this.searchBoxTop = util.rpxTopx(313.5) + totalTopHeight
this.headHeight = util.rpxTopx(313.5)
this.rpx15 = util.rpxTopx(15)
this.setData({
islogin: app.globalData.user.uid > 0 ? true : false,
user: app.globalData.user,
totalTopHeight,
isInitFinish: true,
bottomLift: screen_data.bottomLift,
})
this.windowHeight = screen_data.windowHeight || 812
common.xgBasicData(this, app, true).then(data => {
this.setData({
contrastcount: data.contrastcount || 0,
university: data.university,
discipline: data.discipline,
})
})
this.getFate()
this.getAdmission()
this.addRandom()
this.getProjectData()
const fateProject = (this.data.fateProject || []).map(element => ({
...element,
random: app.randomString(6)
}));
this.setData({
fateProject,
})
})
},
addRandom() {
let list = this.data.list || []
list.forEach(element => {
element['random'] = app.randomString(6)
})
this.setData({
list
})
},
leftheight: 0,
rightheight: 0,
// 处理瀑布流
handleLazyLoading(list) {
this.getHeightState = true
const length = list.length
const eighty = Math.floor(length * 0.8)
let left = []
let right = []
// 变量决定第一个元素是放入 left 还是 right
const startWithLeft = this.leftheight <= this.rightheight; // 如果为 true第一个元素放入 left否则放入 right
const pointList = list.slice(0, eighty)
pointList.forEach((element, index) => {
if ((index % 2 === 0 && startWithLeft) || (index % 2 !== 0 && !startWithLeft)) left.push(element);
else right.push(element);
})
this.setData({
listLeft: this.data.listLeft.concat(left),
listRight: this.data.listRight.concat(right),
})
this.getHeight(list, eighty)
},
queryLeft: null,
getHeightState: false, // 瀑布流计算中
// 获取高度
getHeight(list, index) {
if (!list[index]) {
this.getHeightState = false
return
}
this.createSelectorQuery().select(".waterfall .waterfall-left").boundingClientRect(res => {
this.leftheight = res.height
this.createSelectorQuery().select(".waterfall .waterfall-right").boundingClientRect(res => {
this.rightheight = res.height
if (this.leftheight <= this.rightheight) {
this.data.listLeft.push(list[index])
this.setData({
listLeft: this.data.listLeft
})
} else {
this.data.listRight.push(list[index])
this.setData({
listRight: this.data.listRight
})
}
wx.nextTick(() => {
this.getHeight(list, index + 1)
})
}).exec();
}).exec();
},
// 获取今日缘分
getFate() {
wx.showLoading({
title: '加载中...',
})
util.wxget("/api/project.home/todayFateProject").then(res => {
if (res.code != 200) return
const data = res.data || []
data.forEach(element => {
element['random'] = app.randomString(6)
})
this.setData({
fateProject: data,
})
}).finally(() => {
wx.hideLoading()
})
},
// 获取 招生官项目
getAdmission() {
util.wxget("/api/project.lists", {
limit: 20,
page: 1,
admissionsproject: 1,
}).then(res => {
if (res.code != 200) return
const data = res.data
const list = data.data || []
const admissionList = (list || []).map(element => ({
...element,
random: app.randomString(6)
}));
const chunkArray = (array, size) => {
const result = [];
for (let i = 0; i < array.length; i += size) {
result.push(array.slice(i, i + size));
}
return result;
};
const groupedAdmissionList = chunkArray(admissionList, 4);
this.setData({
admissionList: groupedAdmissionList,
})
})
},
// 获取项目数据
getProjectData() {
if (this.data.page == 0) return
wx.showLoading({
title: '加载中...',
})
util.wxget("/api/project.lists", {
limit: 20,
page: this.data.page,
}).then(res => {
if (res.code != 200) return
const data = res.data
const date = new Date()
const month = date.getMonth() + 1
const year = date.getFullYear()
let list = data.data || []
list = (list).map(element => ({
...element,
random: app.randomString(6),
semesterState: month > element.semester.month && year + 1 <= element.semester.year,
}));
this.setData({
list: this.data.list.concat(list),
page: data.count > data.limit * data.page ? this.data.page + 1 : 0,
})
this.handleLazyLoading(list)
if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
}).finally(() => {
wx.hideLoading()
})
},
// 物品的点击事件
handleClick(e) {
if (!this.data.islogin) {
this.openLoginBtnState()
return
}
const id = e.currentTarget.dataset.id
const index = e.currentTarget.dataset.index || 0
const i = e.currentTarget.dataset.i || 0
const status = e.currentTarget.dataset.status || 0
const type = e.currentTarget.dataset.type
const random = e.currentTarget.dataset.random
const query = this.createSelectorQuery();
if (status == 1) return
console.log("random", random);
query.select('#add' + random).boundingClientRect();
if (status == 0) {
this.setData({
bezier: {},
})
query.exec((res) => {
const data = res[0]
//定义手指点击位置
this.setData({
bezier: {
x: data.left + data.width / 2 - this.rpx15,
y: data.top + data.height / 2 - this.rpx15,
},
})
});
}
let url = "/api/project.contrast/add"
util.wxpost(url, {
projectid: id
}).then(res => {
if (res.code != 200) return
const data = res.data
if (type === 'admission') {
const admissionList = this.data.admissionList
if (admissionList[index][i]['contraststatus'] == null) admissionList[index][i]['contraststatus'] = {}
admissionList[index][i]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
admissionList,
})
}
console.log("type", type);
if (type === 'left') {
const listLeft = this.data.listLeft
if (listLeft[index]['contraststatus'] == null) listLeft[index]['contraststatus'] = {}
listLeft[index]['contraststatus'] = {
status: 1,
ismanage: 1,
}
console.log("listLeft", listLeft, index, "index");
this.setData({
listLeft,
})
}
if (type === 'right') {
const listRight = this.data.listRight
if (listRight[index]['contraststatus'] == null) listRight[index]['contraststatus'] = {}
listRight[index]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
listRight,
})
}
if (type == 'fate') {
let fateProject = this.data.fateProject
fateProject[index]['state'] = 1
this.setData({
fateProject,
})
}
this.setData({
contrastcount: data.count,
})
app.globalData.basicData['contrastcount'] = data.count
common.toast(res.message)
})
},
// 切换查看类型
cutClassify(e) {
const classify = e.currentTarget.dataset.type
if (classify == this.data.classify) return
this.setData({
classify
})
},
swiperchange(e) {
this.setData({
current: e.detail.current,
})
this.closeMoreSelectAll('admission')
},
// 点击跳转 招生官频道
goAdmission() {
wx.navigateToMiniProgram({
appId:"wxa9296b07391c2bc7",
path:"/pages/admissionList/admissionList"
})
// common.goPage("/pages/admissionList/admissionList")
},
// 点击 查看 学校
goClassifyValue(e) {
const classify = this.data.classify
const value = e.currentTarget.dataset.value
const name = e.currentTarget.dataset.label
let url = ""
if (classify == 'school') url = `/pages/projectSchoolHomepage/projectSchoolHomepage?id=${value}`
else url = `/pages/projectSubjectList/projectSubjectList?id=${value}`
common.goPage(url)
},
// 点击项目详情
goDetails(e) {
const uniqid = e.currentTarget.dataset.uniqid
const pageUrl = e.currentTarget.dataset.url
let url = `/pages/projectDetails/projectDetails?uniqid=${uniqid}`
common.goPage(url)
},
// 点击跳转群主
jumpGroup() {
// const url = "https://form.gter.net/D8i0iS5uXCWG#/qr"
// common.goPage(`/pages/webview/webview?url=${url}`)
this.indexSidebar.setData({
groupState: true,
})
util.statistics({
name: "side-group"
})
},
indexSidebar: null,
windowHeight: 812,
onPageScroll(e) {
const scrollTop = e.scrollTop
let isFirstPattern = true
if (scrollTop > this.headHeight) 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()
},
goPage(e) {
const url = e.currentTarget.dataset.url
common.goPage(url)
},
openMoreSelect(e) {
const index = e.currentTarget.dataset.index || 0
const i = e.currentTarget.dataset.i || 0
const type = e.currentTarget.dataset.type
if (type == 'admission') {
const admissionList = this.data.admissionList
admissionList.forEach(element => {
console.log("element", element);
element.forEach(ele => {
ele['moreState'] = false
})
})
admissionList[index][i]['moreState'] = true
this.setData({
admissionList,
})
}
if (type == 'left') {
let listLeft = this.data.listLeft
listLeft.forEach(element => {
element['moreState'] = false
})
listLeft[index]['moreState'] = true
this.setData({
listLeft,
})
}
if (type == 'right') {
let listRight = this.data.listRight
listRight.forEach(element => {
element['moreState'] = false
})
listRight[index]['moreState'] = true
this.setData({
listRight,
})
}
},
closeMoreSelect(e) {
const type = e.currentTarget.dataset.type
this.closeMoreSelectAll(type)
},
// 关闭所有 状态 选择 弹出框
closeMoreSelectAll(type) {
if (type == 'admission') {
const admissionList = this.data.admissionList
admissionList.forEach(element => {
console.log("element", element);
element.forEach(ele => {
ele['moreState'] = false
})
})
this.setData({
admissionList,
})
}
if (type == 'left') {
let listLeft = this.data.listLeft
listLeft.forEach(element => {
element['moreState'] = false
})
this.setData({
listLeft,
})
}
if (type == 'right') {
let listRight = this.data.listRight
listRight.forEach(element => {
element['moreState'] = false
})
this.setData({
listRight,
})
}
},
addProject(e) {
const index = e.currentTarget.dataset.index
const i = e.currentTarget.dataset.i
const id = e.currentTarget.dataset.id
const type = e.currentTarget.dataset.type
util.wxpost("/api/project.contrast/add", {
projectid: id
}).then(res => {
if (res.code != 200) return
const data = res.data
if (type == 'admission') {
let list = this.data.admissionList
if (list[index][i]['contraststatus'] == null) list[index][i]['contraststatus'] = {}
list[index][i]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
admissionList: list,
})
}
if (type == 'left') {
let list = this.data.listLeft
if (list[index]['contraststatus'] == null) list[index]['contraststatus'] = {}
list[index]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
listLeft: list,
})
}
if (type == 'right') {
let list = this.data.listRight
if (list[index]['contraststatus'] == null) list[index]['contraststatus'] = {}
list[index]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
listRight: list,
})
}
this.setData({
contrastcount: data.count,
})
app.globalData.basicData['contrastcount'] = data.count
common.toast(res.message)
})
},
// 打开 授权按钮
openLoginBtnState() {
this.setData({
isloginBtnState: true,
})
},
// 关闭授权登录事件
popClose() {
this.setData({
isloginBtnState: !this.data.isloginBtnState
})
},
userClickLogin(e) {
let data = e.detail.data
this.setData({
islogin: true,
isloginBtnState: false,
informationState: data.regdatastep == 'success' ? false : true,
})
this.onLoad(this.options)
},
// 子组件传值 修改 完善信息组件的状态
revampInformationState() {
this.setData({
informationState: false
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
if (app.globalData.basicDataState) {
this.setData({
contrastcount: app.globalData.basicData['contrastcount'],
})
}
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
if (!this.getHeightState) this.getProjectData()
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
return {
title: "聚焦港校项目,助你迈向国际名校之路!",
}
},
onShareTimeline() {
util.statistics({
name: "share-timeline"
})
return {
title: "聚焦港校项目,助你迈向国际名校之路!",
}
},
})

View File

@ -0,0 +1,8 @@
{
"usingComponents": {
"header-nav": "/component/headerNav/headerNav",
"xg-bottom": "/component/xg-bottom/xg-bottom",
"go-login": "/component/goLogin/goLogin",
"index-sidebar": "/component/indexSidebar/indexSidebar"
}
}

View File

@ -0,0 +1,743 @@
/* pages/projectLibrary/projectLibrary.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.container {
min-height: 100vh;
background-color: rgba(245, 245, 245, 1);
}
.header-nav {
position: absolute;
top: 0;
}
.header-box {
width: 750rpx;
background: -webkit-linear-gradient(270deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
background: -moz-linear-gradient(180deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
background: linear-gradient(180deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
padding-top: 127.5rpx;
margin-bottom: 45rpx;
display: flex;
align-items: center;
overflow: hidden;
padding-bottom: 100rpx;
.header-left {
display: inline-block;
padding-left: 90rpx;
margin-right: 63rpx;
.header-title {
border-bottom: 1rpx solid rgb(121, 121, 121);
padding: 14rpx 0;
display: flex;
justify-content: center;
.header-title-icon {
width: 276rpx;
height: 72rpx;
}
text {
font-family: 'ArialRoundedMTBold', 'Arial Rounded MT Bold', 'Arial', sans-serif;
}
}
.header-brief {
// font-size: 25.5rpx;
// letter-spacing: 1.65rpx;
// color: #333333;
// width: 100%;
border-bottom: 1rpx solid rgb(121, 121, 121);
// padding-top: 5rpx;
// padding-bottom: 6rpx;
// text-align: center;
// justify-content: space-between;
// .brief-icon {
// width: 36rpx;
// height: 36rpx;
// }
height: 43.5rpx;
line-height: 43.5rpx;
letter-spacing: normal;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 26rpx;
color: #333333;
}
}
.header-right {
width: 246rpx;
height: 268.5rpx;
position: relative;
.header-right-icon {
position: absolute;
top: -150rpx;
left: -105rpx;
width: 546rpx;
height: 568.5rpx;
}
}
}
.search-box {
margin: -100rpx 22.5rpx 36rpx;
padding-left: 34.5rpx;
height: 84rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 237rpx;
position: relative;
.icon {
width: 39rpx;
height: 39rpx;
}
.input {
font-size: 24rpx;
padding: 0 21rpx;
}
.btn {
.vs {
width: 40.5rpx;
height: 30rpx;
margin-right: 9rpx;
}
padding: 0 25.5rpx;
font-size: 24rpx;
color: #333333;
border-left: 1rpx solid #d7d7d7;
}
}
.select {
margin: 0 22.5rpx 30rpx;
.classify {
height: 109.5rpx;
background-color: rgba(237, 240, 244, 1);
border-radius: 15rpx 15rpx 0 0;
-moz-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0549019607843137);
-webkit-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0549019607843137);
box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0549019607843137);
padding-top: 21rpx;
font-size: 30rpx;
color: #555555;
.classify-item {
justify-content: center;
position: relative;
.pitch {
position: absolute;
top: -28rpx;
width: 352.5rpx;
height: 90rpx;
height: 92rpx;
font-weight: 650;
font-size: 30rpx;
color: #000000;
right: 2rpx;
&.right {
.text {
margin-left: 115.5rpx;
}
}
.icon {
position: absolute;
left: -4.5rpx;
top: -4.5rpx;
width: 363rpx;
// height: 100.5rpx;
height: 106.5rpx;
}
&::after {
content: "";
display: block;
width: 100%;
height: 10.5rpx;
background-color: #ffffff;
position: absolute;
top: 100%;
}
.text {
position: relative;
display: inline-block;
z-index: 1;
margin-top: 27rpx;
margin-left: 73.5rpx;
&::after {
content: "";
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 15rpx;
background-color: rgba(207, 247, 255, 1);
border-radius: 58.5rpx;
z-index: -1;
}
}
}
}
}
.list {
background-color: rgba(255, 255, 255, 1);
border-radius: 15rpx;
-moz-box-shadow: 0px 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
-webkit-box-shadow: 0px 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
padding: 45rpx 30rpx;
margin-top: -25.5rpx;
.item {
height: 60rpx;
background-color: rgba(251, 251, 251, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
border-radius: 18rpx;
}
&.school-list {
display: grid;
grid-template-columns: repeat(5, 1fr);
column-gap: 15rpx;
row-gap: 24rpx;
.item {
width: 117rpx;
}
}
&.subject-list {
display: flex;
flex-wrap: wrap;
.item {
padding: 0 23.25rpx;
margin-right: 15rpx;
margin-bottom: 24rpx;
}
}
}
}
.fate {
margin: 0 22.5rpx 30rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
box-shadow: 0 -7.5rpx rgba(249, 93, 93, 1);
.head {
height: 84rpx;
justify-content: space-between;
padding-left: 30rpx;
border-bottom: 1rpx solid #ebebeb;
.text {
font-weight: 650;
font-size: 30rpx;
color: #000000;
}
.refresh {
padding: 0 30rpx;
height: 100%;
.icon {
width: 30rpx;
height: 30rpx;
}
}
}
.box {
.item {
padding-top: 31.5rpx;
padding-bottom: 31.5rpx;
margin-left: 60rpx;
margin-right: 30rpx;
&:not(:last-of-type) {
border-bottom: 1rpx dotted #ebebeb;
}
.left {
flex-direction: column;
position: relative;
&::after {
content: "";
position: absolute;
top: 10rpx;
left: -30rpx;
box-sizing: border-box;
width: 12rpx;
height: 12rpx;
background-color: rgba(246, 246, 189, 1);
border: 1rpx solid rgba(204, 208, 3, 1);
border-radius: 58.5rpx;
}
.title {
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
max-width: 450rpx;
}
.introduce {
color: #7F7F7F;
font-size: 21rpx;
.project {
max-width: 295.5rpx;
}
.line {
color: #D7D7D7;
margin: 0 20rpx;
}
}
}
}
}
}
.admission {
margin: 0 22.5rpx 30rpx;
padding-bottom: 7.5rpx;
// height: 873rpx;
background: -webkit-linear-gradient(104.032264875252deg, rgba(207, 247, 255, 1) -39%, rgba(239, 240, 209, 1) 59%, rgba(207, 247, 255, 1) 178%);
background: -moz-linear-gradient(-14.0322648752516deg, rgba(207, 247, 255, 1) -39%, rgba(239, 240, 209, 1) 59%, rgba(207, 247, 255, 1) 178%);
background: linear-gradient(-14.0322648752516deg, rgba(207, 247, 255, 1) -39%, rgba(239, 240, 209, 1) 59%, rgba(207, 247, 255, 1) 178%);
border-radius: 24rpx;
.head {
padding-left: 30rpx;
justify-content: space-between;
height: 82.5rpx;
.img {
width: 166.5rpx;
height: 43.5rpx;
}
.arrows {
padding: 30rpx;
.icon {
width: 27rpx;
height: 27rpx;
}
}
}
.box {
margin: 0 7.5rpx;
background-color: #ffffff;
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
height: 783rpx;
.swiper {
height: 738rpx;
.swiper-item {
.item:last-of-type {
.more-select {
top: auto;
bottom: 55rpx;
}
}
}
.item {
padding-top: 31.5rpx;
padding-left: 22.5rpx;
padding-right: 25.5rpx;
&:not(:last-of-type) {
.content {
border-bottom: 1rpx dotted #ebebeb;
}
}
.img {
width: 48rpx;
height: 48rpx;
margin-right: 15rpx;
}
.content {
padding-bottom: 31.5rpx;
justify-content: space-between;
.info {
flex-direction: column;
.name {
font-weight: 650;
font-size: 24rpx;
color: #000000;
margin-bottom: 12rpx;
max-width: 435rpx;
}
.subject {
color: #333333;
font-size: 30rpx;
margin-bottom: 6rpx;
max-width: 435rpx;
}
.project {
color: #7F7F7F;
font-size: 21rpx;
max-width: 435rpx;
}
}
}
}
}
.indication {
display: flex;
justify-content: center;
.item {
width: 15rpx;
height: 6rpx;
background-color: rgba(215, 215, 215, 1);
border-radius: 30rpx;
margin-right: 6rpx;
&.pitch {
background-color: rgba(250, 107, 17, 1);
}
}
}
}
}
.join {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #026277;
.add {
width: 36rpx;
height: 36rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 30rpx;
margin-bottom: 6rpx;
.icon {
width: 15rpx;
height: 15rpx;
}
}
}
.cancel {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #7F7F7F;
text-align: center;
.cross {
width: 36rpx;
height: 36rpx;
background-color: rgba(246, 246, 246, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
border-radius: 30rpx;
margin-bottom: 6rpx;
.icon {
width: 19.5rpx;
height: 15rpx;
}
}
}
.waterfall {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin: 0 22.5rpx 80rpx;
.waterfall-left {
.more {
margin: 0 auto 30rpx;
.more-select {
left: 0;
}
}
}
.item {
width: 345rpx;
// height: 438rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
border-radius: 18rpx;
padding: 22.5rpx 22.5rpx 0;
margin-bottom: 15rpx;
position: relative;
.school {
.icon {
width: 30rpx;
height: 30rpx;
margin-right: 12rpx;
}
font-size: 24rpx;
color: #333333;
margin-bottom: 19.5rpx;
}
.name {
font-weight: 650;
font-size: 30rpx;
color: #000000;
margin-bottom: 15rpx;
}
.english {
font-size: 21rpx;
color: #555555;
margin-bottom: 15rpx;
}
.text {
font-size: 22.5rpx;
color: #858585;
margin-bottom: 30rpx;
}
.tag {
flex-wrap: wrap;
// margin-top: 25rpx;
margin-bottom: 15rpx;
.tag-item {
height: 36rpx;
line-height: 36rpx;
font-size: 22.5rpx;
color: #858585;
padding: 0 10.5rpx;
border: 1rpx solid #aaaaaa;
border-radius: 9rpx;
width: fit-content;
margin-right: 15rpx;
margin-bottom: 10rpx;
word-break: break-all;
&.gray {
border: none;
color: #fff;
background-color: rgba(51, 51, 51, 1);
&.semester {
background-color: #f95d5d;
}
}
}
}
.view {
height: 42rpx;
margin-bottom: 30rpx;
position: relative;
z-index: 1;
.add {
width: 42rpx;
height: 42rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 30rpx;
.icon {
width: 18rpx;
height: 18rpx;
}
}
&.cancel {
flex-direction: row;
.cross {
margin-bottom: 0;
margin-right: 13.5rpx;
}
}
}
.more {
margin: 0 auto 30rpx;
}
.type {
position: relative;
height: 60rpx;
justify-content: center;
.type-icon {
position: absolute;
left: -22.5rpx;
bottom: 0;
width: 345rpx;
height: 120rpx;
}
.type-name {
position: absolute;
bottom: 15rpx;
width: 118.5rpx;
height: 31.5rpx;
}
}
.cancel {
.cross {
width: 30rpx;
height: 30rpx;
.icon {
width: 15rpx;
height: 12rpx;
}
}
}
}
}
.end {
font-size: 19.5rpx;
color: #D7D7D7;
text-align: center;
display: flex;
justify-content: center;
width: 100%;
margin-bottom: 50rpx;
}
.img {
width: 345rpx;
border-radius: 18rpx;
margin-bottom: 15rpx;
display: block;
}
.more {
width: 42rpx;
height: 42rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 30rpx;
position: relative;
.icon {
width: 27rpx;
height: 12rpx;
}
.more-select-mask {
position: fixed;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
z-index: 1;
// background-color: #000000;
}
.more-select {
position: absolute;
top: 55rpx;
right: 0;
width: 450rpx;
height: 183rpx;
background-color: rgba(255, 255, 255, 1);
border-radius: 12rpx;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.180392156862745);
flex-direction: column;
padding: 27rpx 30rpx 0;
z-index: 1;
.more-select-title {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 34.5rpx;
.dot {
width: 12rpx;
height: 12rpx;
border: 1rpx solid rgb(204, 208, 3);
border-radius: 50%;
background-color: rgb(246, 246, 189);
margin-right: 12rpx;
}
}
.more-select-btn {
width: 240rpx;
height: 60rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 237rpx;
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
font-size: 24rpx;
color: #026277;
margin: 0 auto;
.more-select-icon {
width: 24rpx;
height: 24rpx;
margin-right: 9rpx;
}
}
}
}
.index-sidebar {
position: relative;
z-index: 100;
}

View File

@ -0,0 +1,211 @@
<!--pages/projectLibrary/projectLibrary.wxml-->
<view class="container">
<header-nav class="header-nav" bgcolor="{{ isFirstPattern ? 'transparent' : '#f5f5f5' }}" user="{{ user }}" isIndexPage="{{ true }}">{{ isFirstPattern ? '' : '港校项目库' }}</header-nav>
<view class="header-box" style="padding-top: {{ totalTopHeight }}px;">
<view class="header-left">
<view class="header-title">
<image class="header-title-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/xg-icon.png"></image>
</view>
<view class="header-brief flexacenter">
700+项目轻松查 快速比
<!-- 港校项目<image class="brief-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/vs-header-icon.png"></image>港校项目 -->
</view>
</view>
<view class="header-right">
<image class="header-right-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/xg-project-list-icon.svg"></image>
</view>
</view>
<view class="search-box flexacenter">
<image class="icon" mode="widthFix" bind:tap="goPage" data-url="/pages/search/search?type=xg" src="https://app.gter.net/image/miniApp/offer/search-fine.png"></image>
<input class="input flex1" bind:tap="goPage" data-url="/pages/search/search?type=xg" disabled placeholder="搜索项目" />
<view class="btn flexacenter" bind:tap="goPage" data-url="/pages/projectMy/projectMy">
<image class="vs" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/vs-icon.png"></image>
项目对比
</view>
</view>
<view class="select">
<view class="classify flexflex">
<view class="classify-item flexflex flex1" bind:tap="cutClassify" data-type="school">
<view class="pitch" wx:if="{{ classify == 'school' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/classify-left-icon.svg"></image>
<view class="text">按学校查看</view>
</view>
<block wx:else>按学校查看</block>
</view>
<view class="classify-item flexflex flex1" bind:tap="cutClassify" data-type="subject">
<view class="pitch right" wx:if="{{ classify == 'subject' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/classify-right-icon.svg"></image>
<view class="text">按学科查看</view>
</view>
<block wx:else>按学科查看</block>
</view>
</view>
<view class="school-list list" wx:if="{{ classify == 'school' }}">
<view class="item flexcenter" wx:for="{{ university }}" wx:key="index" bind:tap="goClassifyValue" data-value="{{ item.value }}">{{ item.label }}</view>
</view>
<view class="subject-list list" wx:else>
<view class="item flexcenter" wx:for="{{ discipline }}" wx:key="index" bind:tap="goClassifyValue" data-value="{{ item.value }}" data-label="{{ item.label }}">{{ item.label }}</view>
</view>
</view>
<view wx:if="{{ fateProject.length != 0 }}" class="fate">
<view class="head flexacenter">
<view class="text">今日缘分项目</view>
<view class="refresh flexcenter" bind:tap="getFate">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/refresh-icon.png"></image>
</view>
</view>
<view class="box">
<view class="item flexacenter" wx:for="{{ fateProject }}" wx:key="index" bind:tap="goDetails" data-uniqid="{{ item.uniqid }}">
<view class="left flexflex flex1">
<view class="title one-line-display">{{ item.name_zh}}</view>
<view class="introduce flexacenter">
<view class="project one-line-display">{{ item.name_en }}</view>
<view class="line"> | </view>
{{ item.schoolname }}
</view>
</view>
<view wx:if="{{ item.state }}" class="cancel flexflex" catch:tap="return" style="width: 106.5rpx;">
<view class="cross flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg"></image>
</view>
已加入
</view>
<view wx:else class="join flexflex" catch:tap="handleClick" data-random="{{ item.random }}" data-index="{{ index }}" data-id="{{ item.id }}" data-type="fate" style="width: 106.5rpx;">
<view class="add flexcenter" id="add{{ item.random }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/plus-icon.svg"></image>
</view>
加入对比单
</view>
</view>
</view>
</view>
<!-- 招生官项目 轮播图 -->
<view wx:if="{{ admissionList.length != 0 }}" class="admission">
<view class="head flexacenter">
<image class="img" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/admission-text-icon.png"></image>
<view class="arrows flexcenter" bind:tap="goAdmission">
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/arrow-circle-gray.png"></image>
</view>
</view>
<view class="box">
<swiper class="swiper" current="{{ current }}" bindchange="swiperchange">
<swiper-item class="swiper-item" wx:for="{{ admissionList }}" wx:key="index">
<view class="item flexflex" wx:for="{{ item }}" wx:for-index="i" wx:key="i" bind:tap="goDetails" data-uniqid="{{ item.uniqid }}">
<image class="img" src="{{ item.schoollogo }}"></image>
<view class="content flexflex flex1">
<view class="info flexflex">
<view class="name one-line-display">{{ item.schoolname }}</view>
<view class="subject one-line-display">{{ item.name_zh }}</view>
<view class="project one-line-display">{{ item.name_en }}</view>
</view>
<view class="flexcenter" style="width: 106.5rpx;">
<view wx:if="{{ item.contraststatus.status == 1 && item.contraststatus.ismanage == 1 }}" class="cancel flexflex">
<view class="cross flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg"></image>
</view>
已加入
</view>
<view wx:elif="{{ item.contraststatus.status == 0 || item.contraststatus.ismanage == 0 }}" class="more flexcenter" catch:tap="openMoreSelect" data-index="{{ index }}" data-i="{{ i }}" data-type="admission">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/dot-dot-dot-black.png"></image>
<view wx:if="{{ item.moreState }}" class="more-select-mask" catch:tap="closeMoreSelect" data-type="admission"></view>
<view wx:if="{{ item.moreState }}" class="more-select" catch:tap="return">
<view class="more-select-title flexacenter">
<view class="dot"></view>
<block wx:if="{{ item.contraststatus.status == 1 }}">该项目已加入对比单,未加入项目管理</block>
<block wx:else>该项目已加入项目管理,未加入对比单</block>
</view>
<view class="more-select-btn flexcenter" catch:tap="addProject" data-type="admission" data-index="{{ index }}" data-id="{{ item.id }}" data-i="{{ i }}">
<image class="more-select-icon" src="https://app.gter.net/image/miniApp/offer/add-deep-blue.svg"></image>加入{{ item.contraststatus.status == 1 ? '项目管理' : '对比单' }}
</view>
</view>
</view>
<view wx:else class="join flexflex" catch:tap="handleClick" data-type="admission" data-random="{{ item.random }}" data-id="{{ item.id }}" data-index="{{ index }}" data-i="{{ i }}">
<view class="add flexcenter" id="add{{ item.random }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/plus-icon.svg"></image>
</view>
加入对比单
</view>
</view>
</view>
</view>
</swiper-item>
</swiper>
<view class="indication flexacenter">
<view class="item {{ current == index ? 'pitch' : '' }}" wx:for="{{ admissionList }}" wx:key="index"></view>
</view>
</view>
</view>
<view class="waterfall">
<view class="waterfall-item waterfall-left">
<image class="img" mode="widthFix" show-menu-by-longpress="{{ true }}" src="https://app.gter.net/image/miniApp/offer/application-group.jpg" bind:tap="jumpGroup"></image>
<template wx:for="{{ listLeft }}" wx:key="index" is="waterfall-item" data="{{ item,index, type: 'left' }}"></template>
</view>
<view class="waterfall-item waterfall-right">
<template wx:for="{{ listRight }}" wx:key="index" is="waterfall-item" data="{{ item, index, type: 'right' }}"></template>
</view>
</view>
<view class="end" wx:if="{{ page == 0 }}">- End -</view>
<xg-bottom type="index" bezier="{{ bezier }}" amount="{{ contrastcount }}" bindopenLoginBtnState="openLoginBtnState" islogin="{{ islogin }}"></xg-bottom>
<go-login wx:if="{{ isloginBtnState }}" islogin="{{ islogin }}" binduserClickLogin="userClickLogin" bindpopClose="popClose"></go-login>
</view>
<template name="waterfall-item">
<view class="item" bind:tap="goDetails" data-uniqid="{{ item.uniqid }}" style="z-index: {{ item.moreState ? 2 : 1 }};">
<view class="school flexacenter">
<image class="icon" mode="widthFix" src="{{ item.schoollogo }}"></image>
<view class="flex1">{{ item.schoolname }}</view>
</view>
<view class="name">{{ item.name_zh }}</view>
<view class="english" wx:if="{{ item.name_en }}">{{ item.name_en }}</view>
<view class="text" wx:if="{{ item.distinctive }}">{{ item.distinctive }}</view>
<view class="tag flexflex">
<view class="tag-item gray {{ item.semesterState ? 'semester' : '' }}">{{ item.semester.text }}</view>
<view class="tag-item" wx:for="{{ item.tags }}" wx:key="index">{{ item }}</view>
</view>
<view>
<view wx:if="{{ item.contraststatus.status == 1 && item.contraststatus.ismanage == 1 }}" class="cancel view flexflex">
<view class="cross flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg"></image>
</view>
已加入
</view>
<view wx:elif="{{ item.contraststatus.status == 0 || item.contraststatus.ismanage == 0 }}" class="more view flexcenter" catch:tap="openMoreSelect" data-index="{{ index }}" data-type="{{ type }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/dot-dot-dot-black.png"></image>
<view wx:if="{{ item.moreState }}" class="more-select-mask" catch:tap="closeMoreSelect" data-type="{{ type }}"></view>
<view wx:if="{{ item.moreState }}" class="more-select" catch:tap="return">
<view class="more-select-title flexacenter">
<view class="dot"></view>
<block wx:if="{{ item.contraststatus.status == 1 }}">该项目已加入对比单,未加入项目管理</block>
<block wx:else>该项目已加入项目管理,未加入对比单</block>
</view>
<view class="more-select-btn flexcenter" catch:tap="addProject" data-type="{{ type }}" data-index="{{ index }}" data-id="{{ item.id }}">
<image class="more-select-icon" src="https://app.gter.net/image/miniApp/offer/add-deep-blue.svg"></image>加入{{ item.contraststatus.status == 1 ? '项目管理' : '对比单' }}
</view>
</view>
</view>
<view wx:else class="view flexcenter" catch:tap="handleClick" data-type="{{ type }}" data-random="{{ item.random }}" data-id="{{ item.id }}" data-index="{{ index }}" data-status="{{ item.contraststatus.status }}">
<view class="add flexcenter" id="add{{ item.random }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/plus-icon.svg"></image>
</view>
</view>
</view>
<view class="type flexflex" wx:if="{{ item.admissionsproject }}">
<image class="type-icon" src="https://app.gter.net/image/miniApp/offer/admission-border.svg" mode="widthFix"></image>
<image class="type-name" src="https://app.gter.net/image/miniApp/offer/admission-text-icon.png" mode="widthFix"></image>
</view>
</view>
</template>
<index-sidebar id="index-sidebar" class="index-sidebar" sidebarType="xg" isInitFinish="{{ isInitFinish }}" bind:openLogin="openLoginBtnState" islogin="{{ islogin }}"></index-sidebar>

View File

@ -0,0 +1,596 @@
/* pages/projectLibrary/projectLibrary.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.container {
min-height: 100vh;
background-color: #f5f5f5;
}
.header-nav {
position: absolute;
top: 0;
}
.header-box {
width: 750rpx;
background: -webkit-linear-gradient(270deg, #f6f6bd 0%, #f5f5f5 100%);
background: -moz-linear-gradient(180deg, #f6f6bd 0%, #f5f5f5 100%);
background: linear-gradient(180deg, #f6f6bd 0%, #f5f5f5 100%);
padding-top: 127.5rpx;
margin-bottom: 45rpx;
display: flex;
align-items: center;
overflow: hidden;
padding-bottom: 100rpx;
}
.header-box .header-left {
display: inline-block;
padding-left: 90rpx;
margin-right: 63rpx;
}
.header-box .header-left .header-title {
border-bottom: 1rpx solid #797979;
padding: 14rpx 0;
display: flex;
justify-content: center;
}
.header-box .header-left .header-title .header-title-icon {
width: 276rpx;
height: 72rpx;
}
.header-box .header-left .header-title text {
font-family: 'ArialRoundedMTBold', 'Arial Rounded MT Bold', 'Arial', sans-serif;
}
.header-box .header-left .header-brief {
border-bottom: 1rpx solid #797979;
height: 43.5rpx;
line-height: 43.5rpx;
letter-spacing: normal;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 26rpx;
color: #333333;
}
.header-box .header-right {
width: 246rpx;
height: 268.5rpx;
position: relative;
}
.header-box .header-right .header-right-icon {
position: absolute;
top: -150rpx;
left: -105rpx;
width: 546rpx;
height: 568.5rpx;
}
.search-box {
margin: -100rpx 22.5rpx 36rpx;
padding-left: 34.5rpx;
height: 84rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 237rpx;
position: relative;
}
.search-box .icon {
width: 39rpx;
height: 39rpx;
}
.search-box .input {
font-size: 24rpx;
padding: 0 21rpx;
}
.search-box .btn {
padding: 0 25.5rpx;
font-size: 24rpx;
color: #333333;
border-left: 1rpx solid #d7d7d7;
}
.search-box .btn .vs {
width: 40.5rpx;
height: 30rpx;
margin-right: 9rpx;
}
.select {
margin: 0 22.5rpx 30rpx;
}
.select .classify {
height: 109.5rpx;
background-color: #edf0f4;
border-radius: 15rpx 15rpx 0 0;
-moz-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.05490196);
-webkit-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.05490196);
box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.05490196);
padding-top: 21rpx;
font-size: 30rpx;
color: #555555;
}
.select .classify .classify-item {
justify-content: center;
position: relative;
}
.select .classify .classify-item .pitch {
position: absolute;
top: -28rpx;
width: 352.5rpx;
height: 90rpx;
height: 92rpx;
font-weight: 650;
font-size: 30rpx;
color: #000000;
right: 2rpx;
}
.select .classify .classify-item .pitch.right .text {
margin-left: 115.5rpx;
}
.select .classify .classify-item .pitch .icon {
position: absolute;
left: -4.5rpx;
top: -4.5rpx;
width: 363rpx;
height: 106.5rpx;
}
.select .classify .classify-item .pitch::after {
content: "";
display: block;
width: 100%;
height: 10.5rpx;
background-color: #ffffff;
position: absolute;
top: 100%;
}
.select .classify .classify-item .pitch .text {
position: relative;
display: inline-block;
z-index: 1;
margin-top: 27rpx;
margin-left: 73.5rpx;
}
.select .classify .classify-item .pitch .text::after {
content: "";
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 15rpx;
background-color: #cff7ff;
border-radius: 58.5rpx;
z-index: -1;
}
.select .list {
background-color: #ffffff;
border-radius: 15rpx;
-moz-box-shadow: 0px 0 4.5rpx rgba(0, 0, 0, 0.07058824);
-webkit-box-shadow: 0px 0 4.5rpx rgba(0, 0, 0, 0.07058824);
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.07058824);
padding: 45rpx 30rpx;
margin-top: -25.5rpx;
}
.select .list .item {
height: 60rpx;
background-color: #fbfbfb;
border: 1rpx solid #ebebeb;
border-radius: 18rpx;
}
.select .list.school-list {
display: grid;
grid-template-columns: repeat(5, 1fr);
column-gap: 15rpx;
row-gap: 24rpx;
}
.select .list.school-list .item {
width: 117rpx;
}
.select .list.subject-list {
display: flex;
flex-wrap: wrap;
}
.select .list.subject-list .item {
padding: 0 23.25rpx;
margin-right: 15rpx;
margin-bottom: 24rpx;
}
.fate {
margin: 0 22.5rpx 30rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
box-shadow: 0 -7.5rpx #f95d5d;
}
.fate .head {
height: 84rpx;
justify-content: space-between;
padding-left: 30rpx;
border-bottom: 1rpx solid #ebebeb;
}
.fate .head .text {
font-weight: 650;
font-size: 30rpx;
color: #000000;
}
.fate .head .refresh {
padding: 0 30rpx;
height: 100%;
}
.fate .head .refresh .icon {
width: 30rpx;
height: 30rpx;
}
.fate .box .item {
padding-top: 31.5rpx;
padding-bottom: 31.5rpx;
margin-left: 60rpx;
margin-right: 30rpx;
}
.fate .box .item:not(:last-of-type) {
border-bottom: 1rpx dotted #ebebeb;
}
.fate .box .item .left {
flex-direction: column;
position: relative;
}
.fate .box .item .left::after {
content: "";
position: absolute;
top: 10rpx;
left: -30rpx;
box-sizing: border-box;
width: 12rpx;
height: 12rpx;
background-color: #f6f6bd;
border: 1rpx solid #ccd003;
border-radius: 58.5rpx;
}
.fate .box .item .left .title {
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
max-width: 450rpx;
}
.fate .box .item .left .introduce {
color: #7F7F7F;
font-size: 21rpx;
}
.fate .box .item .left .introduce .project {
max-width: 295.5rpx;
}
.fate .box .item .left .introduce .line {
color: #D7D7D7;
margin: 0 20rpx;
}
.admission {
margin: 0 22.5rpx 30rpx;
padding-bottom: 7.5rpx;
background: -webkit-linear-gradient(104.03226488deg, #cff7ff -39%, #eff0d1 59%, #cff7ff 178%);
background: -moz-linear-gradient(-14.03226488deg, #cff7ff -39%, #eff0d1 59%, #cff7ff 178%);
background: linear-gradient(-14.03226488deg, #cff7ff -39%, #eff0d1 59%, #cff7ff 178%);
border-radius: 24rpx;
}
.admission .head {
padding-left: 30rpx;
justify-content: space-between;
height: 82.5rpx;
}
.admission .head .img {
width: 166.5rpx;
height: 43.5rpx;
}
.admission .head .arrows {
padding: 30rpx;
}
.admission .head .arrows .icon {
width: 27rpx;
height: 27rpx;
}
.admission .box {
margin: 0 7.5rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
height: 783rpx;
}
.admission .box .swiper {
height: 738rpx;
}
.admission .box .swiper .swiper-item .item:last-of-type .more-select {
top: auto;
bottom: 55rpx;
}
.admission .box .swiper .item {
padding-top: 31.5rpx;
padding-left: 22.5rpx;
padding-right: 25.5rpx;
}
.admission .box .swiper .item:not(:last-of-type) .content {
border-bottom: 1rpx dotted #ebebeb;
}
.admission .box .swiper .item .img {
width: 48rpx;
height: 48rpx;
margin-right: 15rpx;
}
.admission .box .swiper .item .content {
padding-bottom: 31.5rpx;
justify-content: space-between;
}
.admission .box .swiper .item .content .info {
flex-direction: column;
}
.admission .box .swiper .item .content .info .name {
font-weight: 650;
font-size: 24rpx;
color: #000000;
margin-bottom: 12rpx;
max-width: 435rpx;
}
.admission .box .swiper .item .content .info .subject {
color: #333333;
font-size: 30rpx;
margin-bottom: 6rpx;
max-width: 435rpx;
}
.admission .box .swiper .item .content .info .project {
color: #7F7F7F;
font-size: 21rpx;
max-width: 435rpx;
}
.admission .box .indication {
display: flex;
justify-content: center;
}
.admission .box .indication .item {
width: 15rpx;
height: 6rpx;
background-color: #d7d7d7;
border-radius: 30rpx;
margin-right: 6rpx;
}
.admission .box .indication .item.pitch {
background-color: #fa6b11;
}
.join {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #026277;
}
.join .add {
width: 36rpx;
height: 36rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 30rpx;
margin-bottom: 6rpx;
}
.join .add .icon {
width: 15rpx;
height: 15rpx;
}
.cancel {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #7F7F7F;
text-align: center;
}
.cancel .cross {
width: 36rpx;
height: 36rpx;
background-color: #f6f6f6;
border: 1rpx solid #ebebeb;
border-radius: 30rpx;
margin-bottom: 6rpx;
}
.cancel .cross .icon {
width: 19.5rpx;
height: 15rpx;
}
.waterfall {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin: 0 22.5rpx 80rpx;
}
.waterfall .waterfall-left .more {
margin: 0 auto 30rpx;
}
.waterfall .waterfall-left .more .more-select {
left: 0;
}
.waterfall .item {
width: 345rpx;
background-color: #ffffff;
border: 1rpx solid #ebebeb;
border-radius: 18rpx;
padding: 22.5rpx 22.5rpx 0;
margin-bottom: 15rpx;
position: relative;
}
.waterfall .item .school {
font-size: 24rpx;
color: #333333;
margin-bottom: 19.5rpx;
}
.waterfall .item .school .icon {
width: 30rpx;
height: 30rpx;
margin-right: 12rpx;
}
.waterfall .item .name {
font-weight: 650;
font-size: 30rpx;
color: #000000;
margin-bottom: 15rpx;
}
.waterfall .item .english {
font-size: 21rpx;
color: #555555;
margin-bottom: 15rpx;
}
.waterfall .item .text {
font-size: 22.5rpx;
color: #858585;
margin-bottom: 30rpx;
}
.waterfall .item .tag {
flex-wrap: wrap;
margin-bottom: 15rpx;
}
.waterfall .item .tag .tag-item {
height: 36rpx;
line-height: 36rpx;
font-size: 22.5rpx;
color: #858585;
padding: 0 10.5rpx;
border: 1rpx solid #aaaaaa;
border-radius: 9rpx;
width: fit-content;
margin-right: 15rpx;
margin-bottom: 10rpx;
word-break: break-all;
}
.waterfall .item .tag .tag-item.gray {
border: none;
color: #fff;
background-color: #333333;
}
.waterfall .item .tag .tag-item.gray.semester {
background-color: #f95d5d;
}
.waterfall .item .view {
height: 42rpx;
margin-bottom: 30rpx;
position: relative;
z-index: 1;
}
.waterfall .item .view .add {
width: 42rpx;
height: 42rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 30rpx;
}
.waterfall .item .view .add .icon {
width: 18rpx;
height: 18rpx;
}
.waterfall .item .view.cancel {
flex-direction: row;
}
.waterfall .item .view.cancel .cross {
margin-bottom: 0;
margin-right: 13.5rpx;
}
.waterfall .item .more {
margin: 0 auto 30rpx;
}
.waterfall .item .type {
position: relative;
height: 60rpx;
justify-content: center;
}
.waterfall .item .type .type-icon {
position: absolute;
left: -22.5rpx;
bottom: 0;
width: 345rpx;
height: 120rpx;
}
.waterfall .item .type .type-name {
position: absolute;
bottom: 15rpx;
width: 118.5rpx;
height: 31.5rpx;
}
.waterfall .item .cancel .cross {
width: 30rpx;
height: 30rpx;
}
.waterfall .item .cancel .cross .icon {
width: 15rpx;
height: 12rpx;
}
.end {
font-size: 19.5rpx;
color: #D7D7D7;
text-align: center;
display: flex;
justify-content: center;
width: 100%;
margin-bottom: 50rpx;
}
.img {
width: 345rpx;
border-radius: 18rpx;
margin-bottom: 15rpx;
display: block;
}
.more {
width: 42rpx;
height: 42rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 30rpx;
position: relative;
}
.more .icon {
width: 27rpx;
height: 12rpx;
}
.more .more-select-mask {
position: fixed;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
z-index: 1;
}
.more .more-select {
position: absolute;
top: 55rpx;
right: 0;
width: 450rpx;
height: 183rpx;
background-color: #ffffff;
border-radius: 12rpx;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.18039216);
flex-direction: column;
padding: 27rpx 30rpx 0;
z-index: 1;
}
.more .more-select .more-select-title {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 34.5rpx;
}
.more .more-select .more-select-title .dot {
width: 12rpx;
height: 12rpx;
border: 1rpx solid #ccd003;
border-radius: 50%;
background-color: #f6f6bd;
margin-right: 12rpx;
}
.more .more-select .more-select-btn {
width: 240rpx;
height: 60rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 237rpx;
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.07058824);
font-size: 24rpx;
color: #026277;
margin: 0 auto;
}
.more .more-select .more-select-btn .more-select-icon {
width: 24rpx;
height: 24rpx;
margin-right: 9rpx;
}
.index-sidebar {
position: relative;
z-index: 100;
}

View File

@ -0,0 +1,637 @@
// 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, // 选择框的状态
territoryState: false, // 专业弹窗
comprehensive: {
organizationKey: "",
organization: [],
yearKey: "",
year: [],
obj: {},
list: [],
total: 0,
only: 0,
page: 1,
},
discipline: {
organizationKey: "",
organization: [],
yearKey: "",
year: [],
majorKey: "",
obj: {},
list: [],
total: 0,
only: 0,
page: 1,
},
university: [],
universityArr: [],
isInitFinish: false,
},
/**
* 生命周期函数--监听页面加载
*/
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({
university: data.university,
universityArr,
})
this.getRankings()
})
})
},
// 获取 综合排名 数据
getSynthesizeData() {
let comprehensive = this.data.comprehensive
wx.showLoading({
title: '加载中...',
})
util.wxget("/api/project.rankings/comprehensive", {
token: comprehensive['token'],
ishongkong: comprehensive['only'] || 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
});
comprehensive['total'] = data.count
comprehensive['allList'] = list
comprehensive['list'] = []
comprehensive['page'] = 1
comprehensive['organizeText'] = comprehensive['organizationKey']
comprehensive['yearText'] = comprehensive['yearKey']
this.setData({
comprehensive,
screenState: false,
})
this.renderComprehensiveList()
}).finally(() => wx.hideLoading())
},
// 渲染 综合排名 limit: 20
renderComprehensiveList() {
const limit = 20
let comprehensive = this.data.comprehensive
let page = comprehensive['page']
if (page == 0) return
const allList = comprehensive['allList']
const target = allList.slice((page - 1) * limit, page * limit)
comprehensive['list'] = comprehensive.list.concat(target)
comprehensive['page'] = target.length < limit ? 0 : page + 1
this.setData({
comprehensive
})
},
// 获取 专业排名 数据
getMajorData() {
wx.showLoading({
title: '加载中...',
})
let discipline = this.data.discipline
// console.log("discipline", discipline);
util.wxget("/api/project.rankings/discipline", {
token: discipline['token'],
ishongkong: discipline['only'] || 0,
}).then(res => {
if (res.code != 200) return
let data = res.data
discipline['total'] = data.count
discipline['allList'] = data.data
discipline['list'] = []
discipline['page'] = 1
discipline['organizeText'] = discipline['organizationKey']
discipline['yearText'] = discipline['yearKey']
discipline['majorText'] = discipline['majorKey']
this.setData({
discipline,
screenState: false,
})
this.renderDisciplineList()
}).finally(() => wx.hideLoading())
},
// 渲染 专业排名 limit: 20
renderDisciplineList() {
const limit = 20
let discipline = this.data.discipline
let page = discipline['page']
if (page == 0) return
const allList = discipline['allList']
const target = allList.slice((page - 1) * limit, page * limit)
discipline['list'] = discipline.list.concat(target)
discipline['page'] = target.length < limit ? 0 : page + 1
this.setData({
discipline,
})
},
// 获取 配置信息
getRankings() {
wx.showLoading({
title: '加载中...',
})
util.wxget("/api/project.rankings", {}).then(res => {
if (res.code != 200) return
const data = res.data
const comprehensive = data.comprehensive
let comprehensiveTarget = this.data.comprehensive
let organizationSet = [...this.objectOne(comprehensive)]
comprehensiveTarget['organization'] = organizationSet
comprehensiveTarget['organizationKey'] = organizationSet[0]
let yearsSet = [...this.collectYears(comprehensive)]
yearsSet.sort((a, b) => b - a);
// console.log("yearsSet", yearsSet);
// comprehensiveTarget['year'] = yearsSet
comprehensiveTarget['yearKey'] = yearsSet[0]
comprehensiveTarget['obj'] = comprehensive
this.checkComprehensiveYear()
const discipline = data.discipline
let disciplineTarget = this.data.discipline
const dOrganization = [...this.objectOne(discipline)]
const [dOrganizationKey, dOrganizationValue] = Object.entries(discipline)[0]
disciplineTarget['organization'] = dOrganization
disciplineTarget['organizationKey'] = dOrganizationKey
disciplineTarget['majorKey'] = Object.entries(dOrganizationValue)[0][0]
const dYear = [...this.collectYears(discipline)]
dYear.sort((a, b) => b - a);
// disciplineTarget['year'] = dYear
disciplineTarget['yearKey'] = dYear[0]
disciplineTarget['obj'] = discipline
this.checkDisciplineYear()
this.setData({
comprehensive: comprehensiveTarget,
discipline: disciplineTarget,
isInitFinish: true,
})
if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
this.haveComprehensive()
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
let discipline = this.data.discipline
// 切换 专业排名时 判断 是否需要 显示选择
if (classify == 'subject' && discipline.list.length == 0) {
this.haveDiscipline()
}
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') {
let comprehensive = this.data.comprehensive
comprehensive['only'] = comprehensive['only'] == 1 ? 0 : 1
comprehensive['list'] = []
this.setData({
comprehensive,
})
this.getSynthesizeData()
} else {
let discipline = this.data.discipline
discipline['only'] = discipline['only'] == 1 ? 0 : 1
discipline['list'] = []
this.setData({
discipline,
})
this.getMajorData()
}
},
// 选择机构 - 综合
selectOrganicComprehensive(e) {
let key = e.currentTarget.dataset.key
// const key = e.currentTarget.dataset.key
let comprehensive = this.data.comprehensive
comprehensive['organizationKey'] = key
this.setData({
comprehensive,
})
this.checkComprehensiveYear()
},
// 判断是否存在值 综合 检查 年份
checkComprehensiveYear() {
const comprehensive = this.data.comprehensive
const obj = comprehensive.obj
const target = obj[comprehensive.organizationKey]
let year = this.objectOne(target) || []
year.sort((a, b) => b - a);
if (!year.includes(comprehensive.yearKey)) comprehensive.yearKey = year[0]
// if (year.length == 1) comprehensive.yearKey = year[0]
comprehensive['year'] = year
this.setData({
comprehensive
})
},
// 选择年份 - 综合
selectYearComprehensive(e) {
const key = e.currentTarget.dataset.key
let comprehensive = this.data.comprehensive
comprehensive['yearKey'] = key
this.setData({
comprehensive,
})
},
// 选择机构 - 专业
selectOrganicMajor(e) {
const key = e.currentTarget.dataset.key
let discipline = this.data.discipline
discipline['organizationKey'] = key
discipline['majorKey'] = ""
this.setData({
discipline
})
// this.checkDisciplineYear()
this.selectFirstMajorInRanking()
},
// 选中专业排名后 默认选择 第一个专业
selectFirstMajorInRanking() {
let discipline = this.data.discipline
const organizationKey = discipline.organizationKey
const obj = discipline.obj
let majorsList = {}
majorsList = obj[organizationKey]
// console.log(Object.keys(majorsList)[0]);
const majorKey = Object.keys(majorsList)[0] || ''
// console.log("majorsList", majorsList[majorKey]);
const yearObj = majorsList[majorKey]
const yearList = Object.keys(yearObj)
yearList.sort((a, b) => b - a);
// console.log("yearList", yearList);
discipline['majorKey'] = majorKey
discipline['year'] = yearList
discipline['yearKey'] = yearList[0]
this.setData({
discipline,
})
},
// 判断是否存在值 专业 检查 年份
checkDisciplineYear() {
const discipline = this.data.discipline
const obj = discipline.obj
const target = obj[discipline.organizationKey]
let year = this.collectYears(target) || []
year.sort((a, b) => b - a);
if (!year.includes(discipline.yearKey)) discipline.yearKey = year[0]
discipline['year'] = year
// if (year.length == 1) discipline.yearKey = year[0]
this.setData({
discipline
})
},
// 选择年份 - 综合
selectYearDiscipline(e) {
const key = e.currentTarget.dataset.key
let discipline = this.data.discipline
discipline['yearKey'] = key
this.setData({
discipline,
})
},
// 打开专业弹窗
opneMajorPop() {
let discipline = this.data.discipline
const organizationKey = discipline.organizationKey
const yearKey = discipline.yearKey
// discipline['yearKey'] = ""
const obj = discipline.obj
if (!organizationKey) {
wx.showToast({
icon: "none",
title: '请先选择评榜机构',
})
return
}
let majorsList = {}
// 没有 选择年份的情况下
majorsList = obj[organizationKey]
this.setData({
majorsList,
territoryState: true,
screenState: false,
})
},
// 关闭 专业选择
closeselect(e) {
const yearList = e.detail?.yearList || []
yearList.sort((a, b) => b - a);
const key = e.detail?.key || ''
if (!key) {
this.setData({
territoryState: false,
screenState: true,
})
}
let discipline = this.data.discipline
discipline['majorKey'] = key
discipline['year'] = yearList
if (!yearList.includes(discipline.yearKey)) discipline.yearKey = ""
discipline.yearKey = yearList[0]
this.setData({
territoryState: false,
screenState: true,
discipline,
})
},
// 选好了 综合
haveComprehensive() {
let comprehensive = this.data.comprehensive
const organizationKey = comprehensive['organizationKey']
const yearKey = comprehensive['yearKey']
if (!organizationKey) this.selectionPrompt("请选择评榜机构")
if (!yearKey) this.selectionPrompt("请选择年份")
if (!organizationKey || !yearKey) return
const obj = comprehensive['obj']
const organizationValue = obj[organizationKey]
const token = organizationValue[yearKey]
comprehensive['token'] = token
this.setData({
comprehensive
})
this.getSynthesizeData()
},
// 选好了 专业
haveDiscipline() {
let discipline = this.data.discipline
const organizationKey = discipline['organizationKey']
const majorKey = discipline['majorKey']
const yearKey = discipline['yearKey']
if (!organizationKey) this.selectionPrompt("请选择评榜机构")
if (!majorKey) this.selectionPrompt("请选择专业")
if (!yearKey) this.selectionPrompt("请选择年份")
if (!organizationKey || !majorKey || !yearKey) return
const obj = discipline['obj']
const organizationValue = obj[organizationKey]
const majorValue = organizationValue[majorKey]
const token = majorValue[yearKey]
discipline['token'] = token
this.setData({
discipline
})
this.getMajorData()
},
//选择提示
selectionPrompt(title) {
wx.showToast({
icon: "none",
title,
})
},
// 跳转学校主页
goSchoolHomepage(e) {
const sid = e.currentTarget.dataset.sid
wx.navigateTo({
url: '/pages/projectSchoolHomepage/projectSchoolHomepage?id=' + sid,
})
},
// 点击
cutScreenState() {
this.setData({
screenState: !this.data.screenState,
})
},
goDetails(e) {
return
const id = e.currentTarget.dataset.id
common.goPage(`/pages/projectDetails/projectDetails?id=${id}`)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
if (this.data.classify == 'school') this.renderComprehensiveList()
if (this.data.classify == 'subject') this.renderDisciplineList()
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
},
onShareTimeline() {
util.statistics({
name: "share-timeline"
})
return {
title: "【寄托港校项目库】- 榜单",
}
},
})

View File

@ -0,0 +1,8 @@
{
"enablePullDownRefresh": false,
"usingComponents": {
"header-nav": "/component/headerNav/headerNav",
"territory-select": "/component/territorySelect/territorySelect",
"index-sidebar": "/component/indexSidebar/indexSidebar"
}
}

View File

@ -0,0 +1,383 @@
/* pages/projectList/projectList.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.header-box {
width: 100vw;
height: 219rpx;
background: -webkit-linear-gradient(270deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
background: -moz-linear-gradient(180deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
background: linear-gradient(180deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
position: relative;
}
.header-nav {
position: absolute;
top: 0;
}
.classify {
padding-top: 21rpx;
font-size: 30rpx;
color: #555555;
height: 109.5rpx;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
background-color: rgba(237, 240, 244, 1);
border-radius: 15rpx 15rpx 0 0;
-moz-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0470588235294118);
-webkit-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0470588235294118);
box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0470588235294118);
.classify-item {
justify-content: center;
position: relative;
.pitch {
position: absolute;
top: -28rpx;
left: 0;
width: 375rpx;
height: 90rpx;
font-weight: 650;
font-size: 30rpx;
color: #000000;
overflow: hidden;
&.right {
left: auto;
right: 0;
.text {
margin-left: 115.5rpx;
}
}
.icon {
position: absolute;
left: -4.5rpx;
top: -4.5rpx;
width: 385.5rpx;
height: 100.5rpx;
}
.text {
position: relative;
z-index: 1;
margin-top: 27rpx;
margin-left: 73.5rpx;
.text-icon-box {
width: 42rpx;
height: 42rpx;
border-radius: 50%;
background-color: #f95d5d;
margin-right: 15rpx;
.text-icon {
width: 30rpx;
height: 30rpx;
}
}
}
}
}
}
.chunk {
background-color: rgba(255, 255, 255, 1);
margin-top: -28rpx;
position: relative;
padding-top: 55.5rpx;
.pitch-on {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 33rpx;
color: #000000;
margin: 0 auto;
width: fit-content;
margin-bottom: 73.5rpx;
position: relative;
&.major-pitch {
font-weight: 650;
font-style: normal;
font-size: 27rpx;
color: #000000;
.major-pitch-text {
max-width: 80vw;
}
&::after {
content: "";
height: 7.5rpx;
top: 43.5rpx;
}
}
.pitch-icon {
width: 21rpx;
height: 12rpx;
margin-left: 18rpx;
}
&::after {
content: "";
width: 100%;
height: 12rpx;
position: absolute;
top: 48rpx;
background-color: rgba(207, 247, 255, 1);
border-radius: 58.5rpx;
}
}
.message {
justify-content: space-between;
font-size: 24rpx;
color: #7F7F7F;
margin: 0 22.5rpx 30rpx;
.total {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.only {
.icon {
width: 27rpx;
height: 27rpx;
margin-right: 13.5rpx;
}
}
}
.list {
.item {
margin: 0 22.5rpx 15rpx;
background-color: rgba(251, 251, 251, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
padding-top: 34.5rpx;
padding-left: 37.5rpx;
padding-right: 22.5rpx;
padding-bottom: 30rpx;
position: relative;
.angle {
position: absolute;
top: 0;
left: 0;
width: 75rpx;
height: 76.5rpx;
}
.ranking {
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-style: normal;
font-size: 24rpx;
color: #000000;
width: 76.5rpx;
}
.head {
align-items: flex-start;
.name {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 30rpx;
color: #000000;
}
.mark {
font-size: 27rpx;
color: #333333;
.text {
font-size: 21rpx;
color: #AAAAAA;
}
}
}
.english {
font-size: 21rpx;
line-height: 42rpx;
color: #333333;
margin-bottom: 3rpx;
}
.bottom {
justify-content: space-between;
.site {
font-size: 22.5rpx;
line-height: 42rpx;
color: #7F7F7F;
}
.btn {
width: 162rpx;
height: 54rpx;
line-height: 54rpx;
background-color: rgba(249, 93, 93, 1);
border-radius: 142.5rpx;
font-size: 24rpx;
color: #FFFFFF;
padding: 0 15rpx;
justify-content: space-between;
.icon {
width: 27rpx;
height: 27rpx;
}
}
}
}
}
.end {
padding-top: 60rpx;
text-align: center;
font-size: 19.5rpx;
color: #D7D7D7;
}
}
.screen-mask {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.705882352941177);
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: flex-end;
z-index: 100;
.screen-box {
width: 100vw;
background-color: #FFFFFF;
padding-top: 43.5rpx;
border-radius: 45rpx 45rpx 0 0;
.head {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 30rpx;
color: #000000;
margin-bottom: 45rpx;
text-align: center;
}
.box {
margin: 0 22.5rpx 30rpx;
background-color: rgba(251, 251, 251, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 15rpx;
padding: 16.5rpx 18rpx 30rpx 18rpx;
.title {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 45rpx;
}
.major-box {
height: 72rpx;
line-height: 72rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(204, 208, 3, 1);
border-radius: 112.5rpx;
padding-left: 30rpx;
padding-right: 22.5rpx;
.text {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 24rpx;
color: #9A9D02;
&.text-no {
color: #AAAAAA;
font-weight: 400;
}
}
.icon {
width: 10.5rpx;
height: 18rpx;
}
}
.list {
flex-wrap: wrap;
.item {
min-width: 150rpx;
height: 72rpx;
line-height: 72rpx;
background-color: rgba(246, 246, 246, 1);
border-radius: 112.5rpx;
font-size: 24rpx;
color: #555555;
margin-right: 15rpx;
padding: 0 15rpx;
margin-bottom: 10rpx;
&.pitch {
border: 1rpx solid rgba(204, 208, 3, 1);
font-weight: 650;
color: #9A9D02;
}
}
}
}
.footer {
margin-top: 45rpx;
height: 201rpx;
border-top: 1rpx solid #ebebeb;
justify-content: space-between;
font-size: 30rpx;
padding: 45rpx 30rpx 0 30rpx;
.cancel {
width: 225rpx;
height: 96rpx;
background-color: rgba(207, 247, 255, 0);
border: 1rpx solid rgba(215, 215, 215, 1);
border-radius: 112.5rpx;
color: #555555;
}
.confirm {
width: 435rpx;
height: 96rpx;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
color: #026277;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 112.5rpx;
}
}
}
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,144 @@
<!--pages/projectList/projectList.wxml-->
<view class="container">
<header-nav class="header-nav" bgcolor="{{ isFirstPattern ? 'transparent' : '#f5f5f5' }}">榜单</header-nav>
<view class="header-box"></view>
<view class="classify flexflex">
<view class="classify-item flexflex flex1" bind:tap="cutClassify" data-type="school">
<view class="pitch" wx:if="{{ classify == 'school' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/list-left-icon.svg"></image>
<view class="text flexacenter">
<view class="text-icon-box flexcenter">
<image class="text-icon" src="https://app.gter.net/image/miniApp/offer/list-synthesize-icon.png" mode="widthFix"></image>
</view>
综合排名
</view>
</view>
<block wx:else>综合排名</block>
</view>
<view class="classify-item flexflex flex1" bind:tap="cutClassify" data-type="subject">
<view class="pitch right" wx:if="{{ classify == 'subject' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/list-right-icon.svg"></image>
<view class="text flexacenter">
<view class="text-icon-box flexcenter">
<image class="text-icon" src="https://app.gter.net/image/miniApp/offer/list-major-icon.png" mode="widthFix"></image>
</view>
专业排名
</view>
</view>
<block wx:else>专业排名</block>
</view>
</view>
<view class="chunk">
<block wx:if="{{ classify == 'school' }}">
<view class="pitch-on flexacenter" bind:tap="cutScreenState">
{{ comprehensive.organizeText }}世界综合排名({{ comprehensive.yearText }}年)
<image class="pitch-icon" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
</view>
<view class="message flexacenter">
<view class="total">共 {{ comprehensive.total }} 个排名</view>
<view class="only flexacenter" bind:tap="cutOnlyXg">
<image wx:if="{{ comprehensive.only }}" class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/project/u376.svg"></image>
<image wx:else class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/frame-icon.svg"></image>
仅显示香港学校
</view>
</view>
</block>
<block wx:else>
<view class="pitch-on major-pitch flexacenter" bind:tap="cutScreenState">
<view class="major-pitch-text one-line-display">
<!-- {{ discipline.organizationKey }} > {{ discipline.majorKey }}({{ discipline.yearKey }}年) -->
{{ discipline.organizeText }} > {{ discipline.majorText }}({{ discipline.yearText }}年)
</view>
<image class="pitch-icon" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
</view>
<view class="message flexacenter">
<view class="total">共 {{ discipline.total }} 个排名</view>
<view class="only flexacenter" bind:tap="cutOnlyXg">
<image wx:if="{{ discipline.only }}" class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/project/u376.svg"></image>
<image wx:else class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/frame-icon.svg"></image>
仅显示香港学校
</view>
</view>
</block>
<view class="list">
<view class="item flexflex" wx:for="{{ classify == 'school' ? comprehensive.list : discipline.list }}" wx:key="index" bind:tap="{{ classify == 'subject' ? 'goDetails' : '' }}" data-id="{{ index }}">
<view class="ranking">{{ item.rank }}</view>
<view class="flex1">
<view class="head flexflex">
<view class="name flex1">{{ item.name || item.subject }}</view>
<view class="mark flexacenter" wx:if="{{ item.total_score }}">{{ item.total_score }} <text class="text">分</text></view>
</view>
<view class="english">
{{ item.enname }}
<block wx:if="{{ item.simple }}">({{item.simple}})</block>
</view>
<!-- <image wx:if="{{ item.sid }}" class="angle" src="https://app.gter.net/image/miniApp/offer/project-angle.svg" mode="widthFix"></image> -->
<view class="bottom flexflex">
<view class="site">{{ item.city }}</view>
<view wx:if="{{ item.sid }}" class="btn flexcenter" bind:tap="goSchoolHomepage" data-sid="{{ item.sid }}">
学校主页
<image class="icon" src="https://app.gter.net/image/miniApp/offer/arrows-round-light-white.svg" mode="widthFix"></image>
</view>
</view>
</view>
</view>
</view>
<view class="end" wx:if="{{ (classify == 'school' && comprehensive.page == 0) || (classify == 'subject' && discipline.page == 0) }}">- End -</view>
</view>
<view class="screen-mask" wx:if="{{ screenState }}" bind:tap="cutScreenState">
<view class="screen-box" catch:tap="return">
<view class="head">请选择</view>
<block wx:if="{{ classify == 'school' }}">
<view class="box">
<view class="title">评榜机构</view>
<view class="list flexflex">
<view class="item flexcenter {{ item == comprehensive.organizationKey ? 'pitch' : '' }}" bind:tap="selectOrganicComprehensive" data-key="{{ item }}" wx:for="{{ comprehensive.organization }}" wx:key="index">{{ item }}</view>
</view>
</view>
<view class="box">
<view class="title">年份</view>
<view class="list flexflex">
<view class="item flexcenter {{ item == comprehensive.yearKey ? 'pitch' : '' }}" wx:for="{{ comprehensive.year }}" wx:key="index" bind:tap="selectYearComprehensive" data-key="{{ item }}">{{ item }}</view>
</view>
</view>
</block>
<block wx:else>
<view class="box">
<view class="title">评榜机构</view>
<view class="list flexflex">
<view class="item flexcenter {{ item == discipline.organizationKey ? 'pitch' : '' }}" bind:tap="selectOrganicMajor" data-key="{{ item }}" wx:for="{{ discipline.organization }}" wx:key="index">{{ item }}</view>
</view>
</view>
<view class="box">
<view class="title">专业</view>
<view class="major-box flexacenter" bind:tap="opneMajorPop">
<view wx:if="{{ discipline.majorKey }}" class="flex1 text">{{ discipline.majorKey }}</view>
<view wx:else class="flex1 text text-no">请选择</view>
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/arrows-yellow-green.svg"></image>
</view>
</view>
<view class="box">
<view class="title">年份</view>
<view class="list flexflex">
<view class="item flexcenter {{ item == discipline.yearKey ? 'pitch' : '' }}" wx:for="{{ discipline.year }}" wx:key="index" bind:tap="selectYearDiscipline" data-key="{{ item }}">{{ item }}</view>
</view>
</view>
</block>
<view class="footer flexflex">
<view class="cancel flexcenter" bind:tap="cutScreenState">取消</view>
<view class="confirm flexcenter" bind:tap="{{ classify == 'school' ? 'haveComprehensive' : 'haveDiscipline' }}">选好了</view>
</view>
</view>
</view>
<territory-select wx:if="{{ territoryState }}" type="major" list="{{ majorsList }}" value="{{ discipline.majorKey }}" bindcloseselect="closeselect"></territory-select>
</view>
<index-sidebar id="index-sidebar" class="index-sidebar" sidebarType="xg" isInitFinish="{{ isInitFinish }}" bind:openLogin="openLoginBtnState" islogin="{{ islogin }}"></index-sidebar>

View File

@ -0,0 +1,323 @@
/* pages/projectList/projectList.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.header-box {
width: 100vw;
height: 219rpx;
background: -webkit-linear-gradient(270deg, #f6f6bd 0%, #f5f5f5 100%);
background: -moz-linear-gradient(180deg, #f6f6bd 0%, #f5f5f5 100%);
background: linear-gradient(180deg, #f6f6bd 0%, #f5f5f5 100%);
position: relative;
}
.header-nav {
position: absolute;
top: 0;
}
.classify {
padding-top: 21rpx;
font-size: 30rpx;
color: #555555;
height: 109.5rpx;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
background-color: #edf0f4;
border-radius: 15rpx 15rpx 0 0;
-moz-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.04705882);
-webkit-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.04705882);
box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.04705882);
}
.classify .classify-item {
justify-content: center;
position: relative;
}
.classify .classify-item .pitch {
position: absolute;
top: -28rpx;
left: 0;
width: 375rpx;
height: 90rpx;
font-weight: 650;
font-size: 30rpx;
color: #000000;
overflow: hidden;
}
.classify .classify-item .pitch.right {
left: auto;
right: 0;
}
.classify .classify-item .pitch.right .text {
margin-left: 115.5rpx;
}
.classify .classify-item .pitch .icon {
position: absolute;
left: -4.5rpx;
top: -4.5rpx;
width: 385.5rpx;
height: 100.5rpx;
}
.classify .classify-item .pitch .text {
position: relative;
z-index: 1;
margin-top: 27rpx;
margin-left: 73.5rpx;
}
.classify .classify-item .pitch .text .text-icon-box {
width: 42rpx;
height: 42rpx;
border-radius: 50%;
background-color: #f95d5d;
margin-right: 15rpx;
}
.classify .classify-item .pitch .text .text-icon-box .text-icon {
width: 30rpx;
height: 30rpx;
}
.chunk {
background-color: #ffffff;
margin-top: -28rpx;
position: relative;
padding-top: 55.5rpx;
}
.chunk .pitch-on {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 33rpx;
color: #000000;
margin: 0 auto;
width: fit-content;
margin-bottom: 73.5rpx;
position: relative;
}
.chunk .pitch-on.major-pitch {
font-weight: 650;
font-style: normal;
font-size: 27rpx;
color: #000000;
}
.chunk .pitch-on.major-pitch .major-pitch-text {
max-width: 80vw;
}
.chunk .pitch-on.major-pitch::after {
content: "";
height: 7.5rpx;
top: 43.5rpx;
}
.chunk .pitch-on .pitch-icon {
width: 21rpx;
height: 12rpx;
margin-left: 18rpx;
}
.chunk .pitch-on::after {
content: "";
width: 100%;
height: 12rpx;
position: absolute;
top: 48rpx;
background-color: #cff7ff;
border-radius: 58.5rpx;
}
.chunk .message {
justify-content: space-between;
font-size: 24rpx;
color: #7F7F7F;
margin: 0 22.5rpx 30rpx;
}
.chunk .message .total {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.chunk .message .only .icon {
width: 27rpx;
height: 27rpx;
margin-right: 13.5rpx;
}
.chunk .list .item {
margin: 0 22.5rpx 15rpx;
background-color: #fbfbfb;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
padding-top: 34.5rpx;
padding-left: 37.5rpx;
padding-right: 22.5rpx;
padding-bottom: 30rpx;
position: relative;
}
.chunk .list .item .angle {
position: absolute;
top: 0;
left: 0;
width: 75rpx;
height: 76.5rpx;
}
.chunk .list .item .ranking {
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-style: normal;
font-size: 24rpx;
color: #000000;
width: 76.5rpx;
}
.chunk .list .item .head {
align-items: flex-start;
}
.chunk .list .item .head .name {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 30rpx;
color: #000000;
}
.chunk .list .item .head .mark {
font-size: 27rpx;
color: #333333;
}
.chunk .list .item .head .mark .text {
font-size: 21rpx;
color: #AAAAAA;
}
.chunk .list .item .english {
font-size: 21rpx;
line-height: 42rpx;
color: #333333;
margin-bottom: 3rpx;
}
.chunk .list .item .bottom {
justify-content: space-between;
}
.chunk .list .item .bottom .site {
font-size: 22.5rpx;
line-height: 42rpx;
color: #7F7F7F;
}
.chunk .list .item .bottom .btn {
width: 162rpx;
height: 54rpx;
line-height: 54rpx;
background-color: #f95d5d;
border-radius: 142.5rpx;
font-size: 24rpx;
color: #FFFFFF;
padding: 0 15rpx;
justify-content: space-between;
}
.chunk .list .item .bottom .btn .icon {
width: 27rpx;
height: 27rpx;
}
.chunk .end {
padding-top: 60rpx;
text-align: center;
font-size: 19.5rpx;
color: #D7D7D7;
}
.screen-mask {
background-color: rgba(0, 0, 0, 0.70588235);
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: flex-end;
z-index: 100;
}
.screen-mask .screen-box {
width: 100vw;
background-color: #FFFFFF;
padding-top: 43.5rpx;
border-radius: 45rpx 45rpx 0 0;
}
.screen-mask .screen-box .head {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 30rpx;
color: #000000;
margin-bottom: 45rpx;
text-align: center;
}
.screen-mask .screen-box .box {
margin: 0 22.5rpx 30rpx;
background-color: #fbfbfb;
border: 1rpx solid #f2f2f2;
border-radius: 15rpx;
padding: 16.5rpx 18rpx 30rpx 18rpx;
}
.screen-mask .screen-box .box .title {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 45rpx;
}
.screen-mask .screen-box .box .major-box {
height: 72rpx;
line-height: 72rpx;
background-color: #ffffff;
border: 1rpx solid #ccd003;
border-radius: 112.5rpx;
padding-left: 30rpx;
padding-right: 22.5rpx;
}
.screen-mask .screen-box .box .major-box .text {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 24rpx;
color: #9A9D02;
}
.screen-mask .screen-box .box .major-box .text.text-no {
color: #AAAAAA;
font-weight: 400;
}
.screen-mask .screen-box .box .major-box .icon {
width: 10.5rpx;
height: 18rpx;
}
.screen-mask .screen-box .box .list {
flex-wrap: wrap;
}
.screen-mask .screen-box .box .list .item {
min-width: 150rpx;
height: 72rpx;
line-height: 72rpx;
background-color: #f6f6f6;
border-radius: 112.5rpx;
font-size: 24rpx;
color: #555555;
margin-right: 15rpx;
padding: 0 15rpx;
margin-bottom: 10rpx;
}
.screen-mask .screen-box .box .list .item.pitch {
border: 1rpx solid #ccd003;
font-weight: 650;
color: #9A9D02;
}
.screen-mask .screen-box .footer {
margin-top: 45rpx;
height: 201rpx;
border-top: 1rpx solid #ebebeb;
justify-content: space-between;
font-size: 30rpx;
padding: 45rpx 30rpx 0 30rpx;
}
.screen-mask .screen-box .footer .cancel {
width: 225rpx;
height: 96rpx;
background-color: rgba(207, 247, 255, 0);
border: 1rpx solid #d7d7d7;
border-radius: 112.5rpx;
color: #555555;
}
.screen-mask .screen-box .footer .confirm {
width: 435rpx;
height: 96rpx;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
color: #026277;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 112.5rpx;
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,953 @@
// pages/projectMy/projectMy.js
var miucms = require('../../utils/miucms.js');
let app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Page({
/**
* 页面的初始数据
*/
data: {
informationState: false, // 授权后可能需要弹出完成信息框 个人背景那些
islogin: false,
isloginBtnState: false,
isFirstPattern: true,
classify: "vs", // vs manage '' 代表都没有数据
move: 0,
manageHintState: false, // 底部的提示的显示状态
list: [],
listCount: 0,
page: 1,
stateObj: {
0: "待定",
1: "主申",
2: "冲刺",
3: "保底",
},
isloading: false, // 项目管理获取 item 高度是否完成
headTop: 0, // 项目管理头部的高度
dragging: null, // 是否在拖拽中
arrHeight: 0, // 项目管理的高度
quickList: [], // 快速对比 列表
quickMoreState: false, // 快速对比 的 全部显示状态
typeList: [],
typeIndex: 0,
typeid: "", // 项目管理
projectPage: 1,
projectList: [], // 项目对比
projectCount: [], // 项目对比 数量
selectList: [], // 选中列表
// allQuickHeight: 0,
vsBottom: false, // 底部显示状态
// isInitFinish: false,
},
/**
* 生命周期函数--监听页面加载
*/
rpx30: 30,
rpx219: 219,
options: {},
onLoad(options) {
this.options = options
this.deleteWidth = util.rpxTopx(180 + 30)
miucms.pageStart(app).then(() => {
// 判断是否需要显示底部提示
let manageHintState = true
if (wx.getStorageSync("PMState")) manageHintState = false
const islogin = app.globalData.user.uid > 0 ? true : false
const screen_data = app.globalData.screen_data
this.setData({
screen_data,
islogin,
manageHintState,
// isInitFinish: true,
})
this.windowHeight = screen_data.windowHeight || 812
// if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
if (!islogin) this.openLoginBtnState()
this.rpx30 = util.rpxTopx(30)
this.rpx219 = util.rpxTopx(219)
this.getList().then(res => {
if (res.code != 200) return
const data = res.data
const nums = data.nums || {}
let classify = 'vs'
if (nums['contrast'] == 0 && nums['manage'] == 0) {
classify = ''
} else if (nums['contrast'] == 0 && nums['manage'] != 0) {
classify = 'manage'
this.handleUserProjectData(res)
} else {
this.getQuickList()
this.handleProjectListData(res)
}
this.setData({
classify,
})
})
}).catch(res => {})
},
// 公共的获取列表 方法
getList(obj = {}) {
return new Promise((resolve, reject) => {
wx.showLoading({
title: '加载中...',
})
util.wxpost("/api/project.user", {
limit: 2000,
page: obj.page || 1,
typeid: obj.typeid || '',
}).then(res => resolve(res)).finally(() => wx.hideLoading())
})
},
getProjectList() {
if (this.data.projectPage == 0) return
this.getList({
page: this.data.projectPage,
}).then(res => {
console.log("getUserProject");
this.handleProjectListData(res)
})
},
handleProjectListData(res) {
if (res.code != 200) return
const data = res.data
let list = data.data || []
let projectCount = 0
list.forEach(element => {
if (element.status == 1) projectCount++
})
let projectList = this.data.projectList.concat(list)
this.setData({
projectCount: projectCount + this.data.projectCount,
projectList,
projectPage: data.count > data.limit * data.page ? this.data.projectPage + 1 : 0,
})
},
// 获取快速列表
getQuickList() {
util.wxget("/api/project.contrast/getQuickList", {}).then(res => {
if (res.code != 200) return
const data = res.data
const quickList = data || []
this.setData({
quickList,
quickMoreState: quickList.length > 3 ? false : true,
vsBottom: quickList.length == 0 ? true : false,
})
// 计算 快速对比的高度的 隐藏高度
if (quickList.length > 3) this.calculateQuickHeight()
this.listeningNode()
})
},
// 获取项目管理
getUserProject() {
if (this.data.page == 0) return
this.getList({
page: this.data.page,
typeid: this.data.typeid
}).then(res => {
console.log("getUserProject");
this.handleUserProjectData(res)
})
},
handleUserProjectData(res) {
if (res.code != 200) return
const data = res.data
let list = this.data.list.concat(data.data || [])
list.forEach((element, index) => {
element['sortKey'] = index
})
this.setData({
list,
typeList: data.typeList,
page: data.count > data.limit * data.page ? this.data.page + 1 : 0,
listCount: data.count,
}, () => this.calculateManageHeight())
},
// 计算快速对比的高度 和 隐藏高度
calculateQuickHeight() {
const quickList = this.data.quickList || []
let allQuickHeight = 0
let first3_5 = 0
quickList.forEach((element, index) => {
let height = 186
if (element.data.length == 3) height = 239.25
if (index < 3) first3_5 += height
if (index == 3) first3_5 += (height / 2)
allQuickHeight += height
})
first3_5 = util.rpxTopx(first3_5)
allQuickHeight = util.rpxTopx(allQuickHeight)
this.setData({
first3_5,
allQuickHeight,
})
},
// 计算项目管理的高度
calculateManageHeight() {
const query = this.createSelectorQuery();
let arrHeight = 0
query.select(".manage-box .list").boundingClientRect(res => {
const top = res.top
this.createSelectorQuery().selectAll(".manage-box .list .item").boundingClientRect(res => {
let obj = {}
res.sort((a, b) => a.dataset.key - b.dataset.key);
let totalHeight = 0
res.forEach(element => {
const key = element.dataset.key
let height = element.height
if (height != 0) height += this.rpx30 // 删除了不需要高度
arrHeight += height
obj[key] = {
top: totalHeight,
height,
}
totalHeight += height
})
let list = this.data.list || []
list.forEach((element, index) => {
element['top'] = obj[element.sortKey].top
element['height'] = obj[element.sortKey].height
})
this.setData({
list,
isloading: true,
headTop: top,
arrHeight,
})
}).exec();
}).exec();
},
// 切换查看类型
cutClassify(e) {
const classify = e.currentTarget.dataset.type
if (classify == this.data.classify) return
this.setData({
classify,
// isInitFinish: false,
})
if (this.data.classify == 'manage') {
this.setData({
page: 1,
typeid: "",
arrHeight: 0,
list: [],
})
this.getUserProject()
}
if (this.data.classify == 'vs') {
this.setData({
quickList: [],
quickMoreState: false,
projectPage: 1,
projectList: [],
selectList: [],
// isInitFinish: true,
})
this.getProjectList()
this.getQuickList()
}
},
deleteWidth: 150, // 删除按钮的 宽度
x: 0,
shtouchmove(e) {
this.x = e.detail.x
},
handleTouchEnd(e) {
const index = e.currentTarget.dataset.index
const type = e.currentTarget.dataset.type
let move = 0
if (Math.abs(this.x) > this.deleteWidth / 2) move = -this.deleteWidth
this.setData({
[`${type}[${index}].move`]: move
})
this.x = 0
},
// 关闭 底部提示框
manageClose() {
this.setData({
manageHintState: false,
})
wx.setStorageSync('PMState', 1)
},
// 项目的里的排序 拖拽
movableChange(e) {
if (e.detail.source != 'touch') return
let list = this.data.list || []
const index = e.target.dataset.index
let item = list[index]
item.touch = true
},
pointDistance: 0, // 点距离顶部
longPress(e) {
let index = e.currentTarget.dataset.index;
let list = this.data.list || []
this.setData({
dragging: index,
})
this.pointDistance = e.detail.y - list[index].top - this.data.headTop
wx.vibrateShort({
type: "heavy",
})
this.setData({
list,
})
},
timerr: null,
touchMove(e) {
clearTimeout(this.touchEndTmer)
if (Math.random() < 0.3 || Date.now() - this.timerr < 20) return
this.timerr = Date.now()
let key = e.currentTarget.dataset.key;
let list = this.data.list || []
let currentTouch = e.changedTouches[0];
if (!currentTouch) return;
let index = 0 // 当前 item 的下标 注意 因为 拖拽的 所以和 wx:for 表面上的 index 不一致
list.forEach((element, i) => {
if (element.sortKey == key) index = i
})
if (this.data.dragging == null) return;
// 设置当前 item 的定位 item
const top = currentTouch.pageY - this.data.headTop - this.pointDistance
const bottom = top + list[index].height
list[index].top = top
// 判断 有没有到其他 item 地盘
let keyTop = key - 1
let keyBottom = key + 1
if (keyTop >= 0) {
let keyTopIndex = list.findIndex(element => element.sortKey === keyTop);
let keyItem = list[keyTopIndex]
let keyHeight = keyItem.height || 0
const middleLine = keyItem.top + keyHeight / 2 // 上一个的中间线
if (top <= middleLine) {
// 交换 sortKey
const akey = key
list[index].sortKey = keyItem.sortKey
list[keyTopIndex].sortKey = akey
list[keyTopIndex].top = this.calculateHeight(JSON.parse(JSON.stringify(list)), key)
}
}
if (keyBottom < list.length) {
let keyBottomIndex = list.findIndex(element => element.sortKey === keyBottom);
let keyItem = JSON.parse(JSON.stringify(list[keyBottomIndex]))
let keyHeight = keyItem.height
const middleLine = keyItem.top + keyHeight / 2 // 下一个的中间线
if (bottom >= middleLine) {
// 交换 sortKey
const akey = key
list[index].sortKey = keyItem.sortKey
list[keyBottomIndex].sortKey = akey
list[keyBottomIndex].top = this.calculateHeight(JSON.parse(JSON.stringify(list)), key)
}
}
this.setData({
list,
})
},
touchEndTmer: null,
touchEnd(e) {
this.setData({
dragging: null,
})
let key = e.currentTarget.dataset.key;
let list = this.data.list || []
let index = 0
list.forEach((element, i) => {
if (element.sortKey == key) index = i
})
list[index].top = this.calculateHeight(JSON.parse(JSON.stringify(list)), key)
this.setData({
list
})
this.touchEndTmer = setTimeout(() => {
let list = JSON.parse(JSON.stringify(this.data.list)) || []
// 按照 id 属性排序
const sortedArray = list.slice().sort((a, b) => a.sortKey - b.sortKey);
// 获取排序后的对象在原数组中的索引位置
const indexes = sortedArray.map(obj => list.indexOf(obj));
let accumulatedHeight = 0;
indexes.forEach((element, i) => {
list[element].top = accumulatedHeight
accumulatedHeight += list[element].height
})
this.setData({
list
})
}, 800)
let targetList = JSON.parse(JSON.stringify(list))
// 按照 sortKey 属性对数组进行排序
targetList.sort((a, b) => a.sortKey - b.sortKey);
let newId = []
// 输出排序后的对象的 id 属性
targetList.forEach(obj => {
newId.push(obj.projectid)
});
util.wxpost("/api/project.user/changeSorting", {
projectids: newId
}).then(res => common.toast(res.message))
},
calculateHeight(list, key) {
let height = 0
list.forEach(element => {
if (element.sortKey < key) height += element.height
})
return height
},
scrollTop: 0, // 滚动的距离
// indexSidebar: null,
windowHeight: 812,
onPageScroll(e) {
if (Math.random() < 0.5) return
let scrollTop = e.scrollTop
this.scrollTop = 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()
},
slowScrollNow: "",
slowScrollTo(type) {
if (Date.now() - this.slowScrollNow > 350) {
wx.pageScrollTo({
scrollTop: this.scrollTop - 150,
});
this.slowScrollNow = Date.now()
}
},
openInput(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
list[index]['input'] = 1
this.setData({
list
})
},
linechange(e) {
const index = e.currentTarget.dataset.index
this.calculateManageHeight()
},
bindblur(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
list[index]['input'] = 0
this.setData({
list
})
wx.nextTick(() => {
this.calculateManageHeight()
})
const target = list[index] || {}
this.postRemarks(target.token, target.remarks)
},
// 发送 备注
postRemarks(token, remarks) {
util.wxpost("/api/project.user/remarks", {
token,
remarks,
}).then(res => {
common.toast(res.message)
})
},
// 备注输入
inputRemark(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
const value = e.detail.value
list[index]['remarks'] = value
this.setData({
list
})
},
// 展开 快速对比的 全部
openQuickMore() {
this.setData({
quickMoreState: !this.data.quickMoreState,
})
},
// 选中
cutSelect(e) {
const index = e.currentTarget.dataset.index
const pitch = e.currentTarget.dataset.pitch || false // false 表示还没有选中
let projectList = this.data.projectList || []
const projectid = projectList[index].projectid
let selectList = this.data.selectList
// 检查数组中是否存在指定的id
let indexx = selectList.findIndex(item => item == projectid);
if (indexx !== -1) {
// 如果存在,删除该元素
selectList.splice(indexx, 1);
projectList[index]['pitch'] = false
} else if (selectList.length < 3) {
// 如果不存在,将新元素推入数组
selectList.push(projectid);
projectList[index]['pitch'] = true
}
if (selectList.length >= 2) {
this.setData({
vsBottom: true,
})
}
this.setData({
projectList,
selectList,
})
},
// 跳转 项目对比
goContrast(e) {
const ids = e.currentTarget.dataset.ids
common.goPage(`/pages/projectComparison/projectComparison?ids=${ ids }`)
},
// 点击删除快速对比
quickDelete(e) {
const id = e.currentTarget.dataset.id
const index = e.currentTarget.dataset.index
const quickList = this.data.quickList
util.wxpost("/api/project.contrast/deleteQuick", {
id
}).then(res => {
quickList.splice(index, 1)
common.toast(res.message)
let allQuickHeight = this.data.allQuickHeight
this.setData({
quickList,
allQuickHeight,
})
this.calculateQuickHeight()
})
this.x = 0
},
// 跳转 对比
statePitch(e) {
const index = e.currentTarget.dataset.index
const state = e.currentTarget.dataset.state
let list = this.data.list || []
list.forEach(element => {
element['state'] = false
})
list[index]['state'] = !state
this.setData({
list,
})
},
// 点击对比
startContrast() {
let arr = this.data.selectList
if (arr.length == 0 || arr.length < 2) {
common.toast(arr.length == 0 ? '请选择项目' : '请选择2~3个项目')
return
}
common.goPage(`/pages/projectComparison/projectComparison?ids=${arr}`)
let projectList = this.data.projectList || []
projectList.forEach(element => {
element['pitch'] = false
})
this.setData({
selectList: [],
projectList,
})
},
// 点击项目管理的删除
delete(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
const target = list[index]
util.wxpost("/api/project.user/delete", {
token: target.token,
}).then(res => {
if (res.code != 200) return
common.toast(res.message)
const typeList = this.data.typeList || []
const stateObj = this.data.stateObj
const stateName = stateObj[target.typeid]
typeList.forEach(element => {
if (element.name == '全部') element.count--
if (element.name == stateName) element.count--
})
const height = target['height']
list[index]['ismanage'] = 0
list[index]['height'] = 0
// 对数组按sortKey进行排序
list.sort((a, b) => a.sortKey - b.sortKey);
// 初始化累加的高度
let accumulatedHeight = 0;
list.forEach((element, i) => {
element.top = accumulatedHeight
accumulatedHeight += element.height
})
let arrHeight = 0
list.forEach(element => {
arrHeight += element.height
})
this.setData({
list,
arrHeight,
typeList,
})
})
},
// 修改 项目 状态
changeType(e) {
const typeid = e.currentTarget.dataset.typeid
const index = e.currentTarget.dataset.index
const list = this.data.list || []
const target = JSON.parse(JSON.stringify(list[index])) || {}
util.wxpost("/api/project.user/changeType", {
token: target.token,
typeid,
}).then(res => {
if (res.code != 200) return
const typeList = this.data.typeList || []
const typeIndex = this.data.typeIndex || 0
const stateObj = this.data.stateObj
const stateNameFront = stateObj[target.typeid] // 修改前的状态
const stateNameAfter = stateObj[typeid] // 修改后的状态
typeList.forEach(element => {
if (element.name == stateNameFront) element.count--
if (element.name == stateNameAfter) element.count++
})
list[index]['typeid'] = typeid
list[index]['state'] = false
if (typeIndex != 0) {
list[index]['ismanage'] = 0
list[index]['height'] = 0
// 对数组按sortKey进行排序
list.sort((a, b) => a.sortKey - b.sortKey);
// 初始化累加的高度
let accumulatedHeight = 0;
list.forEach((element, i) => {
element.top = accumulatedHeight
accumulatedHeight += element.height
})
let arrHeight = 0
list.forEach(element => {
arrHeight += element.height
})
this.setData({
arrHeight,
})
}
this.setData({
list,
typeList,
})
})
},
// 点击头部 tab
cutTypeid(e) {
const typeid = e.currentTarget.dataset.value
const index = e.currentTarget.dataset.index
this.setData({
typeid,
typeIndex: index,
list: [],
page: 1,
}, () => this.getUserProject())
},
// 点击删除对比库
projectDelete(e) {
const index = e.currentTarget.dataset.index
const projectid = e.currentTarget.dataset.projectid
util.wxpost("/api/project.contrast/delete", {
projectid
}).then(res => {
if (res.code != 200) return
common.toast(res.message)
let projectList = this.data.projectList
projectList.splice(index, 1)
this.setData({
projectList,
projectCount: this.data.projectCount--,
})
})
},
goPage(e) {
const url = e.currentTarget.dataset.url
common.goPage(url)
},
observer: null,
listeningNode() {
this.observer = wx.createIntersectionObserver(this, {
observeAll: true,
thresholds: [0] // 设定阈值,表示元素一半进入可视区域时触发
});
this.observer.relativeToViewport().observe('.quick-border', res => {
if (res.intersectionRatio == 0) {
this.setData({
vsBottom: true,
})
}
});
},
// 打开 授权按钮
openLoginBtnState() {
this.setData({
isloginBtnState: true,
})
},
// 关闭授权登录事件
popClose() {
this.setData({
isloginBtnState: !this.data.isloginBtnState
})
},
userClickLogin(e) {
let data = e.detail.data
this.setData({
islogin: true,
isloginBtnState: false,
informationState: data.regdatastep == 'success' ? false : true,
quickList: [],
quickMoreState: false,
projectPage: 1,
projectList: [],
selectList: [],
page: 1,
typeid: "",
arrHeight: 0,
list: [],
})
this.onLoad(this.options)
},
// 子组件传值 修改 完善信息组件的状态
revampInformationState() {
this.setData({
informationState: false
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
if (app.globalData['isquickState']) this.getQuickList()
app.globalData['isquickState'] = false
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
if (this.data.classify == 'manage') {
this.setData({
page: 1,
typeid: "",
arrHeight: 0,
})
this.getUserProject()
}
if (this.data.classify == 'vs') {
this.setData({
quickList: [],
quickMoreState: false,
projectPage: 1,
projectList: [],
selectList: [],
})
this.getProjectList()
this.getQuickList()
}
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
if (this.data.classify == 'manage') this.getUserProject()
if (this.data.classify == 'vs') this.getProjectList()
},
})

View File

@ -0,0 +1,8 @@
{
"enablePullDownRefresh": false,
"usingComponents": {
"header-nav": "/component/headerNav/headerNav",
"go-login": "/component/goLogin/goLogin",
"index-sidebar": "/component/indexSidebar/indexSidebar"
}
}

View File

@ -0,0 +1,775 @@
/* pages/projectMy/projectMy.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.container {
min-height: 80vh;
padding-bottom: 180rpx;
&.no-data-bj {
background-color: rgba(245, 245, 245, 1);
}
}
.header-box {
width: 100vw;
height: 219rpx;
background: -webkit-linear-gradient(270deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
background: -moz-linear-gradient(180deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
background: linear-gradient(180deg, rgba(246, 246, 189, 1) 0%, rgba(245, 245, 245, 1) 100%);
position: relative;
}
.header-nav {
position: absolute;
top: 0;
}
.classify {
padding-top: 21rpx;
font-size: 30rpx;
color: #555555;
// width: 100vh;
height: 109.5rpx;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
background-color: rgba(237, 240, 244, 1);
border-radius: 15rpx 15rpx 0 0;
-moz-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0470588235294118);
-webkit-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0470588235294118);
box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.0470588235294118);
.classify-item {
justify-content: center;
position: relative;
.pitch {
position: absolute;
top: -26rpx;
left: 0;
width: 375rpx;
height: 90rpx;
font-weight: 650;
font-size: 30rpx;
color: #000000;
overflow: hidden;
&.right {
left: auto;
right: 0;
.text {
margin-left: 115.5rpx;
}
}
.icon {
position: absolute;
left: -4.5rpx;
top: -4.5rpx;
width: 385.5rpx;
height: 100.5rpx;
}
.text {
position: relative;
z-index: 1;
margin-top: 27rpx;
margin-left: 73.5rpx;
.text-icon-box {
width: 42rpx;
height: 42rpx;
margin-right: 15rpx;
}
}
}
}
}
.manage-box {
.state-scroll {
margin-top: -27rpx;
background-color: #ffffff;
position: relative;
width: 100vw;
white-space: nowrap;
box-sizing: border-box;
&.state-list {
display: flex;
padding-top: 48rpx;
padding-left: 22.5rpx;
padding-bottom: 30rpx;
width: 100vw;
.item {
font-weight: 400;
font-size: 24rpx;
color: #555555;
margin-right: 45rpx;
display: flex;
display: inline-block;
&.pitch {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
color: #000000;
position: relative;
z-index: 1;
&::after {
content: "";
width: 100%;
height: 12rpx;
background-color: rgba(207, 247, 255, 1);
border-radius: 58.5rpx;
position: absolute;
left: 0;
bottom: 0;
z-index: -1;
}
}
}
}
}
.list {
padding: 0 22.5rpx;
position: relative;
min-height: 65vh;
// width: auto;
// height: auto;
box-sizing: border-box;
.item {
background-color: rgba(251, 251, 251, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
padding-top: 22.5rpx;
width: calc(100vw - 45rpx);
&:not(:last-of-type) {
margin-bottom: 30rpx;
}
&.itemTransition {
transition: all .3s;
}
&.zIndex {
z-index: 10;
box-shadow: 0 0 18rpx rgba(0, 0, 0, .1);
}
&.cur {
transition: initial;
}
&.fixed {
z-index: 0 !important;
}
&.delete {
padding: 0;
margin: 0;
border: none;
}
.top {
padding-bottom: 18rpx;
border-bottom: 1rpx solid #ebebeb;
padding-left: 22.5rpx;
.info {
.name {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
}
.english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 19.5rpx;
}
.school {
color: #333333;
font-size: 24rpx;
.icon {
width: 24rpx;
height: 27rpx;
margin-right: 12rpx;
}
}
}
.state {
width: 150rpx;
height: 105rpx;
position: relative;
.state-mask {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: 1;
}
.state-box {
border-radius: 12rpx;
position: absolute;
z-index: 2;
&.show {
background-color: rgba(245, 252, 253, 1);
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.2),
0 0 0 1rpx rgba(242, 242, 242, 1);
z-index: 3;
.state-list {
display: block;
}
.delete {
display: flex;
}
}
&.undetermined {
.state-pitch {
background-color: rgba(249, 93, 93, 1);
}
.state-list {
.state-item {
&.pitch {
color: #F95D5D;
}
}
}
}
.state-pitch {
width: 105rpx;
height: 60rpx;
background-color: rgba(4, 176, 213, 1);
border-radius: 12rpx;
font-size: 24rpx;
color: #FFFFFF;
margin: 22.5rpx 22.5rpx 18rpx;
.icon {
width: 16.5rpx;
height: 9rpx;
margin-left: 8rpx;
}
}
.state-list {
padding: 0 0 13.5rpx;
border-bottom: 1rpx dotted #d7d7d7;
display: none;
.state-item {
height: 75rpx;
font-size: 24rpx;
color: #555555;
&.pitch {
color: #04B0D5;
}
}
}
.delete {
display: none;
padding: 31.5rpx 0;
.btn {
width: 48rpx;
height: 48rpx;
background-color: #f2f2f2;
border-radius: 50%;
.icon {
width: 21rpx;
height: 22.5rpx;
}
}
}
}
}
}
.bottom {
align-items: flex-start;
.edit {
width: 36rpx;
height: 36rpx;
border-radius: 50%;
background-color: #f2f2f2;
margin-top: 33rpx;
margin-left: 22.5rpx;
.icon {
width: 24rpx;
height: 24rpx;
}
}
.input {
font-size: 24rpx;
line-height: 36rpx;
padding-top: 33rpx;
padding-left: 22.5rpx;
padding-bottom: 33rpx;
word-break: break-all;
white-space: pre-line;
&.text {
min-height: 102rpx;
}
&.placeholder {
color: #aaaaaa;
}
}
.drag-box {
padding: 34.5rpx 22rpx 0;
.icon {
width: 30rpx;
height: 30rpx;
}
}
}
}
}
.end {
padding-top: 45rpx;
padding-bottom: 45rpx;
text-align: center;
font-size: 19.5rpx;
color: #D7D7D7;
position: absolute;
bottom: 120px;
width: 100%;
}
.manage-hint {
position: fixed;
bottom: 0;
left: 0;
width: 100vw;
height: 150rpx;
background-color: rgba(246, 246, 246, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
padding-left: 22.5rpx;
z-index: 2;
.icon {
width: 24rpx;
height: 24rpx;
margin-right: 15rpx;
margin-top: 46.5rpx;
}
.hint-text {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
color: #555555;
font-size: 24rpx;
padding-right: 30rpx;
margin-top: 42rpx;
text {
font-weight: 650;
color: #000000;
}
}
.close {
width: 118.5rpx;
height: 150rpx;
border-left: 1rpx solid #ebebeb;
.close-icon {
width: 18rpx;
height: 18rpx;
}
}
}
}
.vs-box {
margin-top: -27rpx;
background-color: #ffffff;
position: relative;
.head-box {
.dot {
width: 9rpx;
height: 24rpx;
background-color: rgba(204, 208, 3, 1);
border: 1rpx solid rgba(154, 157, 2, 1);
border-radius: 7.5rpx;
margin-right: 15rpx;
}
font-weight: 400;
font-size: 27rpx;
color: #000000;
padding-left: 30rpx;
height: 112.5rpx;
}
.select-box {
.list {
.item {
width: calc(100vw - 60rpx);
height: initial;
position: relative;
overflow: hidden;
margin: 0 30rpx;
border-top: 1rpx dotted #ebebeb;
.movable-view {
width: calc(100vw + 180rpx);
height: initial;
margin: 0 30rpx;
position: relative;
display: flex;
}
.content {
width: calc(100vw - 60rpx);
margin-right: 30rpx;
}
.left {
padding-top: 31.5rpx;
// width: 643.5rpx;
// width: 628.5rpx;
padding-right: 15rpx;
flex: 1;
.name {
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
}
.english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 15rpx;
}
.message {
color: #333333;
font-size: 24rpx;
margin-bottom: 30rpx;
.icon {
width: 24rpx;
height: 27rpx;
margin-right: 15rpx;
}
.line {
color: #d7d7d7;
margin: 0 20rpx;
}
.state-text {
height: 33rpx;
background-color: rgba(240, 241, 236, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
border-radius: 9rpx;
font-size: 22.5rpx;
color: #7F7F7F;
padding: 0 7.5rpx;
}
}
}
.btn {
.icon {
width: 45rpx;
height: 45rpx;
}
}
.delete {
width: 150rpx;
background-color: rgba(249, 93, 93, 1);
font-size: 27rpx;
color: #FFFFFF;
}
}
}
}
.quick-box {
.list {
transition: all .3s;
overflow: hidden;
&.hide {
height: 735rpx;
overflow: hidden;
}
}
.movable-area {
width: calc(100vw - 60rpx);
height: initial;
margin: 0 30rpx;
overflow: hidden;
border-radius: 18rpx;
margin-bottom: 30rpx;
.item {
width: calc(100vw + 180rpx);
height: initial;
margin: 0 30rpx;
position: relative;
display: flex;
.content {
width: calc(100vw - 60rpx);
background-color: rgba(246, 246, 246, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
padding: 34.5rpx 22.5rpx;
justify-content: space-between;
.project-list {
.project-item {
font-size: 24rpx;
color: #333333;
line-height: 33.75rpx;
&:not(:last-of-type) {
margin-bottom: 19.5rpx;
}
.icon {
width: 24rpx;
height: 27rpx;
margin-right: 7.5rpx;
}
.arrows {
width: 18rpx;
height: 18rpx;
margin: 0 13.5rpx;
}
.text {
width: 313.5rpx;
}
}
}
.btn {
width: 150rpx;
height: 60rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 172.5rpx;
font-weight: 650;
font-size: 24rpx;
color: #026277;
}
}
z-index: 1;
.delete {
width: 150rpx;
border-radius: 0 18rpx 18rpx 0;
position: relative;
font-size: 27rpx;
color: #FFFFFF;
&::after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 120%;
height: 100%;
z-index: -1;
background-color: rgba(249, 93, 93, 1);
border-radius: 18rpx;
width: 150rpx;
}
}
}
}
.more-btn {
height: 123rpx;
font-size: 24rpx;
color: #555555;
position: relative;
z-index: 1;
margin-top: -30rpx;
background: #ffff;
&.pack {
.icon {
transform: rotate(180deg);
}
.mengcheng {
display: none;
}
}
.icon {
width: 27rpx;
height: 27rpx;
margin-left: 16rpx;
transition: all .3s;
}
.mengcheng {
width: calc(100vw - 60rpx);
height: 48rpx;
position: absolute;
top: -48rpx;
}
}
}
.quick-border {
height: 9rpx;
background-color: rgba(242, 242, 242, 1);
}
.vs-bottom {
width: 100vw;
height: 150rpx;
background-color: rgba(246, 246, 246, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
position: fixed;
bottom: 0;
left: 0;
padding: 0 22.5rpx;
z-index: 10;
.begin-btn {
height: 96rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 172.5rpx;
font-weight: 650;
font-size: 36rpx;
color: #026277;
}
}
.lack-hint {
position: fixed;
left: 30rpx;
bottom: 30rpx;
width: 690rpx;
height: 84rpx;
background-color: rgba(246, 246, 246, 1);
border-radius: 9rpx;
font-size: 24rpx;
color: #333333;
padding: 0 15rpx;
.icon {
width: 24rpx;
height: 24rpx;
margin-right: 15rpx;
}
}
}
.no-data {
margin: 0 30rpx 30rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
flex-direction: column;
height: 80vh;
.icon {
width: 120rpx;
height: 141rpx;
margin-bottom: 40.5rpx;
}
.text {
font-size: 24rpx;
color: #7F7F7F;
line-height: 45rpx;
}
}
.empty {
background-color: #fff;
color: #7F7F7F;
font-size: 23rpx;
margin: 36rpx 0rpx 0;
flex-direction: column;
height: 60vh;
.dot-box {
.dot {
width: 12rpx;
height: 12rpx;
&:not(:last-of-type) {
margin-right: 8rpx;
}
}
}
.empty-icom {
width: 153rpx;
height: 180rpx;
margin-top: 12rpx;
margin-bottom: 30rpx;
}
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,205 @@
<!--pages/projectMy/projectMy.wxml-->
<view class="container {{ classify == '' ? 'no-data-bj' : '' }}">
<header-nav class="header-nav" bgcolor="{{ isFirstPattern ? 'transparent' : '#f5f5f5' }}">我的项目</header-nav>
<view class="header-box"></view>
<view class="no-data flexcenter" wx:if="{{ classify == '' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/empty-icon.png" mode="widthFix"></image>
<view class="text">把你感兴趣的项目加进来,</view>
<view class="text">可以做项目对比哦!</view>
</view>
<view class="classify flexflex" wx:if="{{ classify != '' }}">
<view class="classify-item flexflex flex1" bind:tap="cutClassify" data-type="vs">
<view class="pitch" wx:if="{{ classify == 'vs' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/list-left-icon.svg"></image>
<view class="text flexacenter">
<image class="text-icon-box" src="https://app.gter.net/image/miniApp/offer/vs-icon.png" mode="widthFix"></image>
项目对比
</view>
</view>
<block wx:else>项目对比</block>
</view>
<view class="classify-item flexflex flex1" bind:tap="cutClassify" data-type="manage">
<view class="pitch right" wx:if="{{ classify == 'manage' }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/list-right-icon.svg"></image>
<view class="text flexacenter">
<image class="text-icon-box" src="https://app.gter.net/image/miniApp/offer/project-icon.png" mode="widthFix"></image>
项目管理
</view>
</view>
<block wx:else>项目管理</block>
</view>
</view>
<view class="vs-box" wx:if="{{ classify == 'vs' }}">
<view class="quick-box" wx:if="{{ quickList.length }}">
<view class="head-box flexacenter">
<view class="dot"></view>
快速对比({{ quickList.length }}
</view>
<view class="list {{ !quickMoreState ? 'hide' : '' }}" style="height: {{ !quickMoreState ? first3_5 : allQuickHeight }}px;">
<movable-area class="movable-area flexacenter" wx:for="{{ quickList }}" wx:key="index">
<movable-view class="item" direction="horizontal" bindchange="shtouchmove" x='{{ item.move }}' bindtouchend="handleTouchEnd" data-type="{{ 'quickList' }}" data-index="{{ index }}" wx:key="index">
<view class="content flexacenter">
<view class="project-list">
<view class="project-item flexacenter" wx:for="{{ item.data }}" wx:key="index">
<image class="icon" mode="widthFix" src="{{ item.schoollogo }}"></image>
{{ item.schoolalias }}
<image class="arrows" src="https://app.gter.net/image/miniApp/offer/arrows-circle-yellow-green.svg" mode="widthFix"></image>
<view class="text one-line-display">{{ item.name_zh }}</view>
</view>
</view>
<view class="btn flexcenter" bind:tap="goContrast" data-ids="{{ item.projectid }}">开始对比</view>
</view>
<view class="delete flexcenter" bind:tap="quickDelete" data-id="{{ item.id }}" data-index="{{ index }}">删除</view>
</movable-view>
</movable-area>
</view>
<view class="more-btn flexcenter {{ quickMoreState ? 'pack' : '' }}" bind:tap="openQuickMore" wx:if="{{ quickList.length > 3 }}">
{{ quickMoreState ? '收起' : '展开全部' }}
<image class="mengcheng" src="https://app.gter.net/image/miniApp/offer/mengcheng-icon.svg" mode="widthFix"></image>
<image class="icon" src="https://app.gter.net/image/miniApp/offer/arrow-circle.png" mode="widthFix"></image>
</view>
</view>
<view class="quick-border" wx:if="{{ quickList.length }}"></view>
<view class="select-box">
<view class="head-box flexacenter">
<view class="dot"></view>
选择2~3个项目开始对比
</view>
<view class="list">
<block wx:for="{{ projectList }}" wx:key="index">
<movable-area wx:if="{{ item.status == 1 }}" class="item flexacenter">
<movable-view class="movable-view" direction="horizontal" bindchange="shtouchmove" x='{{ item.move }}' bindtouchend="handleTouchEnd" data-type="{{ 'projectList' }}" data-index="{{ index }}" wx:key="index" bind:tap="goPage" data-url="/pages/projectDetails/projectDetails?uniqid={{ item.uniqid }}">
<view class="content flexacenter" data-index="{{ index }}">
<view class="left">
<view class="name">{{ item.name_zh }}</view>
<view class="english">{{ item.name_en }}</view>
<view class="message flexacenter">
<image class="icon" src="{{ item.schoollogo }}" mode="widthFix"></image>
{{ item.schoolalias }}
<block wx:if="{{ item.ismanage == 1 }}">
<view class="line">|</view>
<view class="state-text">{{ stateObj[item.typeid] }}</view>
</block>
</view>
</view>
<view class="btn flexcenter" catch:tap="cutSelect" data-index="{{ index }}" data-pitch="{{ item.pitch }}">
<image wx:if="{{ item.pitch }}" class="icon" src="https://app.gter.net/image/miniApp/offer/tick-red.svg" mode="widthFix"></image>
<image wx:elif="{{ selectList.length == 3 }}" class="icon" src="https://app.gter.net/image/miniApp/offer/tick-gray.svg" mode="widthFix"></image>
<image wx:else class="icon" src="https://app.gter.net/image/miniApp/offer/tick-dark-gray.svg" mode="widthFix"></image>
</view>
</view>
<view class="delete flexcenter" catch:tap="projectDelete" data-index="{{ index }}" data-projectid="{{ item.projectid }}">删除</view>
</movable-view>
</movable-area>
</block>
</view>
<view class="empty flexcenter" wx:if="{{ projectCount == 0 && projectPage == 0 }}">
<view class="dot-box flexacenter">
<image class="dot" wx:for="{{ 3 }}" wx:key="index" mode="widthFix" src="https://app.gter.net/image/miniApp/project/u1829.svg"></image>
<image class="dot" wx:for="{{ 3 }}" wx:key="index" mode="widthFix" src="https://app.gter.net/image/miniApp/project/u1832.svg"></image>
</view>
<image class="empty-icom" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/u1828.svg"></image>
<view>暂无数据</view>
</view>
</view>
<view class="vs-bottom flexacenter" wx:if="{{ vsBottom }}">
<view class="begin-btn flex1 flexcenter" bind:tap="startContrast">开始对比</view>
</view>
<view class="lack-hint flexacenter" wx:if="{{ projectCount < 2 }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/warning-icon.svg" mode="widthFix"></image>
至少要有两个项目才能开始对比哦
</view>
</view>
<view class="manage-box" wx:elif="{{ classify == 'manage' }}">
<scroll-view class="state-scroll state-list" scroll-x="{{ true }}">
<view class="item {{ typeIndex == index ? 'pitch' : '' }}" wx:for="{{ typeList }}" wx:key="index" bind:tap="cutTypeid" data-value="{{ item.value }}" data-index="{{ index }}">{{ item.name }} {{ item.count }}</view>
</scroll-view>
<scroll-view class="list" scroll-x="{{ true }}" style="height: {{ arrHeight + 150 }}px;">
<view class="item item{{ index }} {{ dragging == index ? 'zIndex' : 'itemTransition' }} {{ item.ismanage == 0 ? ' delete' : '' }}" wx:for="{{ list }}" wx:key="index" data-key="{{ item.sortKey }}" data-index="{{ index }}" catch:touchmove="{{ dragging != null ? 'touchMove' : '' }}" catch:touchend="{{ dragging != null ? 'touchEnd' : '' }}" style="top: {{ item.top }}px;position: {{ isloading ? 'absolute' : '' }}">
<block wx:if="{{ item.ismanage == 0 }}"></block>
<block wx:else>
<view class="top flexacenter" catch:tap="goPage" data-url="/pages/projectDetails/projectDetails?uniqid={{ item.uniqid }}">
<view class="info flex1">
<view class="name">{{ item.name_zh }}</view>
<view class="english">{{ item.name_en }}</view>
<view class="school flexacenter">
<image class="icon" src="{{ item.schoollogo }}" mode="widthFix"></image>
{{ item.schoolalias }}
</view>
</view>
<view class="state">
<view class="state-mask" wx:if="{{ item.state }}" catch:tap="statePitch" data-state="{{ item.state || false }}" data-index="{{ index }}"></view>
<view class="state-box {{ item.typeid == 0 ? 'undetermined' : '' }} {{ item.state ? 'show' : '' }}">
<view class="state-pitch flexcenter " catch:tap="statePitch" data-state="{{ item.state || false }}" data-index="{{ index }}">
{{ stateObj[item.typeid] }}
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/triangle-white.svg"></image>
</view>
<view class="state-list">
<view class="state-item flexcenter {{ item.typeid == i ? 'pitch' : '' }}" wx:for="{{ stateObj }}" wx:for-item="it" wx:for-index="i" wx:key="i" catch:tap="changeType" data-typeid="{{ i }}" data-index="{{ index }}">{{ it }}</view>
</view>
<view class="delete flexcenter" catch:tap="delete" data-index="{{ index }}">
<view class="btn flexcenter">
<image class="icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/delete-light-grey.svg"></image>
</view>
</view>
</view>
</view>
</view>
<view class="bottom flexflex">
<view class="edit flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/project/u1434.png" mode="widthFix"></image>
</view>
<block wx:if="{{ item.input }}">
<textarea class="input flex1" focus="{{ true }}" auto-focus="{{ true }}" auto-height="{{ true }}" placeholder="添加备注…" maxlength="100" cursor-spacing="10" bindinput="inputRemark" bindlinechange="linechange" bindblur="bindblur" data-index="{{ index }}" value="{{ item.remarks }}"></textarea>
</block>
<block wx:else>
<view wx:if="{{ item.remarks }}" class="input flex1 text " bind:tap="openInput" data-index="{{ index }}">{{ item.remarks }}</view>
<view wx:else class="input flex1 text placeholder" bind:tap="openInput" data-index="{{ index }}">添加备注…</view>
</block>
<view class="drag-box" bind:longpress="longPress" data-index="{{ index }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/drag-icon.png" mode="widthFix"></image>
</view>
</view>
</block>
</view>
<view class="end" wx:if="{{ page == 0 && list.length != 0 }}">- End -</view>
<view class="empty flexcenter" wx:if="{{ page == 0 && typeList[typeIndex]['count'] == 0 }}">
<view class="dot-box flexacenter">
<image class="dot" wx:for="{{ 3 }}" wx:key="index" mode="widthFix" src="https://app.gter.net/image/miniApp/project/u1829.svg"></image>
<image class="dot" wx:for="{{ 3 }}" wx:key="index" mode="widthFix" src="https://app.gter.net/image/miniApp/project/u1832.svg"></image>
</view>
<image class="empty-icom" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/u1828.svg"></image>
<view>暂无数据</view>
</view>
</scroll-view>
<view class="manage-hint flexflex" wx:if="{{ manageHintState }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/warning-icon.svg" mode="widthFix"></image>
<view class="hint-text flex1">
加入<text>对比单</text>的项目会同步进入<text>项目管理</text>当中;两者独立管理,删除操作互不影响。
</view>
<view class="close flexcenter" bind:tap="manageClose">
<image class="close-icon" src="https://app.gter.net/image/miniApp/offer/close-black.png" mode="widthFix"></image>
</view>
</view>
</view>
<go-login wx:if="{{ isloginBtnState }}" islogin="{{ islogin }}" binduserClickLogin="userClickLogin" bindpopClose="popClose"></go-login>
</view>
<!-- <index-sidebar wx:if="{{ classify == 'vs' }}" id="index-sidebar" class="index-sidebar" sidebarType="xg" isInitFinish="{{ isInitFinish }}" bind:openLogin="openLoginBtnState" islogin="{{ islogin }}"></index-sidebar> -->

View File

@ -0,0 +1,619 @@
/* pages/projectMy/projectMy.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.container {
min-height: 80vh;
padding-bottom: 180rpx;
}
.container.no-data-bj {
background-color: #f5f5f5;
}
.header-box {
width: 100vw;
height: 219rpx;
background: -webkit-linear-gradient(270deg, #f6f6bd 0%, #f5f5f5 100%);
background: -moz-linear-gradient(180deg, #f6f6bd 0%, #f5f5f5 100%);
background: linear-gradient(180deg, #f6f6bd 0%, #f5f5f5 100%);
position: relative;
}
.header-nav {
position: absolute;
top: 0;
}
.classify {
padding-top: 21rpx;
font-size: 30rpx;
color: #555555;
height: 109.5rpx;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
background-color: #edf0f4;
border-radius: 15rpx 15rpx 0 0;
-moz-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.04705882);
-webkit-box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.04705882);
box-shadow: 0 -1.5rpx 4.5rpx rgba(0, 0, 0, 0.04705882);
}
.classify .classify-item {
justify-content: center;
position: relative;
}
.classify .classify-item .pitch {
position: absolute;
top: -26rpx;
left: 0;
width: 375rpx;
height: 90rpx;
font-weight: 650;
font-size: 30rpx;
color: #000000;
overflow: hidden;
}
.classify .classify-item .pitch.right {
left: auto;
right: 0;
}
.classify .classify-item .pitch.right .text {
margin-left: 115.5rpx;
}
.classify .classify-item .pitch .icon {
position: absolute;
left: -4.5rpx;
top: -4.5rpx;
width: 385.5rpx;
height: 100.5rpx;
}
.classify .classify-item .pitch .text {
position: relative;
z-index: 1;
margin-top: 27rpx;
margin-left: 73.5rpx;
}
.classify .classify-item .pitch .text .text-icon-box {
width: 42rpx;
height: 42rpx;
margin-right: 15rpx;
}
.manage-box .state-scroll {
margin-top: -27rpx;
background-color: #ffffff;
position: relative;
width: 100vw;
white-space: nowrap;
box-sizing: border-box;
}
.manage-box .state-scroll.state-list {
display: flex;
padding-top: 48rpx;
padding-left: 22.5rpx;
padding-bottom: 30rpx;
width: 100vw;
}
.manage-box .state-scroll.state-list .item {
font-weight: 400;
font-size: 24rpx;
color: #555555;
margin-right: 45rpx;
display: flex;
display: inline-block;
}
.manage-box .state-scroll.state-list .item.pitch {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
color: #000000;
position: relative;
z-index: 1;
}
.manage-box .state-scroll.state-list .item.pitch::after {
content: "";
width: 100%;
height: 12rpx;
background-color: #cff7ff;
border-radius: 58.5rpx;
position: absolute;
left: 0;
bottom: 0;
z-index: -1;
}
.manage-box .list {
padding: 0 22.5rpx;
position: relative;
min-height: 65vh;
box-sizing: border-box;
}
.manage-box .list .item {
background-color: #fbfbfb;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
padding-top: 22.5rpx;
width: calc(100vw - 45rpx);
}
.manage-box .list .item:not(:last-of-type) {
margin-bottom: 30rpx;
}
.manage-box .list .item.itemTransition {
transition: all 0.3s;
}
.manage-box .list .item.zIndex {
z-index: 10;
box-shadow: 0 0 18rpx rgba(0, 0, 0, 0.1);
}
.manage-box .list .item.cur {
transition: initial;
}
.manage-box .list .item.fixed {
z-index: 0 !important;
}
.manage-box .list .item.delete {
padding: 0;
margin: 0;
border: none;
}
.manage-box .list .item .top {
padding-bottom: 18rpx;
border-bottom: 1rpx solid #ebebeb;
padding-left: 22.5rpx;
}
.manage-box .list .item .top .info .name {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
}
.manage-box .list .item .top .info .english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 19.5rpx;
}
.manage-box .list .item .top .info .school {
color: #333333;
font-size: 24rpx;
}
.manage-box .list .item .top .info .school .icon {
width: 24rpx;
height: 27rpx;
margin-right: 12rpx;
}
.manage-box .list .item .top .state {
width: 150rpx;
height: 105rpx;
position: relative;
}
.manage-box .list .item .top .state .state-mask {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: 1;
}
.manage-box .list .item .top .state .state-box {
border-radius: 12rpx;
position: absolute;
z-index: 2;
}
.manage-box .list .item .top .state .state-box.show {
background-color: #f5fcfd;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.2), 0 0 0 1rpx #f2f2f2;
z-index: 3;
}
.manage-box .list .item .top .state .state-box.show .state-list {
display: block;
}
.manage-box .list .item .top .state .state-box.show .delete {
display: flex;
}
.manage-box .list .item .top .state .state-box.undetermined .state-pitch {
background-color: #f95d5d;
}
.manage-box .list .item .top .state .state-box.undetermined .state-list .state-item.pitch {
color: #F95D5D;
}
.manage-box .list .item .top .state .state-box .state-pitch {
width: 105rpx;
height: 60rpx;
background-color: #04b0d5;
border-radius: 12rpx;
font-size: 24rpx;
color: #FFFFFF;
margin: 22.5rpx 22.5rpx 18rpx;
}
.manage-box .list .item .top .state .state-box .state-pitch .icon {
width: 16.5rpx;
height: 9rpx;
margin-left: 8rpx;
}
.manage-box .list .item .top .state .state-box .state-list {
padding: 0 0 13.5rpx;
border-bottom: 1rpx dotted #d7d7d7;
display: none;
}
.manage-box .list .item .top .state .state-box .state-list .state-item {
height: 75rpx;
font-size: 24rpx;
color: #555555;
}
.manage-box .list .item .top .state .state-box .state-list .state-item.pitch {
color: #04B0D5;
}
.manage-box .list .item .top .state .state-box .delete {
display: none;
padding: 31.5rpx 0;
}
.manage-box .list .item .top .state .state-box .delete .btn {
width: 48rpx;
height: 48rpx;
background-color: #f2f2f2;
border-radius: 50%;
}
.manage-box .list .item .top .state .state-box .delete .btn .icon {
width: 21rpx;
height: 22.5rpx;
}
.manage-box .list .item .bottom {
align-items: flex-start;
}
.manage-box .list .item .bottom .edit {
width: 36rpx;
height: 36rpx;
border-radius: 50%;
background-color: #f2f2f2;
margin-top: 33rpx;
margin-left: 22.5rpx;
}
.manage-box .list .item .bottom .edit .icon {
width: 24rpx;
height: 24rpx;
}
.manage-box .list .item .bottom .input {
font-size: 24rpx;
line-height: 36rpx;
padding-top: 33rpx;
padding-left: 22.5rpx;
padding-bottom: 33rpx;
word-break: break-all;
white-space: pre-line;
}
.manage-box .list .item .bottom .input.text {
min-height: 102rpx;
}
.manage-box .list .item .bottom .input.placeholder {
color: #aaaaaa;
}
.manage-box .list .item .bottom .drag-box {
padding: 34.5rpx 22rpx 0;
}
.manage-box .list .item .bottom .drag-box .icon {
width: 30rpx;
height: 30rpx;
}
.manage-box .end {
padding-top: 45rpx;
padding-bottom: 45rpx;
text-align: center;
font-size: 19.5rpx;
color: #D7D7D7;
position: absolute;
bottom: 120px;
width: 100%;
}
.manage-box .manage-hint {
position: fixed;
bottom: 0;
left: 0;
width: 100vw;
height: 150rpx;
background-color: #f6f6f6;
border: 1rpx solid #ebebeb;
padding-left: 22.5rpx;
z-index: 2;
}
.manage-box .manage-hint .icon {
width: 24rpx;
height: 24rpx;
margin-right: 15rpx;
margin-top: 46.5rpx;
}
.manage-box .manage-hint .hint-text {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-weight: 400;
color: #555555;
font-size: 24rpx;
padding-right: 30rpx;
margin-top: 42rpx;
}
.manage-box .manage-hint .hint-text text {
font-weight: 650;
color: #000000;
}
.manage-box .manage-hint .close {
width: 118.5rpx;
height: 150rpx;
border-left: 1rpx solid #ebebeb;
}
.manage-box .manage-hint .close .close-icon {
width: 18rpx;
height: 18rpx;
}
.vs-box {
margin-top: -27rpx;
background-color: #ffffff;
position: relative;
}
.vs-box .head-box {
font-weight: 400;
font-size: 27rpx;
color: #000000;
padding-left: 30rpx;
height: 112.5rpx;
}
.vs-box .head-box .dot {
width: 9rpx;
height: 24rpx;
background-color: #ccd003;
border: 1rpx solid #9a9d02;
border-radius: 7.5rpx;
margin-right: 15rpx;
}
.vs-box .select-box .list .item {
width: calc(100vw - 60rpx);
height: initial;
position: relative;
overflow: hidden;
margin: 0 30rpx;
border-top: 1rpx dotted #ebebeb;
}
.vs-box .select-box .list .item .movable-view {
width: calc(100vw + 180rpx);
height: initial;
margin: 0 30rpx;
position: relative;
display: flex;
}
.vs-box .select-box .list .item .content {
width: calc(100vw - 60rpx);
margin-right: 30rpx;
}
.vs-box .select-box .list .item .left {
padding-top: 31.5rpx;
padding-right: 15rpx;
flex: 1;
}
.vs-box .select-box .list .item .left .name {
font-weight: 650;
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
}
.vs-box .select-box .list .item .left .english {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 15rpx;
}
.vs-box .select-box .list .item .left .message {
color: #333333;
font-size: 24rpx;
margin-bottom: 30rpx;
}
.vs-box .select-box .list .item .left .message .icon {
width: 24rpx;
height: 27rpx;
margin-right: 15rpx;
}
.vs-box .select-box .list .item .left .message .line {
color: #d7d7d7;
margin: 0 20rpx;
}
.vs-box .select-box .list .item .left .message .state-text {
height: 33rpx;
background-color: #f0f1ec;
border: 1rpx solid #ebebeb;
border-radius: 9rpx;
font-size: 22.5rpx;
color: #7F7F7F;
padding: 0 7.5rpx;
}
.vs-box .select-box .list .item .btn .icon {
width: 45rpx;
height: 45rpx;
}
.vs-box .select-box .list .item .delete {
width: 150rpx;
background-color: #f95d5d;
font-size: 27rpx;
color: #FFFFFF;
}
.vs-box .quick-box .list {
transition: all 0.3s;
overflow: hidden;
}
.vs-box .quick-box .list.hide {
height: 735rpx;
overflow: hidden;
}
.vs-box .quick-box .movable-area {
width: calc(100vw - 60rpx);
height: initial;
margin: 0 30rpx;
overflow: hidden;
border-radius: 18rpx;
margin-bottom: 30rpx;
}
.vs-box .quick-box .movable-area .item {
width: calc(100vw + 180rpx);
height: initial;
margin: 0 30rpx;
position: relative;
display: flex;
z-index: 1;
}
.vs-box .quick-box .movable-area .item .content {
width: calc(100vw - 60rpx);
background-color: #f6f6f6;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
padding: 34.5rpx 22.5rpx;
justify-content: space-between;
}
.vs-box .quick-box .movable-area .item .content .project-list .project-item {
font-size: 24rpx;
color: #333333;
line-height: 33.75rpx;
}
.vs-box .quick-box .movable-area .item .content .project-list .project-item:not(:last-of-type) {
margin-bottom: 19.5rpx;
}
.vs-box .quick-box .movable-area .item .content .project-list .project-item .icon {
width: 24rpx;
height: 27rpx;
margin-right: 7.5rpx;
}
.vs-box .quick-box .movable-area .item .content .project-list .project-item .arrows {
width: 18rpx;
height: 18rpx;
margin: 0 13.5rpx;
}
.vs-box .quick-box .movable-area .item .content .project-list .project-item .text {
width: 313.5rpx;
}
.vs-box .quick-box .movable-area .item .content .btn {
width: 150rpx;
height: 60rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 172.5rpx;
font-weight: 650;
font-size: 24rpx;
color: #026277;
}
.vs-box .quick-box .movable-area .item .delete {
width: 150rpx;
border-radius: 0 18rpx 18rpx 0;
position: relative;
font-size: 27rpx;
color: #FFFFFF;
}
.vs-box .quick-box .movable-area .item .delete::after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 120%;
height: 100%;
z-index: -1;
background-color: #f95d5d;
border-radius: 18rpx;
width: 150rpx;
}
.vs-box .quick-box .more-btn {
height: 123rpx;
font-size: 24rpx;
color: #555555;
position: relative;
z-index: 1;
margin-top: -30rpx;
background: #ffff;
}
.vs-box .quick-box .more-btn.pack .icon {
transform: rotate(180deg);
}
.vs-box .quick-box .more-btn.pack .mengcheng {
display: none;
}
.vs-box .quick-box .more-btn .icon {
width: 27rpx;
height: 27rpx;
margin-left: 16rpx;
transition: all 0.3s;
}
.vs-box .quick-box .more-btn .mengcheng {
width: calc(100vw - 60rpx);
height: 48rpx;
position: absolute;
top: -48rpx;
}
.vs-box .quick-border {
height: 9rpx;
background-color: #f2f2f2;
}
.vs-box .vs-bottom {
width: 100vw;
height: 150rpx;
background-color: #f6f6f6;
border: 1rpx solid #ebebeb;
position: fixed;
bottom: 0;
left: 0;
padding: 0 22.5rpx;
z-index: 10;
}
.vs-box .vs-bottom .begin-btn {
height: 96rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 172.5rpx;
font-weight: 650;
font-size: 36rpx;
color: #026277;
}
.vs-box .lack-hint {
position: fixed;
left: 30rpx;
bottom: 30rpx;
width: 690rpx;
height: 84rpx;
background-color: #f6f6f6;
border-radius: 9rpx;
font-size: 24rpx;
color: #333333;
padding: 0 15rpx;
}
.vs-box .lack-hint .icon {
width: 24rpx;
height: 24rpx;
margin-right: 15rpx;
}
.no-data {
margin: 0 30rpx 30rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
flex-direction: column;
height: 80vh;
}
.no-data .icon {
width: 120rpx;
height: 141rpx;
margin-bottom: 40.5rpx;
}
.no-data .text {
font-size: 24rpx;
color: #7F7F7F;
line-height: 45rpx;
}
.empty {
background-color: #fff;
color: #7F7F7F;
font-size: 23rpx;
margin: 36rpx 0rpx 0;
flex-direction: column;
height: 60vh;
}
.empty .dot-box .dot {
width: 12rpx;
height: 12rpx;
}
.empty .dot-box .dot:not(:last-of-type) {
margin-right: 8rpx;
}
.empty .empty-icom {
width: 153rpx;
height: 180rpx;
margin-top: 12rpx;
margin-bottom: 30rpx;
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,663 @@
// pages/projectSchoolHomepage/projectSchoolHomepage.js
var miucms = require('../../utils/miucms.js');
const util = require('../../utils/util.js')
const common = require('../../utils/commonMethod')
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
informationState: false, // 授权后可能需要弹出完成信息框 个人背景那些
islogin: false,
isloginBtnState: false,
current: 0,
territoryState: "", // 学科领域弹窗状态
// selectType: "", // '' subject school
id: 0,
briefShow: false, // 学校简介显示状态
selectState: false, // 排序选项 弹窗显示
screenkey: "all", // all subject school
screen: {
name: "",
key: "all", // all subject school
pitch: "all",
},
bezier: {},
hotList: [],
list: [],
page: 1,
count: 0,
briefHeight: 0, // 简介高度
contrastcount: 0,
discipline: [],
universitydepartment: [],
sortObj: {
0: "排名由高到低",
1: "学费由低到高",
2: "学费由高到低",
},
sortIndex: 0, // 排名由高到低 0 学费由低到高 1 学费由高到低 2
isInitFinish: false,
},
/**
* 生命周期函数--监听页面加载
*/
rpx525: 262,
rpx15: 15,
windowWidth: 375,
options: {},
onLoad(options) {
this.rpx525 = util.rpxTopx(525)
this.options = options
// this.data.id = options.id
this.rpx15 = util.rpxTopx(15)
miucms.pageStart(app).then(() => {
const screen_data = app.globalData.screen_data
this.windowWidth = screen_data.windowWidth
this.windowHeight = screen_data.windowHeight || 812
this.setData({
islogin: app.globalData.user.uid > 0 ? true : false,
id: options.id
})
common.xgBasicData(this, app).then(data => {
this.setData({
contrastcount: data.contrastcount || 0,
})
})
this.getinit()
this.getProjectData()
})
},
getinit() {
wx.showLoading({
title: '加载中...',
})
util.wxget("/api/project.university/getInfo", {
id: this.data.id,
}).then(res => {
if (res.code != 200) return
const data = res.data
let hotList = data.hot_projects || []
hotList.forEach(element => {
element['random'] = app.randomString(6)
})
// 将一维数组转换成二维数组,每两个元素为一组
let twoDimensionalArray = [];
for (let i = 0; i < hotList.length; i += 2) {
twoDimensionalArray.push(hotList.slice(i, i + 2));
}
console.log("data", data);
this.setData({
info: data.info,
hotList: twoDimensionalArray,
discipline: data.discipline,
universitydepartment: data.universitydepartment || [],
isInitFinish: true,
})
if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
wx.nextTick(() => this.getBriefHeight())
}).finally(() => {
wx.hideLoading()
})
},
// 获取项目列表
loading: false,
listAll: [], // 所有的数据
screenList: [], // 当前筛选所有数据
getProjectData() {
const screen = this.data.screen
if (this.data.page == 0 || this.loading) return
this.loading = true
util.wxget("/api/project.lists", {
limit: 2000,
page: this.data.page,
sid: this.data.id,
}).then(res => {
if (res.code != 200) return
const data = res.data
let list = data.data || []
const date = new Date()
const month = date.getMonth() + 1
const year = date.getFullYear()
list.forEach(element => {
const semester = element.semester || {}
if (month > semester.month && year + 1 <= semester.year) element['semesterState'] = true
element['tuition_fee_text'] = common.formatNumberWithSpaces(element.tuition_fee)
element['random'] = app.randomString(6)
element['rankk'] = this.convertRankToRankText(element.rank)
})
this.listAll = list
this.screenList = list
this.setData({
count: data.count,
})
this.screenData()
}).finally(() => {
this.loading = false
})
},
convertRankToRankText(rank) {
if (!rank) return 0
if (rank.indexOf('-')) {
const range = rank.split('-');
const start = parseInt(range[0]) * 1;
const end = parseInt(range[1]) * 1;
return start || end || 0
} else return rank
},
// 在 screenList 数据截取要显示的数据
calculateShowList() {
const limit = 20
let screenList = this.screenList
let page = this.data.page
if (page == 0) return
const startIndex = (page - 1) * limit;
const endIndex = startIndex + limit;
let list = screenList.slice(startIndex, endIndex);
this.setData({
list: this.data.list.concat(list),
page: endIndex >= screenList.length ? 0 : page + 1,
})
},
// 筛选数据
screenData() {
const sort = this.data.sortIndex
let screen = this.data.screen
const disciplineid = screen['disciplineid']
const university = screen['university']
let listAll = this.listAll
screen['pitch'] = screen.key
let screenList = this.screenList
let list = []
if (disciplineid > 0) {
screenList = listAll.filter(item => item.disciplineid === disciplineid);
} else if (university) {
screenList = listAll.filter(item => item.department === university);
} else {
screenList = this.listAll
}
if (sort == 0) {
screenList.sort((a, b) => {
// a 排在后面
if (a.rankk == 0) return 1;
// b 排在后面
if (b.rankk == 0) return -1;
return a.rankk - b.rankk
});
} else if (sort == 1) {
// 按学费由低到高排序
screenList.sort((a, b) => {
if (a.tuition_fee == null) return 1;
if (b.tuition_fee == null) return -1;
return a.tuition_fee - b.tuition_fee
});
} else if (sort == 2) {
// 按学费由高到低排序
screenList.sort((a, b) => {
if (a.tuition_fee == null) return 1;
if (b.tuition_fee == null) return -1;
return b.tuition_fee - a.tuition_fee
});
}
this.screenList = screenList
this.setData({
screen,
list: [],
page: 1,
count: this.screenList.length,
})
this.calculateShowList()
},
// 选中 排序
screenIncident(e) {
const sort = e.currentTarget.dataset.sort
this.setData({
list: [],
page: 1,
sortIndex: sort,
selectState: false,
})
this.screenData()
},
// 获取简介的高度
getBriefHeight() {
const query = wx.createSelectorQuery();
query.select('#rich-text').boundingClientRect((rect) => {
let briefHeight = null
if (rect && rect.height) briefHeight = rect.height
this.setData({
briefHeight
})
}).exec();
},
// 切换简介显示
cutBriefShow() {
this.setData({
briefShow: !this.data.briefShow
})
},
// 计算当前所处的页面索引
hotscroll(e) {
if (Math.random() > 0.7) return; // 30% 的概率
const scrollLeft = e.detail.scrollLeft + this.rpx525 / 2
const current = Math.floor(scrollLeft / this.rpx525);
if (this.data.current == current) return;
if (current > this.data.hotList.length - 1) return
this.setData({
current
});
},
// 点击显示 筛选条件框
cutCondition() {
this.setData({
selectState: !this.data.selectState
})
},
// 物品的点击事件
handleClick(e) {
if (!this.data.islogin) {
this.openLoginBtnState()
return
}
const index = e.currentTarget.dataset.index
const i = e.currentTarget.dataset.i
const type = e.currentTarget.dataset.type
const status = e.currentTarget.dataset.status || 0
const id = e.currentTarget.dataset.id
const random = e.currentTarget.dataset.random
if (status == 1) return
const query = this.createSelectorQuery();
query.select('#add' + random).boundingClientRect();
// if (status == 1) return
if (status == 0) {
this.setData({
bezier: {},
})
query.exec((res) => {
const data = res[0]
this.setData({
bezier: {
x: data.left + data.width / 2 - this.rpx15,
y: data.top + data.height / 2 - this.rpx15,
}
})
});
}
let url = "/api/project.contrast/add"
if (status == 1) url = "/api/project.contrast/delete"
util.wxpost(url, {
projectid: id
}).then(res => {
if (res.code != 200) return
const data = res.data
if (type === 'hot') {
const hotList = this.data.hotList
if (hotList[index][i]['contraststatus'] == null) hotList[index][i]['contraststatus'] = {}
hotList[index][i]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
hotList,
})
}
if (type === 'list') {
const list = this.data.list
if (list[index]['contraststatus'] == null) list[index]['contraststatus'] = {}
list[index]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
list,
})
}
this.setData({
contrastcount: data.count,
})
app.globalData.basicData['contrastcount'] = data.count
wx.showToast({
icon: "none",
title: res.message,
})
})
},
// 打开筛选选择框
openselect() {
let screen = this.data.screen
screen['state'] = true
this.setData({
screen,
})
},
// 关闭筛选选择框
closeselect(e) {
const disciplineid = e.detail?.disciplineid || ''
const university = e.detail?.university || ''
const label = e.detail?.label || ''
let screen = this.data.screen
screen['state'] = false
// 没有选择
if (disciplineid == "" && university == "") {
screen['key'] = screen['pitch']
this.setData({
screen,
})
} else {
screen['disciplineid'] = disciplineid
screen['name'] = label || university
screen['university'] = university
this.setData({
screen,
list: [],
page: 1,
}, () => {
this.screenData()
})
}
},
// 点击选择 中间 的 筛选
selectScreen(e) {
const type = e.currentTarget.dataset.type
let screen = this.data.screen
screen['key'] = type
if (type == 'all') {
screen['disciplineid'] = ''
screen['universityid'] = ''
screen['list'] = []
this.setData({
screen,
list: [],
page: 1,
sortIndex: 0,
})
this.screenData()
return
}
if (type == 'subject') {
screen['list'] = this.data.discipline
screen['universityid'] = ''
} else if (type == 'school') {
screen['disciplineid'] = ''
screen['list'] = this.data.universitydepartment
}
screen['state'] = true
this.setData({
screen,
sortIndex: 1,
})
},
// 打开 授权按钮
openLoginBtnState() {
this.setData({
isloginBtnState: true,
})
},
// 关闭授权登录事件
popClose() {
this.setData({
isloginBtnState: !this.data.isloginBtnState
})
},
userClickLogin(e) {
let data = e.detail.data
this.setData({
islogin: true,
isloginBtnState: false,
informationState: data.regdatastep == 'success' ? false : true,
page: 1,
list: [],
})
this.onLoad(this.options)
},
// 子组件传值 修改 完善信息组件的状态
revampInformationState() {
this.setData({
informationState: false
})
},
// 点击跳转详情
goDetails(e) {
const uniqid = e.currentTarget.dataset.uniqid
common.goPage(`/pages/projectDetails/projectDetails?uniqid=${ uniqid }`)
},
closeMoreSelect() {
const list = this.data.list
list.forEach(element => {
element['moreState'] = false
})
this.setData({
list,
})
},
openMoreSelect(e) {
const index = e.currentTarget.dataset.index || 0
const list = this.data.list
list.forEach(element => {
element['moreState'] = false
})
list[index]['moreState'] = !list[index]['moreState']
this.setData({
list,
})
},
addProject(e) {
const index = e.currentTarget.dataset.index
const id = e.currentTarget.dataset.id
let url = "/api/project.contrast/add"
util.wxpost(url, {
projectid: id
}).then(res => {
if (res.code != 200) return
const data = res.data
const list = this.data.list
if (list[index]['contraststatus'] == null) list[index]['contraststatus'] = {}
list[index]['contraststatus'] = {
status: 1,
ismanage: 1,
}
this.setData({
list,
contrastcount: data.count,
})
app.globalData.basicData['contrastcount'] = data.count
common.toast(res.message)
})
},
// 点击 跳转 公共方法
goPage(e) {
const url = e.currentTarget.dataset.url
common.goPage(url)
},
indexSidebar: null,
windowHeight: 812,
onPageScroll(e) {
const scrollTop = e.scrollTop
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()
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
this.setData({
info: {},
hotList: [],
page: 1,
list: [],
})
this.getinit()
this.getProjectData()
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
this.calculateShowList()
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
},
onShareTimeline() {
util.statistics({
name: "share-timeline"
})
return {
title: "【寄托港校项目库】- " + this.data.info.name,
}
},
})

View File

@ -0,0 +1,10 @@
{
"usingComponents": {
"header-nav": "/component/headerNav/headerNav",
"xg-bottom": "/component/xg-bottom/xg-bottom",
"territory-select": "/component/territorySelect/territorySelect",
"go-login": "/component/goLogin/goLogin",
"perfect-information": "/component/perfectInformation/perfectInformation",
"index-sidebar": "/component/indexSidebar/indexSidebar"
}
}

View File

@ -0,0 +1,637 @@
/* pages/schoolHomepage/schoolHomepage.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.container {
min-height: 100vh;
background-color: rgba(245, 245, 245, 1);
padding-bottom: 180rpx;
}
.header {
background-color: rgba(251, 251, 251, 1);
padding-bottom: 24rpx;
border-bottom: 1rpx solid #ebebeb;
margin-bottom: 61.5rpx;
.info {
padding: 36rpx 36rpx 42rpx;
.avatar {
width: 180rpx;
height: 180rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 15rpx;
margin-right: 30rpx;
.img {
width: 106.5rpx;
height: 120rpx;
}
}
.right {
flex-direction: column;
.name {
font-weight: 650;
font-size: 48rpx;
color: #000000;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
margin-bottom: 9rpx;
}
.english {
font-size: 24rpx;
color: #333333;
margin-bottom: 30rpx;
}
.ranking-box {
height: 54rpx;
background-color: rgba(249, 231, 237, 1);
border-radius: 9rpx;
color: #933737;
font-size: 27rpx;
padding-left: 15rpx;
width: fit-content;
.sum {
margin-left: 15rpx;
font-family: 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 30rpx;
color: #FFFFFF;
height: 54rpx;
line-height: 54rpx;
background-color: rgba(249, 93, 93, 1);
border-radius: 0 9rpx 9rpx 0;
padding: 0 10.5rpx;
}
}
.world {
.head {
width: 100%;
height: 33rpx;
position: relative;
z-index: 1;
margin-bottom: 10.5rpx;
&::after {
content: "";
position: absolute;
top: 50%;
// transform: translateY(-50%);
width: 100%;
height: 1rpx;
z-index: -1;
border-bottom: 1rpx solid #ebebeb;
box-sizing: border-box;
}
.icon {
width: 163.5rpx;
background-color: rgba(251, 251, 251, 1);
.img {
width: 96rpx;
height: 33rpx;
display: block;
}
}
}
.list {
justify-content: space-between;
padding-bottom: 25rpx;
border-bottom: 1rpx solid #ebebeb;
.item {
flex: 1;
flex-direction: column;
align-items: center;
display: flex;
.quantity {
text-align: center;
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 27rpx;
color: #000000;
margin-bottom: 18rpx;
}
.ranking-name {
text-align: center;
font-family: 'HelveticaNeue', 'Helvetica Neue', sans-serif;
font-weight: 400;
font-size: 24rpx;
color: #555555;
width: fit-content;
position: relative;
line-height: 24rpx;
.ranking-icon {
width: 12rpx;
height: 12rpx;
position: absolute;
bottom: 0;
right: -12rpx;
transform: rotate(270deg);
}
}
}
}
}
}
}
.brief {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-size: 22.5rpx;
color: #7F7F7F;
line-height: 42rpx;
padding: 0 36rpx;
display: block;
transition: all .3s;
white-space: pre-line;
word-break: break-word;
transition: all .3s;
overflow: hidden;
&.twoLines {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
&#rich-text {
position: absolute;
z-index: -1;
bottom: 0;
color: transparent;
// background-color: red;
}
}
.brief-more {
padding: 21rpx 0;
.icon {
width: 27rpx;
height: 27rpx;
transition: all .3s;
&.spin {
transform: rotate(180deg);
}
}
}
}
.item-header {
padding: 0 22.5rpx;
color: #000;
font-weight: 650;
font-size: 30rpx;
margin-bottom: 30rpx;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
.greenDot {
margin-right: 18rpx;
width: 11rpx;
height: 24rpx;
background-color: #ccd003;
border: 1rpx solid #9a9d02;
border-radius: 10rpx;
}
}
.hot {
margin-left: 22.5rpx;
margin-bottom: 60rpx;
.hot-box {
margin-bottom: 18rpx;
white-space: nowrap;
.line {
width: 525rpx;
margin-right: 15rpx;
display: inline-block;
.item {
width: 525rpx;
height: 135rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
// padding-top: 30rpx;
padding: 0 30rpx;
justify-content: space-between;
&:first-of-type {
margin-bottom: 15rpx;
}
.name {
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
width: 380rpx;
}
.english {
font-size: 21rpx;
color: #7F7F7F;
width: 380rpx;
}
}
}
}
.indication {
display: flex;
justify-content: center;
.item {
width: 15rpx;
height: 6rpx;
background-color: rgba(215, 215, 215, 1);
border-radius: 30rpx;
margin-right: 6rpx;
&.pitch {
background-color: rgba(250, 107, 17, 1);
}
}
}
}
.join {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #026277;
.add {
width: 42rpx;
height: 42rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 30rpx;
// margin-bottom: 6rpx;
.icon {
width: 18rpx;
height: 18rpx;
}
}
}
.cancel {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #7F7F7F;
text-align: center;
.cross {
width: 42rpx;
height: 42rpx;
background-color: rgba(246, 246, 246, 1);
border: 1rpx solid rgba(235, 235, 235, 1);
border-radius: 30rpx;
// margin-bottom: 6rpx;
.icon {
width: 22.5rpx;
height: 18rpx;
}
}
}
.screen {
font-size: 24rpx;
color: #555555;
margin: 0 22.5rpx 15rpx;
justify-content: space-between;
.left {
height: 84rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 237rpx;
margin-right: 15rpx;
padding: 0 9rpx;
.item {
height: 66rpx;
line-height: 66rpx;
border-radius: 237rpx;
&.pitch {
color: #fff;
background-color: rgba(4, 176, 213, 1);
}
}
}
.tuition {
width: 256.5rpx;
height: 84rpx;
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 237rpx;
color: #000;
position: relative;
.sort-icon {
width: 30rpx;
height: 30rpx;
margin-left: 8rpx;
}
.select-mask {
width: 100%;
height: 100%;
// background-color: #000;
position: fixed;
top: 0;
left: 0;
z-index: 100;
}
.select-box {
position: absolute;
top: 100%;
left: 0;
width: 100%;
border-radius: 15rpx;
overflow: hidden;
z-index: 100;
border: 1rpx solid transparent;
&.show {
border: 1rpx solid rgba(242, 242, 242, 1);
transition: all .3s;
.item {
height: 84rpx;
}
}
.item {
height: 0;
overflow: hidden;
transition: all .3s;
background-color: #fff;
&.pitch {
font-weight: 650;
}
}
}
}
}
.all-projects {
background-color: rgba(255, 255, 255, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
margin: 0 30rpx;
padding-top: 30rpx;
.pitch {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
.text {
line-height: 43.5rpx;
position: relative;
padding-bottom: 37.5rpx;
&::after {
content: "";
position: absolute;
top: 43.5rpx;
width: 100%;
height: 7.5rpx;
display: block;
background-color: rgba(207, 247, 255, 1);
border-radius: 58.5rpx;
}
.icon {
width: 18rpx;
height: 10.5rpx;
margin-left: 13.5rpx;
}
}
}
.total {
font-size: 24rpx;
color: #7F7F7F;
margin: 0 30rpx 30rpx;
}
.item {
background-color: rgba(251, 251, 251, 1);
border: 1rpx solid rgba(242, 242, 242, 1);
border-radius: 18rpx;
margin: 0 30rpx 34.5rpx;
padding: 30rpx;
position: relative;
// overflow: hidden;
// .angle {
// width: 48rpx;
// height: 48rpx;
// position: absolute;
// top: 0;
// right: 0;
// transform: rotate(-90deg);
// border-radius: 0 0 18rpx 0;
// }
.title {
align-items: flex-start;
}
.name {
font-weight: 650;
font-size: 33rpx;
color: #000000;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
margin-right: 15rpx;
word-break: break-all;
}
.more {
width: 42rpx;
height: 42rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 30rpx;
position: relative;
.icon {
width: 27rpx;
height: 12rpx;
}
.more-select-mask {
position: fixed;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
z-index: 1;
}
.more-select {
position: absolute;
top: 55rpx;
right: 0;
width: 450rpx;
height: 183rpx;
background-color: rgba(255, 255, 255, 1);
border-radius: 12rpx;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.180392156862745);
flex-direction: column;
padding: 27rpx 30rpx 0;
z-index: 1;
.more-select-title {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 34.5rpx;
.dot {
width: 12rpx;
height: 12rpx;
border: 1rpx solid rgb(204, 208, 3);
border-radius: 50%;
background-color: rgb(246, 246, 189);
margin-right: 12rpx;
}
}
.more-select-btn {
width: 240rpx;
height: 60rpx;
background-color: rgba(207, 247, 255, 1);
border: 1rpx solid rgba(186, 222, 230, 1);
border-radius: 237rpx;
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.0705882352941176);
font-size: 24rpx;
color: #026277;
margin: 0 auto;
.more-select-icon {
width: 24rpx;
height: 24rpx;
margin-right: 9rpx;
}
}
}
}
.english {
font-size: 21rpx;
color: #7F7F7F;
margin-top: 12rpx;
word-break: break-all;
}
.introduce {
font-size: 25.5rpx;
color: #555555;
margin-top: 15rpx;
flex-wrap: wrap;
.line {
color: #D7D7D7;
margin: 0 12rpx;
}
.quantity {
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
color: #000000;
margin-left: 12rpx;
}
}
.word {
font-size: 24rpx;
color: #858585;
padding: 10.5rpx 15rpx;
background-color: rgba(246, 246, 246, 1);
border-radius: 7.5rpx;
margin-top: 15rpx;
word-break: break-all;
}
.tag {
flex-wrap: wrap;
margin-top: 25rpx;
.tag-item {
font-size: 22.5rpx;
color: #858585;
padding: 0 10.5rpx;
border: 1rpx solid #aaaaaa;
border-radius: 9rpx;
width: fit-content;
margin-right: 15rpx;
margin-bottom: 10rpx;
word-break: break-all;
height: 36rpx;
line-height: 36rpx;
&.admissions {
background-color: rgba(115, 209, 229, 1);
border: none;
color: #fff;
}
&.gray {
border: none;
color: #fff;
background-color: rgba(51, 51, 51, 1);
&.semester {
background-color: #f95d5d;
}
}
}
}
}
.end {
font-size: 19.5rpx;
color: #D7D7D7;
text-align: center;
padding: 15rpx 0 45rpx;
}
}
.index-sidebar {
position: relative;
z-index: 99;
}

View File

@ -0,0 +1,172 @@
<!--pages/projectSchoolHomepage/projectSchoolHomepage.wxml-->
<header-nav class="header-nav" bgcolor="#fbfbfb"></header-nav>
<view class="container">
<view class="header">
<view class="info flexflex">
<view class="avatar flexcenter">
<image class="img" src="{{ info.logo }}" mode="widthFix"></image>
</view>
<view class="right flex1 flexflex">
<view class="name">{{ info.name }}</view>
<view class="english">{{ info.enname }}</view>
<view wx:if="{{ info.ranks.length != 0 }}" class="world" bind:tap="goPage" data-url="/pages/projectList/projectList">
<view class="head flexcenter">
<view class="icon flexcenter">
<image class="img" src="https://app.gter.net/image/miniApp/offer/world-ranking-icon.png" mode="widthFix"></image>
</view>
</view>
<view class="list flexacenter">
<view class="item" wx:for="{{ info.ranks }}" wx:key="index">
<view class="quantity">{{ item.ranktext }}</view>
<view class="ranking-name">
{{ item.mechanism }}
<image wx:if="{{ item.mechanism == 'QS' }}" class="ranking-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/triangle-QS.svg"></image>
<image wx:if="{{ item.mechanism == '泰晤士' }}" class="ranking-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/triangle-TIMES.svg"></image>
<image wx:if="{{ item.mechanism == 'USNEWS' }}" class="ranking-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/triangle-US-News.svg"></image>
<image wx:if="{{ item.mechanism == '软科' }}" class="ranking-icon" mode="widthFix" src="https://app.gter.net/image/miniApp/offer/triangle-Soft.svg"></image>
</view>
</view>
</view>
</view>
<!-- <view wx:else class="ranking-box flexacenter">
QS世界综合排名 [2024]
<view class="sum">16</view>
</view> -->
</view>
</view>
<rich-text id="rich-text" class="brief" nodes="{{ info.message }}"></rich-text>
<rich-text class="brief {{ !briefShow ? 'twoLines' : '' }}" style="height: {{ briefShow ? briefHeight : '42' }}px;" nodes="{{ info.message }}"></rich-text>
<view class="brief-more flexcenter" bind:tap="cutBriefShow">
<image class="icon {{ briefShow ? 'spin' : '' }}" src="https://app.gter.net/image/miniApp/project/u1194.png"></image>
</view>
</view>
<block wx:if="{{ hotList.length !== 0}}">
<view class="item-header flexacenter">
<view class="greenDot"></view>
热门项目
</view>
<view class="hot">
<scroll-view class="hot-box" scroll-x="{{ true }}" bindscroll="hotscroll">
<view class="line" wx:for="{{ hotList }}" wx:key="index">
<view class="item flexacenter" wx:for="{{ item }}" wx:for-index="i" wx:key="i" bind:tap="goDetails" data-uniqid="{{ item.uniqid }}">
<view class="box">
<view class="name one-line-display">{{ item.name_zh }}</view>
<view class="english one-line-display">{{ item.name_en }}</view>
</view>
<!-- <view> -->
<view wx:if="{{ item.contraststatus == 0 }}" class="join flexflex" catch:tap="handleClick" data-index="{{ item.random }}" data-type="hot" data-random="{{ item.random }}" data-id="{{ item.id }}" data-index="{{ index }}" data-i="{{ i }}" data-status="{{ item.contraststatus }}">
<view class="add flexcenter" id="add{{ item.random }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/plus-icon.svg" mode="widthFix"></image>
</view>
</view>
<view wx:else class="cancel flexflex">
<view class="cross flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg" mode="widthFix"></image>
</view>
</view>
<!-- </view> -->
</view>
</view>
</scroll-view>
<view class="indication flexacenter">
<view class="item {{ current == index ? 'pitch' : '' }}" wx:for="{{ hotList.length }}" wx:key="index"></view>
</view>
</view>
</block>
<view class="item-header flexacenter">
<view class="greenDot"></view>
所有项目
</view>
<view class="screen flexacenter">
<view class="left flexacenter flex1">
<view class="item flex1 flexcenter {{ screen.pitch == 'all' ? 'pitch' : '' }}" bind:tap="selectScreen" data-type="all">全部项目</view>
<view class="item flex1 flexcenter {{ screen.pitch == 'subject' ? 'pitch' : '' }}" bind:tap="selectScreen" data-type="subject">按学科</view>
<view class="item flex1 flexcenter {{ screen.pitch == 'school' ? 'pitch' : '' }}" bind:tap="selectScreen" data-type="school">按学院</view>
</view>
<view class="tuition flexcenter" bind:tap="cutCondition">
{{ sortObj[sortIndex] }}
<image class="sort-icon" src="https://app.gter.net/image/miniApp/offer/sort-icon.png" mode="widthFix"></image>
<view wx:if="{{ selectState }}" class="select-mask"></view>
<view class="select-box {{ selectState ? 'show' : '' }}" catch:tap="return">
<view catch:tap="screenIncident" data-sort="0" wx:if="{{ screen.key == 'all' }}" class="item flexcenter {{ sortIndex == 0 ? 'pitch' : '' }}">排名由高到低</view>
<view catch:tap="screenIncident" data-sort="1" class="item flexcenter {{ sortIndex == 1 ? 'pitch' : '' }}">学费由低到高</view>
<view catch:tap="screenIncident" data-sort="2" class="item flexcenter {{ sortIndex == 2 ? 'pitch' : '' }}">学费由高到低</view>
</view>
</view>
</view>
<view class="all-projects">
<view wx:if="{{ screen.pitch !== 'all' }}" class="pitch flexcenter" bind:tap="openselect">
<view class="text">
{{ screen.name }}
<image class="icon" src="https://app.gter.net/image/miniApp/offer/triangle-red.svg" mode="widthFix"></image>
</view>
</view>
<view class="total">共 {{ count }} 个项目</view>
<view class="item" wx:for="{{ list }}" wx:key="index" bind:tap="goDetails" data-uniqid="{{ item.uniqid }}">
<!-- <image wx:if="{{ item.admissionsproject }}" class="angle" src="https://app.gter.net/image/miniApp/offer/admission-angle.svg"></image> -->
<view class="title flexflex">
<view class="name flex1">{{ item.name_zh }}</view>
<view>
<view wx:if="{{ item.contraststatus.status == 1 && item.contraststatus.ismanage == 1 }}" class="cancel flexflex">
<view class="cross flexcenter">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/tick-grey.svg"></image>
</view>
</view>
<view wx:elif="{{ item.contraststatus.status == 0 || item.contraststatus.ismanage == 0 }}" class="more flexcenter" catch:tap="openMoreSelect" data-index="{{ index }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/dot-dot-dot-black.png"></image>
<view wx:if="{{ item.moreState }}" class="more-select-mask" catch:tap="closeMoreSelect"></view>
<view wx:if="{{ item.moreState }}" class="more-select" catch:tap="return">
<view class="more-select-title flexacenter">
<view class="dot"></view>
<block wx:if="{{ item.contraststatus.status == 1 }}">该项目已加入对比单,未加入项目管理</block>
<block wx:else>该项目已加入项目管理,未加入对比单</block>
</view>
<view class="more-select-btn flexcenter" catch:tap="addProject" data-index="{{ index }}" data-id="{{ item.id }}">
<image class="more-select-icon" src="https://app.gter.net/image/miniApp/offer/add-deep-blue.svg"></image>加入{{ item.contraststatus.status == 1 ? '项目管理' : '对比单' }}
</view>
</view>
</view>
<view wx:else class="join flexflex" catch:tap="handleClick" data-index="{{ item.random }}" data-type="list" data-random="{{ item.random }}" data-id="{{ item.id }}" data-index="{{ index }}" data-status="{{ item.contraststatus }}">
<view class="add flexcenter" id="add{{ item.random }}">
<image class="icon" src="https://app.gter.net/image/miniApp/offer/plus-icon.svg"></image>
</view>
</view>
</view>
</view>
<view class="english">{{ item.name_en }}</view>
<view class="introduce flexacenter" wx:if="{{ item.department || item.rank || item.tuition_fee_text }}">
{{ item.department }}
<view class="flexacenter" wx:if="{{ item.rank }}">
<view class="line">|</view> 专业排名 <vie class="quantity">{{ item.rank }}</vie>
</view>
<view class="flexacenter" wx:if="{{ item.tuition_fee }}">
<view class="line">|</view> 学费HK$ <vie class="quantity">{{ item.tuition_fee_text }}</vie>
</view>
</view>
<view class="word" wx:if="{{ item.distinctive }}">{{ item.distinctive }}</view>
<view class="tag flexflex">
<view class="tag-item admissions" wx:if="{{ item.admissionsproject }}">招生官项目</view>
<view class="tag-item gray {{ item.semesterState ? 'semester' : '' }}">{{ item.semester.text }}</view>
<view class="tag-item" wx:for="{{ item.tags }}" wx:key="index">{{ item }}</view>
</view>
</view>
<view class="end" wx:if="{{ page == 0 && list.length != 0 }}">- End -</view>
</view>
<xg-bottom type="school" bezier="{{ bezier }}" amount="{{ contrastcount }}" bindopenLoginBtnState="openLoginBtnState" islogin="{{ islogin }}" sid="{{ id }}"></xg-bottom>
<!-- 学科领域 -->
<territory-select wx:if="{{ screen.state }}" type="{{ screen.key }}" list="{{ screen.list }}" bindcloseselect="closeselect"></territory-select>
<go-login wx:if="{{ isloginBtnState }}" islogin="{{ islogin }}" binduserClickLogin="userClickLogin" bindpopClose="popClose"></go-login>
<perfect-information wx:if="{{ informationState }}" bindrevampInformationState="revampInformationState"></perfect-information>
</view>
<index-sidebar id="index-sidebar" class="index-sidebar" sidebarType="xg" isInitFinish="{{ isInitFinish }}" bind:openLogin="openLoginBtnState" islogin="{{ islogin }}"></index-sidebar>

View File

@ -0,0 +1,529 @@
/* pages/schoolHomepage/schoolHomepage.wxss */
view {
box-sizing: border-box;
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
}
.container {
min-height: 100vh;
background-color: #f5f5f5;
padding-bottom: 180rpx;
}
.header {
background-color: #fbfbfb;
padding-bottom: 24rpx;
border-bottom: 1rpx solid #ebebeb;
margin-bottom: 61.5rpx;
}
.header .info {
padding: 36rpx 36rpx 42rpx;
}
.header .info .avatar {
width: 180rpx;
height: 180rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 15rpx;
margin-right: 30rpx;
}
.header .info .avatar .img {
width: 106.5rpx;
height: 120rpx;
}
.header .info .right {
flex-direction: column;
}
.header .info .right .name {
font-weight: 650;
font-size: 48rpx;
color: #000000;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
margin-bottom: 9rpx;
}
.header .info .right .english {
font-size: 24rpx;
color: #333333;
margin-bottom: 30rpx;
}
.header .info .right .ranking-box {
height: 54rpx;
background-color: #f9e7ed;
border-radius: 9rpx;
color: #933737;
font-size: 27rpx;
padding-left: 15rpx;
width: fit-content;
}
.header .info .right .ranking-box .sum {
margin-left: 15rpx;
font-family: 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 30rpx;
color: #FFFFFF;
height: 54rpx;
line-height: 54rpx;
background-color: #f95d5d;
border-radius: 0 9rpx 9rpx 0;
padding: 0 10.5rpx;
}
.header .info .right .world .head {
width: 100%;
height: 33rpx;
position: relative;
z-index: 1;
margin-bottom: 10.5rpx;
}
.header .info .right .world .head::after {
content: "";
position: absolute;
top: 50%;
width: 100%;
height: 1rpx;
z-index: -1;
border-bottom: 1rpx solid #ebebeb;
box-sizing: border-box;
}
.header .info .right .world .head .icon {
width: 163.5rpx;
background-color: #fbfbfb;
}
.header .info .right .world .head .icon .img {
width: 96rpx;
height: 33rpx;
display: block;
}
.header .info .right .world .list {
justify-content: space-between;
padding-bottom: 25rpx;
border-bottom: 1rpx solid #ebebeb;
}
.header .info .right .world .list .item {
flex: 1;
flex-direction: column;
align-items: center;
display: flex;
}
.header .info .right .world .list .item .quantity {
text-align: center;
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
font-size: 27rpx;
color: #000000;
margin-bottom: 18rpx;
}
.header .info .right .world .list .item .ranking-name {
text-align: center;
font-family: 'HelveticaNeue', 'Helvetica Neue', sans-serif;
font-weight: 400;
font-size: 24rpx;
color: #555555;
width: fit-content;
position: relative;
line-height: 24rpx;
}
.header .info .right .world .list .item .ranking-name .ranking-icon {
width: 12rpx;
height: 12rpx;
position: absolute;
bottom: 0;
right: -12rpx;
transform: rotate(270deg);
}
.header .brief {
font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
font-size: 22.5rpx;
color: #7F7F7F;
line-height: 42rpx;
padding: 0 36rpx;
display: block;
white-space: pre-line;
word-break: break-word;
transition: all 0.3s;
overflow: hidden;
}
.header .brief.twoLines {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.header .brief#rich-text {
position: absolute;
z-index: -1;
bottom: 0;
color: transparent;
}
.header .brief-more {
padding: 21rpx 0;
}
.header .brief-more .icon {
width: 27rpx;
height: 27rpx;
transition: all 0.3s;
}
.header .brief-more .icon.spin {
transform: rotate(180deg);
}
.item-header {
padding: 0 22.5rpx;
color: #000;
font-weight: 650;
font-size: 30rpx;
margin-bottom: 30rpx;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
}
.item-header .greenDot {
margin-right: 18rpx;
width: 11rpx;
height: 24rpx;
background-color: #ccd003;
border: 1rpx solid #9a9d02;
border-radius: 10rpx;
}
.hot {
margin-left: 22.5rpx;
margin-bottom: 60rpx;
}
.hot .hot-box {
margin-bottom: 18rpx;
white-space: nowrap;
}
.hot .hot-box .line {
width: 525rpx;
margin-right: 15rpx;
display: inline-block;
}
.hot .hot-box .line .item {
width: 525rpx;
height: 135rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
padding: 0 30rpx;
justify-content: space-between;
}
.hot .hot-box .line .item:first-of-type {
margin-bottom: 15rpx;
}
.hot .hot-box .line .item .name {
font-size: 27rpx;
color: #000000;
margin-bottom: 6rpx;
width: 380rpx;
}
.hot .hot-box .line .item .english {
font-size: 21rpx;
color: #7F7F7F;
width: 380rpx;
}
.hot .indication {
display: flex;
justify-content: center;
}
.hot .indication .item {
width: 15rpx;
height: 6rpx;
background-color: #d7d7d7;
border-radius: 30rpx;
margin-right: 6rpx;
}
.hot .indication .item.pitch {
background-color: #fa6b11;
}
.join {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #026277;
}
.join .add {
width: 42rpx;
height: 42rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 30rpx;
}
.join .add .icon {
width: 18rpx;
height: 18rpx;
}
.cancel {
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 21rpx;
color: #7F7F7F;
text-align: center;
}
.cancel .cross {
width: 42rpx;
height: 42rpx;
background-color: #f6f6f6;
border: 1rpx solid #ebebeb;
border-radius: 30rpx;
}
.cancel .cross .icon {
width: 22.5rpx;
height: 18rpx;
}
.screen {
font-size: 24rpx;
color: #555555;
margin: 0 22.5rpx 15rpx;
justify-content: space-between;
}
.screen .left {
height: 84rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 237rpx;
margin-right: 15rpx;
padding: 0 9rpx;
}
.screen .left .item {
height: 66rpx;
line-height: 66rpx;
border-radius: 237rpx;
}
.screen .left .item.pitch {
color: #fff;
background-color: #04b0d5;
}
.screen .tuition {
width: 256.5rpx;
height: 84rpx;
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 237rpx;
color: #000;
position: relative;
}
.screen .tuition .sort-icon {
width: 30rpx;
height: 30rpx;
margin-left: 8rpx;
}
.screen .tuition .select-mask {
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
z-index: 100;
}
.screen .tuition .select-box {
position: absolute;
top: 100%;
left: 0;
width: 100%;
border-radius: 15rpx;
overflow: hidden;
z-index: 100;
border: 1rpx solid transparent;
}
.screen .tuition .select-box.show {
border: 1rpx solid #f2f2f2;
transition: all 0.3s;
}
.screen .tuition .select-box.show .item {
height: 84rpx;
}
.screen .tuition .select-box .item {
height: 0;
overflow: hidden;
transition: all 0.3s;
background-color: #fff;
}
.screen .tuition .select-box .item.pitch {
font-weight: 650;
}
.all-projects {
background-color: #ffffff;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
margin: 0 30rpx;
padding-top: 30rpx;
}
.all-projects .pitch {
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
font-weight: 650;
font-size: 27rpx;
color: #000000;
}
.all-projects .pitch .text {
line-height: 43.5rpx;
position: relative;
padding-bottom: 37.5rpx;
}
.all-projects .pitch .text::after {
content: "";
position: absolute;
top: 43.5rpx;
width: 100%;
height: 7.5rpx;
display: block;
background-color: #cff7ff;
border-radius: 58.5rpx;
}
.all-projects .pitch .text .icon {
width: 18rpx;
height: 10.5rpx;
margin-left: 13.5rpx;
}
.all-projects .total {
font-size: 24rpx;
color: #7F7F7F;
margin: 0 30rpx 30rpx;
}
.all-projects .item {
background-color: #fbfbfb;
border: 1rpx solid #f2f2f2;
border-radius: 18rpx;
margin: 0 30rpx 34.5rpx;
padding: 30rpx;
position: relative;
}
.all-projects .item .title {
align-items: flex-start;
}
.all-projects .item .name {
font-weight: 650;
font-size: 33rpx;
color: #000000;
font-family: 'PingFangSC-Semibold', 'PingFang SC Semibold', 'PingFang SC', sans-serif;
margin-right: 15rpx;
word-break: break-all;
}
.all-projects .item .more {
width: 42rpx;
height: 42rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 30rpx;
position: relative;
}
.all-projects .item .more .icon {
width: 27rpx;
height: 12rpx;
}
.all-projects .item .more .more-select-mask {
position: fixed;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
z-index: 1;
}
.all-projects .item .more .more-select {
position: absolute;
top: 55rpx;
right: 0;
width: 450rpx;
height: 183rpx;
background-color: #ffffff;
border-radius: 12rpx;
box-shadow: 0 0 7.5rpx rgba(0, 0, 0, 0.18039216);
flex-direction: column;
padding: 27rpx 30rpx 0;
z-index: 1;
}
.all-projects .item .more .more-select .more-select-title {
font-size: 21rpx;
color: #7F7F7F;
margin-bottom: 34.5rpx;
}
.all-projects .item .more .more-select .more-select-title .dot {
width: 12rpx;
height: 12rpx;
border: 1rpx solid #ccd003;
border-radius: 50%;
background-color: #f6f6bd;
margin-right: 12rpx;
}
.all-projects .item .more .more-select .more-select-btn {
width: 240rpx;
height: 60rpx;
background-color: #cff7ff;
border: 1rpx solid #badee6;
border-radius: 237rpx;
box-shadow: 0 0 4.5rpx rgba(0, 0, 0, 0.07058824);
font-size: 24rpx;
color: #026277;
margin: 0 auto;
}
.all-projects .item .more .more-select .more-select-btn .more-select-icon {
width: 24rpx;
height: 24rpx;
margin-right: 9rpx;
}
.all-projects .item .english {
font-size: 21rpx;
color: #7F7F7F;
margin-top: 12rpx;
word-break: break-all;
}
.all-projects .item .introduce {
font-size: 25.5rpx;
color: #555555;
margin-top: 15rpx;
flex-wrap: wrap;
}
.all-projects .item .introduce .line {
color: #D7D7D7;
margin: 0 12rpx;
}
.all-projects .item .introduce .quantity {
font-family: 'Arial', 'Arial-Black', 'Arial Black', sans-serif;
font-weight: 900;
color: #000000;
margin-left: 12rpx;
}
.all-projects .item .word {
font-size: 24rpx;
color: #858585;
padding: 10.5rpx 15rpx;
background-color: #f6f6f6;
border-radius: 7.5rpx;
margin-top: 15rpx;
word-break: break-all;
}
.all-projects .item .tag {
flex-wrap: wrap;
margin-top: 25rpx;
}
.all-projects .item .tag .tag-item {
font-size: 22.5rpx;
color: #858585;
padding: 0 10.5rpx;
border: 1rpx solid #aaaaaa;
border-radius: 9rpx;
width: fit-content;
margin-right: 15rpx;
margin-bottom: 10rpx;
word-break: break-all;
height: 36rpx;
line-height: 36rpx;
}
.all-projects .item .tag .tag-item.admissions {
background-color: #73d1e5;
border: none;
color: #fff;
}
.all-projects .item .tag .tag-item.gray {
border: none;
color: #fff;
background-color: #333333;
}
.all-projects .item .tag .tag-item.gray.semester {
background-color: #f95d5d;
}
.all-projects .end {
font-size: 19.5rpx;
color: #D7D7D7;
text-align: center;
padding: 15rpx 0 45rpx;
}
.index-sidebar {
position: relative;
z-index: 99;
}

Some files were not shown because too many files have changed in this diff Show More