diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index bb010f6..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: MP CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [10.x] - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - - name: Install Dependencies - run: npm i - - # 从 secrets.UPLOAD_PRIVATE_KEY 生成私钥文件 - # see Project/Settings/Secrets - - name: Generate private key for upload - run: echo "$UPLOAD_PRIVATE_KEY" > private.key - env: - UPLOAD_PRIVATE_KEY: ${{ secrets.UPLOAD_PRIVATE_KEY }} - # 上传代码 - - name: Upload to WeChat - run: npx mp-ci upload ./ --pkp=./private.key diff --git a/LICENSE b/LICENSE index 0ad25db..dbbe355 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -658,4 +658,4 @@ specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see -. +. diff --git a/README.md b/README.md index 9c7f610..4d301e2 100644 --- a/README.md +++ b/README.md @@ -2,82 +2,77 @@ 贝壳小盒子 微信小程序 -[![OSCS Status](https://www.oscs1024.com/platform/badge/Airmole/ShellBox.svg?size=small)](https://www.oscs1024.com/project/Airmole/ShellBox?ref=badge_small) [![Star](https://img.shields.io/badge/Star-Airmole-brightgreen.svg)](https://github.com/Airmole/ShellBox/stargazers) [![Download](https://img.shields.io/badge/download-.zip-brightgreen.svg)](https://github.com/Airmole/ShellBox/archive/master.zip) -[![last commit](https://img.shields.io/badge/last%20commit-2021--10--08-green.svg)](https://github.com/Airmole/ShellBox/commits/master) +[![last commit](https://img.shields.io/badge/last%20commit-2019--10--12-green.svg)](https://github.com/Airmole/ShellBox/commits/master) +[![https://blog.airmole.cn](https://img.shields.io/badge/Blog-Airmole-green.svg)](https://blog.airmole.cn) ## 线上版本体验 - +[![miniprogram.th.jpg](http://www.z4a.net/images/2018/05/04/miniprogram.th.jpg)](小程序体验码) + +``` +测试体验账号 + +学号:000000000 + +密码:test +``` -> 4.0版本起使用 uniapp 重新开发,见项目 [shellbox-uniapp](https://github.com/Airmole/shellbox-uniapp) ## 截图 -[![-1.jpg](https://upload-images.jianshu.io/upload_images/4697920-dfebfcf8673fc144.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](https://z4a.net/image/7NtGdH) +[![-1.jpg](https://z4a.net/images/2019/03/16/-1.jpg)](https://z4a.net/image/7NtGdH) ## 页面路径说明 - -| 页面路径 | 功能 | -| -------------------------- | --------------------- | -| pages/index/index | 默认首页 | -| pages/index/login | 账号登录 | -| pages/index/feature | 功能列表 | -| pages/books/search | 图书检索 | -| pages/books/index | 图书检索结果列表 | -| pages/books/detail | 图书详情 | -| pages/books/shelf | 图书书架 | -| pages/books/bind | 绑定借阅 | -| pages/books/hot/index | 热门图书排行 | -| pages/books/overdue/index | 图书超期欠款 | -| pages/books/my | 我的图书馆 | -| pages/course/my | 个人课表 | -| pages/course/search | 班级/教师课表搜索列表 | -| pages/course/content | 班级/教师课表内容 | -| pages/elesys/bind | 绑定电费寝室 | -| pages/elesys/index | 寝室电费信息 | -| pages/netsys/bind | 校园网账号绑定 | -| pages/netsys/index | 网费查询结果界面 | -| pages/netsys/list | 网费查询明细 | -| pages/traffic/navi | 校园导航 | -| pages/traffic/bus | 校园出行方案 | -| pages/score/score | 成绩查询 | -| pages/school/calendar | 校历 | -| pages/school/tel | 校园通讯录 | -| pages/school/cert | 考证助手 | -| pages/school/web | 校园站点 | -| pages/school/aboutus | 关于 | -| pages/school/xiaoai | 小爱课表 | -| pages/school/lost/index | 失物招领 | -| pages/school/lost/detail | 失物招领详情 | -| pages/school/run/index | 运动计步排行榜 | -| pages/school/finance/bind | 缴费平台账号绑定 | -| pages/school/finance/index | 缴费查询界面 | -| pages/school/card/index | 校园一卡通查询界面 | -| pages/school/card/bind | 校园一卡通绑定界面 | +``` +"pages": [ + "pages/bookSearch/index",//通知消息提示首页 + "pages/index/index",//学号绑定登录 + "pages/index/vcode",//成绩查询输入验证码 + "pages/bookSearch/isbn/iputIsbn",//扫码查书 + "pages/bookSearch/bookInfo/bookDetail",//搜索图书的图书详情 + "pages/bookSearch/bookInfo/bookInfo",//扫码查书的图书详情 + "pages/bookSearch/bookInfo/bookList",//图书搜索结果列表 + "pages/features/features",//“更多”界面 + "pages/features/about",//关于 + "pages/welcome/welcome",//欢迎界面 + "pages/classQuery/index",//个人课表 + "pages/classQuery/class",//班级课表 + "pages/classQuery/jskb",//教师课表查询界面 + "pages/classQuery/showJskb",//教师课表展示界面 + "pages/score/score",//成绩查询 + "pages/calendar/calendar",//校历 + "pages/error/queryerror",//查询失败或错误的异常页面 + "pages/net/netfare",//网费查询 + "pages/net/netBind",//网费绑定 + "pages/electricity/electricityFare",//电费查询 + "pages/electricity/electricityBind",//电费绑定 + "pages/Transport/Transport",//校园出行 + "pages/tel/tel",//常用电话 + "pages/schoolNav/schoolNav"//校园导航 + ], +``` ## 参考借鉴 -- 登录、关于、课表、电费查询界面借鉴参考使用[We重邮](https://github.com/mcc108/wecqupt) +- 通知中心、登录、关于、课表、电费查询界面借鉴使用[We重邮](https://github.com/mcc108/wecqupt) + +- 校园出行公交路线、公告通知跑马灯使用[Wux Weapp](https://github.com/wux-weapp/wux-weapp) - 校园导航路线规划使用[高德导航API](https://lbs.amap.com/) -- 成绩查询界面统计图表[wx-charts](https://github.com/xiaolin3303/wx-charts) +- 图书信息来自于[豆瓣API](https://github.com/zce/douban-api-proxy) -- [ColorUI](https://github.com/weilanwl/ColorUI) +- 电费查询、成绩查询界面统计图表[wx-charts](https://github.com/xiaolin3303/wx-charts) +- [小程序WeUI](https://github.com/Tencent/weui-wxss) ## 参赛获奖 -- 2019 高校微信小程序开发大赛 [华北赛区二等奖](https://mp.weixin.qq.com/s/17bq_ryWXAQfAORZy_n9QA) (2019年7月25日) +- 2019 高校微信小程序开发大赛 华北赛区二等奖 (2019年7月25日) ## 其他版本 - [贝壳小盒子QQ小程序版](https://github.com/Airmole/ShellBox_QApp) - -## 赞助感谢 - -[本项目的 CDN 加速和安全保护由腾讯 EdgeOne 赞助,最佳亚洲 CDN、Edge 和安全解决方案 - 腾讯 EdgeOne](https://edgeone.ai/?from=github) -[![image](https://github.com/user-attachments/assets/4ee88232-7947-40b8-91f2-b069c1f21b51)](https://edgeone.ai/?from=github) diff --git a/app.js b/app.js index 6cacea7..da11c95 100644 --- a/app.js +++ b/app.js @@ -1,163 +1,71 @@ -//app.js +const openIdUrl = require('./config').openIdUrl + App({ globalData: { - domain: 'https://shellbox.airmole.cn/api', - _amap_key: '66a87160f8db2a9a76431c954b4f52a5', // 高德导航API秘钥 - requestTimeout: 120 * 1000, // 网络请求最长时间120s - defaultGrayAvatar: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0', - openid: '', - session_key: '', - userInfo: {}, - edusysUserInfo: {}, - netsysUserInfo: '', - elesysUserInfo: '', - env: 'develop', - hasEdusysStorage: false - }, - onLaunch: function () { - let launchInfo = wx.getLaunchOptionsSync() - const accountInfo = wx.getAccountInfoSync() - this.globalData.env = accountInfo.miniProgram.envVersion - // this.globalData.env = 'release' - if (this.globalData.env == 'release') { - this.globalData.domain = 'https://shellbox.airmole.cn/api' - } else { - this.globalData.domain = 'https://dev.shellbox.airmole.cn/api' - // this.globalData.domain = 'http://shellbox.cn/api' - } - if(launchInfo.scene != 1145){ - this.getUserOpenId() - this.appUpdate() - } - this.checkHasEdusysStorage() - this.getStorageEdusysUserInfo() - this.getUserInfoFromStorage() - this.getSystemStatusBarInfo() - console.log('app.globalData:', this.globalData) - }, - checkHasEdusysStorage: function () { - const edusysStorage = wx.getStorageSync('edusysUserInfo') || {} - var self = this - try { - if (edusysStorage.uid.length > 0) { - self.globalData.hasEdusysStorage = true - self.globalData.edusysUserInfo = self.autoLoginCookie(edusysStorage) - } else { - self.globalData.hasEdusysStorage = false - } - } catch (error) { - self.globalData.hasEdusysStorage = false - } + apiURL: "https://api.airmole.cn/ShellBox", + doubanApi: "https://airmole.cn/doubanapi/v2", + nickName: '', + hasLogin: false, + openid: null, + building: '', + roomNo: '', + uid: '', + pwd: '', + newpwd: '', + netPassword: '', }, - autoLoginCookie: function (edusysInfo) { - var self = this - const uid = edusysInfo.uid - const pwd = edusysInfo.password - const cookie = edusysInfo.cookie ? edusysInfo.cookie : '' - const openid = wx.getStorageSync('openid') || { openid: this.globalData.openid } - wx.request({ - // url: `https://dev.shellbox.airmole.cn/api/edu/profile`, - url: `${self.globalData.domain}/edu/profile`, - data:{ - uid: uid, - pwd: pwd, - cookie: cookie, - userFrom: 'wechat', - openid: openid.openid - }, - timeout: self.globalData.requestTimeout, - method: 'POST', - success: function(res){ - // console.log('eduSysProfile:', res.data) - try { - if (res.data.name.length > 1) { - res.data.password = pwd - wx.setStorage({ data: res.data, key: 'edusysUserInfo' }) - self.globalData.edusysUserInfo = res.data - } - } catch (error) { - console.log('后台自动静默激活教务cookie失败', error) - } - }, - fail: function(error){ - console.log('后台自动静默激活教务cookie失败', error) - } - }) + util: require('./utils/util'), + onLaunch: function() { + // console.log('App Launch') + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + var newpwd = wx.getStorageSync('newpwd'); + + this.appUpdate(); + + this.getUserOpenId(); + }, - getUserInfoFromStorage: function () { - var self = this; - const userInfo = wx.getStorageSync('userInfo') || {} - self.globalData.userInfo = userInfo + onShow: function() { + // console.log('App Show') }, - getStorageEdusysUserInfo: function () { - var self = this; - const edusysUserInfo = wx.getStorageSync('edusysUserInfo') || {} - self.globalData.edusysUserInfo = edusysUserInfo + onHide: function() { + // console.log('App Hide') }, - getSystemStatusBarInfo: function () { - // 获取系统状态栏信息 - wx.getSystemInfo({ - success: e => { - this.globalData.StatusBar = e.statusBarHeight; - let capsule = wx.getMenuButtonBoundingClientRect(); - if (capsule) { - this.globalData.Custom = capsule; - this.globalData.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight; - } else { - this.globalData.CustomBar = e.statusBarHeight + 50; - } - } - }) - }, - getUserOpenId: function (callback) { + // lazy loading openid + getUserOpenId: function(callback) { var self = this - var storageOpenid = wx.getStorageSync('openid') || {} - if (storageOpenid.openid) { - wx.checkSession({ - success () { - //session_key 未过期,并且在本生命周期一直有效 - self.globalData.openid = storageOpenid.openid - return - }, - fail () { - // session_key 已经失效,需要重新执行登录流程 - self.wxLoginAndRequest() - } - }) - } if (self.globalData.openid) { callback(null, self.globalData.openid) } else { - this.wxLoginAndRequest() + wx.login({ + success: function(data) { + wx.request({ + url: 'https://api.airmole.cn/code2id.php?', + data: { + code: data.code + }, + success: function(res) { + console.log('拉取openid成功', res.data) + self.globalData.openid = res.data.openid + }, + fail: function(res) { + console.log('拉取用户openid失败,将无法正常使用开放接口等服务', res) + } + }) + }, + fail: function(err) { + console.log('wx.login 接口调用失败,将无法正常使用开放接口等服务', err) + } + }) } }, - wxLoginAndRequest: function () { - var self = this - wx.login({ - success: function (data) { - wx.request({ - url: self.globalData.domain + `/wechat/openid?jscode=${data.code}`, - success: function (res) { - console.log('拉取openid成功', res.data) - wx.setStorageSync('openid', res.data) - self.globalData.openid = res.data.openid - self.globalData.session_key = res.data.session_key - }, - fail: function (res) { - console.log('拉取用户openid失败,将无法正常使用开放接口等服务', res) - } - }) - }, - fail: function (err) { - console.log('wx.login 接口调用失败,将无法正常使用开放接口等服务', err) - } - }) - }, - appUpdate: function (where) { + appUpdate: function(where) { const updateManager = wx.getUpdateManager() - updateManager.onCheckForUpdate(function (res) { + + updateManager.onCheckForUpdate(function(res) { // 请求完新版本信息的回调 - // console.log(res) + console.log(res) if (where == 'userclick') { wx.showToast({ title: '已是最新版', @@ -166,11 +74,11 @@ App({ } }) - updateManager.onUpdateReady(function () { + updateManager.onUpdateReady(function() { wx.showModal({ title: '小盒子求更新', content: "小盒子有版本功能更新啦,建议各位小可爱重启应用体验新版本(●'◡'●)", - success: function (res) { + success: function(res) { if (res.confirm) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 updateManager.applyUpdate() @@ -179,7 +87,7 @@ App({ }) }) - updateManager.onUpdateFailed(function () { + updateManager.onUpdateFailed(function() { // 新版本下载失败 wx.showToast({ title: '嘤嘤嘤更新失败了。可能网络不好', diff --git a/app.json b/app.json index a89bfd1..f282892 100644 --- a/app.json +++ b/app.json @@ -1,74 +1,52 @@ { "pages": [ + "pages/bookSearch/index", "pages/index/index", - "pages/index/login", - "pages/index/feature", - "pages/index/setting", - "pages/books/search", - "pages/books/index", - "pages/books/detail", - "pages/books/shelf", - "pages/books/bind", - "pages/books/hot/index", - "pages/books/overdue/index", - "pages/books/recommend/index", - "pages/books/my", - "pages/course/my", - "pages/course/search", - "pages/course/content", - "pages/course/stulist/index", - "pages/course/stulist/content", - "pages/elesys/bind", - "pages/elesys/index", - "pages/netsys/bind", - "pages/netsys/index", - "pages/netsys/list", - "pages/traffic/navi", - "pages/traffic/bus", + "pages/index/vcode", + "pages/bookSearch/isbn/iputIsbn", + "pages/bookSearch/bookInfo/bookDetail", + "pages/bookSearch/bookInfo/bookInfo", + "pages/bookSearch/bookInfo/bookList", + "pages/features/features", + "pages/features/about", + "pages/welcome/welcome", + "pages/classQuery/index", + "pages/classQuery/jskb", + "pages/classQuery/showJskb", "pages/score/score", - "pages/school/calendar", - "pages/school/tel", - "pages/school/cert", - "pages/school/web", - "pages/school/aboutus", - "pages/school/xiaoai", - "pages/school/board/index", - "pages/school/board/edit", - "pages/school/board/faq", - "pages/school/board/detail", - "pages/school/run/index", - "pages/school/finance/bind", - "pages/school/finance/index", - "pages/school/card/index", - "pages/school/card/bind", - "pages/webview/webview", - "pages/webview/redpacket", - "pages/school/movie" + "pages/calendar/calendar", + "pages/error/queryerror", + "pages/net/netfare", + "pages/net/netBind", + "pages/electricity/electricityFare", + "pages/electricity/electricityBind", + "pages/Transport/Transport", + "pages/tel/tel", + "pages/schoolNav/schoolNav", + "pages/opac/index", + "pages/opac/bind", + "pages/cet/find" ], "window": { "backgroundTextStyle": "light", - "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "贝壳小盒子", - "navigationStyle": "custom", - "navigationBarTextStyle": "white" - }, - "usingComponents": { - "cu-custom": "/colorui/components/cu-custom" + "navigationBarTextStyle": "white", + "navigationBarBackgroundColor": "#7acfa6" }, "tabBar": { - "selectedColor": "#84BD54", + "selectedColor": "#4A6141", "color": "#333", "backgroundColor": "#fff", "position": "bottom", "list": [ { - "pagePath": "pages/index/index", + "pagePath": "pages/bookSearch/index", "text": "首页", "iconPath": "images/index.png", "selectedIconPath": "images/index@active.png" }, { - "pagePath": "pages/index/feature", + "pagePath": "pages/features/features", "text": "更多", "iconPath": "images/more.png", "selectedIconPath": "images/holiday.png" @@ -78,20 +56,11 @@ "permission": { "scope.userLocation": { "desc": "你的位置信息将用于校园导航定位" - }, - "scope.addPhoneCalendar": { - "desc": "用于添加上课日历事件提醒" } }, - "requiredPrivateInfos": [ - "getLocation" + "navigateToMiniProgramAppIdList": [ + "wx183616af30e5723d", + "wx9551f8196258f706" ], - "plugins": { - "ocr-plugin": { - "version": "3.1.5", - "provider": "wx4418e3e031e551be" - } - }, - "__usePrivacyCheck__": true, - "sitemapLocation": "sitemap.json" + "sitemapLocation": "sitemap33.json" } \ No newline at end of file diff --git a/app.wxss b/app.wxss index 744a444..87a186b 100644 --- a/app.wxss +++ b/app.wxss @@ -1,3 +1,89 @@ -@import "colorui/main.wxss"; -@import "colorui/icon.wxss"; -@import "utils/iconfont.wxss"; \ No newline at end of file +page { + font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; + font-size: 10pt; + line-height: 150%; + color: #666; + min-height: 100%; + position: relative; + display: flex; + flex-direction: column; + align-items: stretch; +} + +.container { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + min-height: 100%; + padding-bottom: 100rpx; + box-sizing: border-box; +} + +.remind-box { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.remind-img { + width: 250rpx; + height: 250rpx; + padding-bottom: 25rpx; +} + +.remind-text { + font-size: 12pt; + line-height: 150%; +} + +.remind-btn { + margin-top: 20rpx; + font-size: 9pt; + padding: 5rpx 20rpx; + text-align: center; + background-color: #7acfa6; + border-radius: 25rpx; + border-bottom: 2px solid #4fc08d; + color: #fff; +} + +.fix_tip { + position: fixed; + bottom: 50rpx; + left: 0; + width: 100%; + text-align: center; + opacity: 0; + transform: translate3d(0, 80rpx, 0); + transition: all 0.5s cubic-bezier(0.19, 1, 0.22, 1); +} + +.fix_tip.active { + opacity: 1; + transform: translate3d(0, 0, 0); +} + +.fix_tip text { + font-size: 9pt; + line-height: 100%; + padding: 10rpx 20rpx; + border-radius: 10rpx; + background: rgba(66, 66, 66, 0.6); + color: #fff; +} + +.lanshan-studio { + position: absolute; + left: 0; + right: 0; + bottom: 0; + width: 100%; + font-size: 9pt; + line-height: 100%; + padding: 9pt 0; + text-align: center; + opacity: 0.15; +} diff --git a/colorui/animation.wxss b/colorui/animation.wxss deleted file mode 100644 index 931bb51..0000000 --- a/colorui/animation.wxss +++ /dev/null @@ -1,184 +0,0 @@ -/* - Animation 微动画 - 基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28 - */ - -/* css 滤镜 控制黑白底色gif的 */ -.gif-black{ - mix-blend-mode: screen; -} -.gif-white{ - mix-blend-mode: multiply; -} - - -/* Animation css */ -[class*=animation-] { - animation-duration: .5s; - animation-timing-function: ease-out; - animation-fill-mode: both -} - -.animation-fade { - animation-name: fade; - animation-duration: .8s; - animation-timing-function: linear -} - -.animation-scale-up { - animation-name: scale-up -} - -.animation-scale-down { - animation-name: scale-down -} - -.animation-slide-top { - animation-name: slide-top -} - -.animation-slide-bottom { - animation-name: slide-bottom -} - -.animation-slide-left { - animation-name: slide-left -} - -.animation-slide-right { - animation-name: slide-right -} - -.animation-shake { - animation-name: shake -} - -.animation-reverse { - animation-direction: reverse -} - -@keyframes fade { - 0% { - opacity: 0 - } - - 100% { - opacity: 1 - } -} - -@keyframes scale-up { - 0% { - opacity: 0; - transform: scale(.2) - } - - 100% { - opacity: 1; - transform: scale(1) - } -} - -@keyframes scale-down { - 0% { - opacity: 0; - transform: scale(1.8) - } - - 100% { - opacity: 1; - transform: scale(1) - } -} - -@keyframes slide-top { - 0% { - opacity: 0; - transform: translateY(-100%) - } - - 100% { - opacity: 1; - transform: translateY(0) - } -} - -@keyframes slide-bottom { - 0% { - opacity: 0; - transform: translateY(100%) - } - - 100% { - opacity: 1; - transform: translateY(0) - } -} - -@keyframes shake { - - 0%, - 100% { - transform: translateX(0) - } - - 10% { - transform: translateX(-9px) - } - - 20% { - transform: translateX(8px) - } - - 30% { - transform: translateX(-7px) - } - - 40% { - transform: translateX(6px) - } - - 50% { - transform: translateX(-5px) - } - - 60% { - transform: translateX(4px) - } - - 70% { - transform: translateX(-3px) - } - - 80% { - transform: translateX(2px) - } - - 90% { - transform: translateX(-1px) - } -} - -@keyframes slide-left { - 0% { - opacity: 0; - transform: translateX(-100%) - } - - 100% { - opacity: 1; - transform: translateX(0) - } -} - -@keyframes slide-right { - 0% { - opacity: 0; - transform: translateX(100%) - } - - 100% { - opacity: 1; - transform: translateX(0) - } -} \ No newline at end of file diff --git a/colorui/components/cu-custom.js b/colorui/components/cu-custom.js deleted file mode 100644 index 2833b04..0000000 --- a/colorui/components/cu-custom.js +++ /dev/null @@ -1,60 +0,0 @@ -const app = getApp(); -Component({ - /** - * 组件的一些选项 - */ - options: { - addGlobalClass: true, - multipleSlots: true - }, - /** - * 组件的对外属性 - */ - properties: { - bgColor: { - type: String, - default: '' - }, - isCustom: { - type: [Boolean, String], - default: false - }, - isBack: { - type: [Boolean, String], - default: false - }, - bgImage: { - type: String, - default: '' - }, - }, - /** - * 组件的初始数据 - */ - data: { - StatusBar: app.globalData.StatusBar, - CustomBar: app.globalData.CustomBar, - Custom: app.globalData.Custom - }, - /** - * 组件的方法列表 - */ - methods: { - BackPage() { - try { - const _this = this - wx.navigateBack({ - delta: 1, - fail() { _this.toHome()} - }); - } catch (error) { - this.toHome() - } - }, - toHome(){ - wx.reLaunch({ - url: '/pages/index/index', - }) - } - } -}) \ No newline at end of file diff --git a/colorui/components/cu-custom.json b/colorui/components/cu-custom.json deleted file mode 100644 index e8cfaaf..0000000 --- a/colorui/components/cu-custom.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "component": true, - "usingComponents": {} -} \ No newline at end of file diff --git a/colorui/components/cu-custom.wxml b/colorui/components/cu-custom.wxml deleted file mode 100644 index c248d48..0000000 --- a/colorui/components/cu-custom.wxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/colorui/components/cu-custom.wxss b/colorui/components/cu-custom.wxss deleted file mode 100644 index 07675e2..0000000 --- a/colorui/components/cu-custom.wxss +++ /dev/null @@ -1 +0,0 @@ -/* colorui/components/cu-custom.wxss */ \ No newline at end of file diff --git a/colorui/icon.wxss b/colorui/icon.wxss deleted file mode 100644 index e19a7bb..0000000 --- a/colorui/icon.wxss +++ /dev/null @@ -1,1226 +0,0 @@ -@keyframes cuIcon-spin { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -.iconfont-spin { - -webkit-animation: cuIcon-spin 2s infinite linear; - animation: cuIcon-spin 2s infinite linear; - display: inline-block; -} - -.iconfont-pulse { - -webkit-animation: cuIcon-spin 1s infinite steps(8); - animation: cuIcon-spin 1s infinite steps(8); - display: inline-block; -} - -[class*="cuIcon-"] { - font-family: "cuIcon"; - font-size: inherit; - font-style: normal; -} - -@font-face { - font-family: "cuIcon"; - src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831'); - /* IE9*/ - src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'), - /* IE6-IE8 */ - url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), - url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'), - /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ - url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#iconfont') format('svg'); - /* iOS 4.1- */ -} - -.cuIcon-appreciate:before { - content: "\e644"; -} - -.cuIcon-check:before { - content: "\e645"; -} - -.cuIcon-close:before { - content: "\e646"; -} - -.cuIcon-edit:before { - content: "\e649"; -} - -.cuIcon-emoji:before { - content: "\e64a"; -} - -.cuIcon-favorfill:before { - content: "\e64b"; -} - -.cuIcon-favor:before { - content: "\e64c"; -} - -.cuIcon-loading:before { - content: "\e64f"; -} - -.cuIcon-locationfill:before { - content: "\e650"; -} - -.cuIcon-location:before { - content: "\e651"; -} - -.cuIcon-phone:before { - content: "\e652"; -} - -.cuIcon-roundcheckfill:before { - content: "\e656"; -} - -.cuIcon-roundcheck:before { - content: "\e657"; -} - -.cuIcon-roundclosefill:before { - content: "\e658"; -} - -.cuIcon-roundclose:before { - content: "\e659"; -} - -.cuIcon-roundrightfill:before { - content: "\e65a"; -} - -.cuIcon-roundright:before { - content: "\e65b"; -} - -.cuIcon-search:before { - content: "\e65c"; -} - -.cuIcon-taxi:before { - content: "\e65d"; -} - -.cuIcon-timefill:before { - content: "\e65e"; -} - -.cuIcon-time:before { - content: "\e65f"; -} - -.cuIcon-unfold:before { - content: "\e661"; -} - -.cuIcon-warnfill:before { - content: "\e662"; -} - -.cuIcon-warn:before { - content: "\e663"; -} - -.cuIcon-camerafill:before { - content: "\e664"; -} - -.cuIcon-camera:before { - content: "\e665"; -} - -.cuIcon-commentfill:before { - content: "\e666"; -} - -.cuIcon-comment:before { - content: "\e667"; -} - -.cuIcon-likefill:before { - content: "\e668"; -} - -.cuIcon-like:before { - content: "\e669"; -} - -.cuIcon-notificationfill:before { - content: "\e66a"; -} - -.cuIcon-notification:before { - content: "\e66b"; -} - -.cuIcon-order:before { - content: "\e66c"; -} - -.cuIcon-samefill:before { - content: "\e66d"; -} - -.cuIcon-same:before { - content: "\e66e"; -} - -.cuIcon-deliver:before { - content: "\e671"; -} - -.cuIcon-evaluate:before { - content: "\e672"; -} - -.cuIcon-pay:before { - content: "\e673"; -} - -.cuIcon-send:before { - content: "\e675"; -} - -.cuIcon-shop:before { - content: "\e676"; -} - -.cuIcon-ticket:before { - content: "\e677"; -} - -.cuIcon-back:before { - content: "\e679"; -} - -.cuIcon-cascades:before { - content: "\e67c"; -} - -.cuIcon-discover:before { - content: "\e67e"; -} - -.cuIcon-list:before { - content: "\e682"; -} - -.cuIcon-more:before { - content: "\e684"; -} - -.cuIcon-scan:before { - content: "\e689"; -} - -.cuIcon-settings:before { - content: "\e68a"; -} - -.cuIcon-questionfill:before { - content: "\e690"; -} - -.cuIcon-question:before { - content: "\e691"; -} - -.cuIcon-shopfill:before { - content: "\e697"; -} - -.cuIcon-form:before { - content: "\e699"; -} - -.cuIcon-pic:before { - content: "\e69b"; -} - -.cuIcon-filter:before { - content: "\e69c"; -} - -.cuIcon-footprint:before { - content: "\e69d"; -} - -.cuIcon-top:before { - content: "\e69e"; -} - -.cuIcon-pulldown:before { - content: "\e69f"; -} - -.cuIcon-pullup:before { - content: "\e6a0"; -} - -.cuIcon-right:before { - content: "\e6a3"; -} - -.cuIcon-refresh:before { - content: "\e6a4"; -} - -.cuIcon-moreandroid:before { - content: "\e6a5"; -} - -.cuIcon-deletefill:before { - content: "\e6a6"; -} - -.cuIcon-refund:before { - content: "\e6ac"; -} - -.cuIcon-cart:before { - content: "\e6af"; -} - -.cuIcon-qrcode:before { - content: "\e6b0"; -} - -.cuIcon-remind:before { - content: "\e6b2"; -} - -.cuIcon-delete:before { - content: "\e6b4"; -} - -.cuIcon-profile:before { - content: "\e6b7"; -} - -.cuIcon-home:before { - content: "\e6b8"; -} - -.cuIcon-cartfill:before { - content: "\e6b9"; -} - -.cuIcon-discoverfill:before { - content: "\e6ba"; -} - -.cuIcon-homefill:before { - content: "\e6bb"; -} - -.cuIcon-message:before { - content: "\e6bc"; -} - -.cuIcon-addressbook:before { - content: "\e6bd"; -} - -.cuIcon-link:before { - content: "\e6bf"; -} - -.cuIcon-lock:before { - content: "\e6c0"; -} - -.cuIcon-unlock:before { - content: "\e6c2"; -} - -.cuIcon-vip:before { - content: "\e6c3"; -} - -.cuIcon-weibo:before { - content: "\e6c4"; -} - -.cuIcon-activity:before { - content: "\e6c5"; -} - -.cuIcon-friendaddfill:before { - content: "\e6c9"; -} - -.cuIcon-friendadd:before { - content: "\e6ca"; -} - -.cuIcon-friendfamous:before { - content: "\e6cb"; -} - -.cuIcon-friend:before { - content: "\e6cc"; -} - -.cuIcon-goods:before { - content: "\e6cd"; -} - -.cuIcon-selection:before { - content: "\e6ce"; -} - -.cuIcon-explore:before { - content: "\e6d2"; -} - -.cuIcon-present:before { - content: "\e6d3"; -} - -.cuIcon-squarecheckfill:before { - content: "\e6d4"; -} - -.cuIcon-square:before { - content: "\e6d5"; -} - -.cuIcon-squarecheck:before { - content: "\e6d6"; -} - -.cuIcon-round:before { - content: "\e6d7"; -} - -.cuIcon-roundaddfill:before { - content: "\e6d8"; -} - -.cuIcon-roundadd:before { - content: "\e6d9"; -} - -.cuIcon-add:before { - content: "\e6da"; -} - -.cuIcon-notificationforbidfill:before { - content: "\e6db"; -} - -.cuIcon-explorefill:before { - content: "\e6dd"; -} - -.cuIcon-fold:before { - content: "\e6de"; -} - -.cuIcon-game:before { - content: "\e6df"; -} - -.cuIcon-redpacket:before { - content: "\e6e0"; -} - -.cuIcon-selectionfill:before { - content: "\e6e1"; -} - -.cuIcon-similar:before { - content: "\e6e2"; -} - -.cuIcon-appreciatefill:before { - content: "\e6e3"; -} - -.cuIcon-infofill:before { - content: "\e6e4"; -} - -.cuIcon-info:before { - content: "\e6e5"; -} - -.cuIcon-forwardfill:before { - content: "\e6ea"; -} - -.cuIcon-forward:before { - content: "\e6eb"; -} - -.cuIcon-rechargefill:before { - content: "\e6ec"; -} - -.cuIcon-recharge:before { - content: "\e6ed"; -} - -.cuIcon-vipcard:before { - content: "\e6ee"; -} - -.cuIcon-voice:before { - content: "\e6ef"; -} - -.cuIcon-voicefill:before { - content: "\e6f0"; -} - -.cuIcon-friendfavor:before { - content: "\e6f1"; -} - -.cuIcon-wifi:before { - content: "\e6f2"; -} - -.cuIcon-share:before { - content: "\e6f3"; -} - -.cuIcon-wefill:before { - content: "\e6f4"; -} - -.cuIcon-we:before { - content: "\e6f5"; -} - -.cuIcon-lightauto:before { - content: "\e6f6"; -} - -.cuIcon-lightforbid:before { - content: "\e6f7"; -} - -.cuIcon-lightfill:before { - content: "\e6f8"; -} - -.cuIcon-camerarotate:before { - content: "\e6f9"; -} - -.cuIcon-light:before { - content: "\e6fa"; -} - -.cuIcon-barcode:before { - content: "\e6fb"; -} - -.cuIcon-flashlightclose:before { - content: "\e6fc"; -} - -.cuIcon-flashlightopen:before { - content: "\e6fd"; -} - -.cuIcon-searchlist:before { - content: "\e6fe"; -} - -.cuIcon-service:before { - content: "\e6ff"; -} - -.cuIcon-sort:before { - content: "\e700"; -} - -.cuIcon-down:before { - content: "\e703"; -} - -.cuIcon-mobile:before { - content: "\e704"; -} - -.cuIcon-mobilefill:before { - content: "\e705"; -} - -.cuIcon-copy:before { - content: "\e706"; -} - -.cuIcon-countdownfill:before { - content: "\e707"; -} - -.cuIcon-countdown:before { - content: "\e708"; -} - -.cuIcon-noticefill:before { - content: "\e709"; -} - -.cuIcon-notice:before { - content: "\e70a"; -} - -.cuIcon-upstagefill:before { - content: "\e70e"; -} - -.cuIcon-upstage:before { - content: "\e70f"; -} - -.cuIcon-babyfill:before { - content: "\e710"; -} - -.cuIcon-baby:before { - content: "\e711"; -} - -.cuIcon-brandfill:before { - content: "\e712"; -} - -.cuIcon-brand:before { - content: "\e713"; -} - -.cuIcon-choicenessfill:before { - content: "\e714"; -} - -.cuIcon-choiceness:before { - content: "\e715"; -} - -.cuIcon-clothesfill:before { - content: "\e716"; -} - -.cuIcon-clothes:before { - content: "\e717"; -} - -.cuIcon-creativefill:before { - content: "\e718"; -} - -.cuIcon-creative:before { - content: "\e719"; -} - -.cuIcon-female:before { - content: "\e71a"; -} - -.cuIcon-keyboard:before { - content: "\e71b"; -} - -.cuIcon-male:before { - content: "\e71c"; -} - -.cuIcon-newfill:before { - content: "\e71d"; -} - -.cuIcon-new:before { - content: "\e71e"; -} - -.cuIcon-pullleft:before { - content: "\e71f"; -} - -.cuIcon-pullright:before { - content: "\e720"; -} - -.cuIcon-rankfill:before { - content: "\e721"; -} - -.cuIcon-rank:before { - content: "\e722"; -} - -.cuIcon-bad:before { - content: "\e723"; -} - -.cuIcon-cameraadd:before { - content: "\e724"; -} - -.cuIcon-focus:before { - content: "\e725"; -} - -.cuIcon-friendfill:before { - content: "\e726"; -} - -.cuIcon-cameraaddfill:before { - content: "\e727"; -} - -.cuIcon-apps:before { - content: "\e729"; -} - -.cuIcon-paintfill:before { - content: "\e72a"; -} - -.cuIcon-paint:before { - content: "\e72b"; -} - -.cuIcon-picfill:before { - content: "\e72c"; -} - -.cuIcon-refresharrow:before { - content: "\e72d"; -} - -.cuIcon-colorlens:before { - content: "\e6e6"; -} - -.cuIcon-markfill:before { - content: "\e730"; -} - -.cuIcon-mark:before { - content: "\e731"; -} - -.cuIcon-presentfill:before { - content: "\e732"; -} - -.cuIcon-repeal:before { - content: "\e733"; -} - -.cuIcon-album:before { - content: "\e734"; -} - -.cuIcon-peoplefill:before { - content: "\e735"; -} - -.cuIcon-people:before { - content: "\e736"; -} - -.cuIcon-servicefill:before { - content: "\e737"; -} - -.cuIcon-repair:before { - content: "\e738"; -} - -.cuIcon-file:before { - content: "\e739"; -} - -.cuIcon-repairfill:before { - content: "\e73a"; -} - -.cuIcon-taoxiaopu:before { - content: "\e73b"; -} - -.cuIcon-weixin:before { - content: "\e612"; -} - -.cuIcon-attentionfill:before { - content: "\e73c"; -} - -.cuIcon-attention:before { - content: "\e73d"; -} - -.cuIcon-commandfill:before { - content: "\e73e"; -} - -.cuIcon-command:before { - content: "\e73f"; -} - -.cuIcon-communityfill:before { - content: "\e740"; -} - -.cuIcon-community:before { - content: "\e741"; -} - -.cuIcon-read:before { - content: "\e742"; -} - -.cuIcon-calendar:before { - content: "\e74a"; -} - -.cuIcon-cut:before { - content: "\e74b"; -} - -.cuIcon-magic:before { - content: "\e74c"; -} - -.cuIcon-backwardfill:before { - content: "\e74d"; -} - -.cuIcon-playfill:before { - content: "\e74f"; -} - -.cuIcon-stop:before { - content: "\e750"; -} - -.cuIcon-tagfill:before { - content: "\e751"; -} - -.cuIcon-tag:before { - content: "\e752"; -} - -.cuIcon-group:before { - content: "\e753"; -} - -.cuIcon-all:before { - content: "\e755"; -} - -.cuIcon-backdelete:before { - content: "\e756"; -} - -.cuIcon-hotfill:before { - content: "\e757"; -} - -.cuIcon-hot:before { - content: "\e758"; -} - -.cuIcon-post:before { - content: "\e759"; -} - -.cuIcon-radiobox:before { - content: "\e75b"; -} - -.cuIcon-rounddown:before { - content: "\e75c"; -} - -.cuIcon-upload:before { - content: "\e75d"; -} - -.cuIcon-writefill:before { - content: "\e760"; -} - -.cuIcon-write:before { - content: "\e761"; -} - -.cuIcon-radioboxfill:before { - content: "\e763"; -} - -.cuIcon-punch:before { - content: "\e764"; -} - -.cuIcon-shake:before { - content: "\e765"; -} - -.cuIcon-move:before { - content: "\e768"; -} - -.cuIcon-safe:before { - content: "\e769"; -} - -.cuIcon-activityfill:before { - content: "\e775"; -} - -.cuIcon-crownfill:before { - content: "\e776"; -} - -.cuIcon-crown:before { - content: "\e777"; -} - -.cuIcon-goodsfill:before { - content: "\e778"; -} - -.cuIcon-messagefill:before { - content: "\e779"; -} - -.cuIcon-profilefill:before { - content: "\e77a"; -} - -.cuIcon-sound:before { - content: "\e77b"; -} - -.cuIcon-sponsorfill:before { - content: "\e77c"; -} - -.cuIcon-sponsor:before { - content: "\e77d"; -} - -.cuIcon-upblock:before { - content: "\e77e"; -} - -.cuIcon-weblock:before { - content: "\e77f"; -} - -.cuIcon-weunblock:before { - content: "\e780"; -} - -.cuIcon-my:before { - content: "\e78b"; -} - -.cuIcon-myfill:before { - content: "\e78c"; -} - -.cuIcon-emojifill:before { - content: "\e78d"; -} - -.cuIcon-emojiflashfill:before { - content: "\e78e"; -} - -.cuIcon-flashbuyfill:before { - content: "\e78f"; -} - -.cuIcon-text:before { - content: "\e791"; -} - -.cuIcon-goodsfavor:before { - content: "\e794"; -} - -.cuIcon-musicfill:before { - content: "\e795"; -} - -.cuIcon-musicforbidfill:before { - content: "\e796"; -} - -.cuIcon-card:before { - content: "\e624"; -} - -.cuIcon-triangledownfill:before { - content: "\e79b"; -} - -.cuIcon-triangleupfill:before { - content: "\e79c"; -} - -.cuIcon-roundleftfill-copy:before { - content: "\e79e"; -} - -.cuIcon-font:before { - content: "\e76a"; -} - -.cuIcon-title:before { - content: "\e82f"; -} - -.cuIcon-recordfill:before { - content: "\e7a4"; -} - -.cuIcon-record:before { - content: "\e7a6"; -} - -.cuIcon-cardboardfill:before { - content: "\e7a9"; -} - -.cuIcon-cardboard:before { - content: "\e7aa"; -} - -.cuIcon-formfill:before { - content: "\e7ab"; -} - -.cuIcon-coin:before { - content: "\e7ac"; -} - -.cuIcon-cardboardforbid:before { - content: "\e7af"; -} - -.cuIcon-circlefill:before { - content: "\e7b0"; -} - -.cuIcon-circle:before { - content: "\e7b1"; -} - -.cuIcon-attentionforbid:before { - content: "\e7b2"; -} - -.cuIcon-attentionforbidfill:before { - content: "\e7b3"; -} - -.cuIcon-attentionfavorfill:before { - content: "\e7b4"; -} - -.cuIcon-attentionfavor:before { - content: "\e7b5"; -} - -.cuIcon-titles:before { - content: "\e701"; -} - -.cuIcon-icloading:before { - content: "\e67a"; -} - -.cuIcon-full:before { - content: "\e7bc"; -} - -.cuIcon-mail:before { - content: "\e7bd"; -} - -.cuIcon-peoplelist:before { - content: "\e7be"; -} - -.cuIcon-goodsnewfill:before { - content: "\e7bf"; -} - -.cuIcon-goodsnew:before { - content: "\e7c0"; -} - -.cuIcon-medalfill:before { - content: "\e7c1"; -} - -.cuIcon-medal:before { - content: "\e7c2"; -} - -.cuIcon-newsfill:before { - content: "\e7c3"; -} - -.cuIcon-newshotfill:before { - content: "\e7c4"; -} - -.cuIcon-newshot:before { - content: "\e7c5"; -} - -.cuIcon-news:before { - content: "\e7c6"; -} - -.cuIcon-videofill:before { - content: "\e7c7"; -} - -.cuIcon-video:before { - content: "\e7c8"; -} - -.cuIcon-exit:before { - content: "\e7cb"; -} - -.cuIcon-skinfill:before { - content: "\e7cc"; -} - -.cuIcon-skin:before { - content: "\e7cd"; -} - -.cuIcon-moneybagfill:before { - content: "\e7ce"; -} - -.cuIcon-usefullfill:before { - content: "\e7cf"; -} - -.cuIcon-usefull:before { - content: "\e7d0"; -} - -.cuIcon-moneybag:before { - content: "\e7d1"; -} - -.cuIcon-redpacket_fill:before { - content: "\e7d3"; -} - -.cuIcon-subscription:before { - content: "\e7d4"; -} - -.cuIcon-loading1:before { - content: "\e633"; -} - -.cuIcon-github:before { - content: "\e692"; -} - -.cuIcon-global:before { - content: "\e7eb"; -} - -.cuIcon-settingsfill:before { - content: "\e6ab"; -} - -.cuIcon-back_android:before { - content: "\e7ed"; -} - -.cuIcon-expressman:before { - content: "\e7ef"; -} - -.cuIcon-evaluate_fill:before { - content: "\e7f0"; -} - -.cuIcon-group_fill:before { - content: "\e7f5"; -} - -.cuIcon-play_forward_fill:before { - content: "\e7f6"; -} - -.cuIcon-deliver_fill:before { - content: "\e7f7"; -} - -.cuIcon-notice_forbid_fill:before { - content: "\e7f8"; -} - -.cuIcon-fork:before { - content: "\e60c"; -} - -.cuIcon-pick:before { - content: "\e7fa"; -} - -.cuIcon-wenzi:before { - content: "\e6a7"; -} - -.cuIcon-ellipse:before { - content: "\e600"; -} - -.cuIcon-qr_code:before { - content: "\e61b"; -} - -.cuIcon-dianhua:before { - content: "\e64d"; -} - -.cuIcon-icon:before { - content: "\e602"; -} - -.cuIcon-loading2:before { - content: "\e7f1"; -} - -.cuIcon-btn:before { - content: "\e601"; -} diff --git a/colorui/main.wxss b/colorui/main.wxss deleted file mode 100644 index 6b8cc76..0000000 --- a/colorui/main.wxss +++ /dev/null @@ -1,3990 +0,0 @@ -/* ================== - 初始化 - ==================== */ -page { - /* Color 可以自定义相关配色 */ - /* var属性兼容性 --> https://www.caniuse.com/#feat=css-variables */ - /* 标准色 */ - --red: #e54d42; - --orange: #f37b1d; - --yellow: #fbbd08; - --olive: #8dc63f; - --green: #39b54a; - --cyan: #1cbbb4; - --blue: #0081ff; - --purple: #6739b6; - --mauve: #9c26b0; - --pink: #e03997; - --brown: #a5673f; - --grey: #8799a3; - --black: #333333; - --darkGray: #666666; - --gray: #aaaaaa; - --ghostWhite: #f1f1f1; - --white: #ffffff; - --wegreen: #7acfa6; - /* 浅色 */ - --redLight: #fadbd9; - --orangeLight: #fde6d2; - --yellowLight: #fef2ce; - --oliveLight: #e8f4d9; - --greenLight: #d7f0db; - --cyanLight: #d2f1f0; - --blueLight: #cce6ff; - --purpleLight: #e1d7f0; - --mauveLight: #ebd4ef; - --pinkLight: #f9d7ea; - --brownLight: #ede1d9; - --greyLight: #e7ebed; - /* 渐变色 */ - --gradualRed: linear-gradient(45deg, #f43f3b, #ec008c); - --gradualOrange: linear-gradient(45deg, #ff9700, #ed1c24); - --gradualGreen: linear-gradient(45deg, #39b54a, #8dc63f); - --gradualPurple: linear-gradient(45deg, #9000ff, #5e00ff); - --gradualPink: linear-gradient(45deg, #ec008c, #6739b6); - --gradualBlue: linear-gradient(45deg, #0081ff, #1cbbb4); - /* 阴影透明色 */ - --ShadowSize: 6rpx 6rpx 8rpx; - --redShadow: rgba(204, 69, 59, 0.2); - --orangeShadow: rgba(217, 109, 26, 0.2); - --yellowShadow: rgba(224, 170, 7, 0.2); - --oliveShadow: rgba(124, 173, 55, 0.2); - --greenShadow: rgba(48, 156, 63, 0.2); - --cyanShadow: rgba(28, 187, 180, 0.2); - --blueShadow: rgba(0, 102, 204, 0.2); - --purpleShadow: rgba(88, 48, 156, 0.2); - --mauveShadow: rgba(133, 33, 150, 0.2); - --pinkShadow: rgba(199, 50, 134, 0.2); - --brownShadow: rgba(140, 88, 53, 0.2); - --greyShadow: rgba(114, 130, 138, 0.2); - --grayShadow: rgba(114, 130, 138, 0.2); - --blackShadow: rgba(26, 26, 26, 0.2); - - background-color: var(--ghostWhite); - font-size: 28rpx; - color: var(--black); - font-family: Helvetica Neue, Helvetica, sans-serif; -} - -view, -scroll-view, -swiper, -button, -input, -textarea, -label, -navigator, -image { - box-sizing: border-box; -} - -.round { - border-radius: 5000rpx; -} - -.radius { - border-radius: 15rpx; -} - -.radius-left { - border-bottom-left-radius: 15rpx; - border-top-left-radius: 15rpx; -} - -.radius-right { - border-bottom-right-radius: 15rpx; - border-top-right-radius: 15rpx; -} - -.radius-top { - border-top-left-radius: 15rpx; - border-top-right-radius: 15rpx; -} - -.radius-bottom { - border-bottom-left-radius: 15rpx; - border-bottom-right-radius: 15rpx; -} - -/* ================== - 图片 - ==================== */ - -image { - max-width: 100%; - display: inline-block; - position: relative; - z-index: 0; -} - -image.loading::before { - content: ""; - background-color: #f5f5f5; - display: block; - position: absolute; - width: 100%; - height: 100%; - z-index: -2; -} - -image.loading::after { - content: "\e7f1"; - font-family: "cuIcon"; - position: absolute; - top: 0; - left: 0; - width: 32rpx; - height: 32rpx; - line-height: 32rpx; - right: 0; - bottom: 0; - z-index: -1; - font-size: 32rpx; - margin: auto; - color: #ccc; - -webkit-animation: cuIcon-spin 2s infinite linear; - animation: cuIcon-spin 2s infinite linear; - display: block; -} - -.response { - width: 100%; -} - -/* ================== - 开关 - ==================== */ - -switch, -checkbox, -radio { - position: relative; -} - -switch::after, -switch::before { - font-family: "cuIcon"; - content: "\e645"; - position: absolute; - color: var(--white) !important; - top: 0%; - left: 0rpx; - font-size: 26rpx; - line-height: 26px; - width: 50%; - text-align: center; - pointer-events: none; - transform: scale(0, 0); - transition: all 0.3s ease-in-out 0s; - z-index: 9; - bottom: 0; - height: 26px; - margin: auto; -} - -switch::before { - content: "\e646"; - right: 0; - transform: scale(1, 1); - left: auto; -} - -switch[checked]::after, -switch.checked::after { - transform: scale(1, 1); -} - -switch[checked]::before, -switch.checked::before { - transform: scale(0, 0); -} - -switch[checked]::before { - transform: scale(0, 0); -} - -radio::before, -checkbox::before { - font-family: "cuIcon"; - content: "\e645"; - position: absolute; - color: var(--white) !important; - top: 50%; - margin-top: -8px; - right: 5px; - font-size: 32rpx; - line-height: 16px; - pointer-events: none; - transform: scale(1, 1); - transition: all 0.3s ease-in-out 0s; - z-index: 9; -} - -radio .wx-radio-input, -checkbox .wx-checkbox-input { - margin: 0; - width: 24px; - height: 24px; -} - -checkbox.round .wx-checkbox-input { - border-radius: 100rpx; -} - -switch .wx-switch-input { - border: none; - padding: 0 24px; - width: 48px; - height: 26px; - margin: 0; - border-radius: 100rpx; -} - -switch .wx-switch-input:not([class*="bg-"]) { - background: var(--grey) !important; -} - -switch .wx-switch-input::after { - margin: auto; - width: 26px; - height: 26px; - border-radius: 100rpx; - left: 0rpx; - top: 0rpx; - bottom: 0rpx; - position: absolute; - transform: scale(0.9, 0.9); - transition: all 0.1s ease-in-out 0s; -} - -switch .wx-switch-input.wx-switch-input-checked::after { - margin: auto; - left: 22px; - box-shadow: none; - transform: scale(0.9, 0.9); -} - -radio-group { - display: inline-block; -} - - - -switch.radius .wx-switch-input::after, -switch.radius .wx-switch-input, -switch.radius .wx-switch-input::before { - border-radius: 10rpx; -} - -switch .wx-switch-input::before, -radio.radio::before, -checkbox .wx-checkbox-input::before, -radio .wx-radio-input::before, -radio.radio::before { - display: none; -} - -radio.radio[checked]::after { - content: ""; - background-color: transparent; - display: block; - position: absolute; - width: 8px; - height: 8px; - z-index: 999; - top: 0rpx; - left: 0rpx; - right: 0; - bottom: 0; - margin: auto; - border-radius: 200rpx; - border: 8px solid var(--white) !important; -} - -.switch-sex::after { - content: "\e71c"; -} - -.switch-sex::before { - content: "\e71a"; -} - -.switch-sex .wx-switch-input { - background: var(--red) !important; - border-color: var(--red) !important; -} - -.switch-sex[checked] .wx-switch-input { - background: var(--blue) !important; - border-color: var(--blue) !important; -} - -switch.red[checked] .wx-switch-input, -checkbox.red[checked] .wx-checkbox-input, -radio.red[checked] .wx-radio-input { - border-color: var(--red) !important; -} - -switch.orange[checked] .wx-switch-input, -checkbox.orange[checked] .wx-checkbox-input, -radio.orange[checked] .wx-radio-input { - border-color: var(--orange) !important; -} - -switch.yellow[checked] .wx-switch-input, -checkbox.yellow[checked] .wx-checkbox-input, -radio.yellow[checked] .wx-radio-input { - border-color: var(--yellow) !important; -} - -switch.olive[checked] .wx-switch-input, -checkbox.olive[checked] .wx-checkbox-input, -radio.olive[checked] .wx-radio-input { - border-color: var(--olive) !important; -} - -switch.green[checked] .wx-switch-input, -checkbox.green[checked] .wx-checkbox-input, -checkbox[checked] .wx-checkbox-input, -radio.green[checked] .wx-radio-input { - border-color: var(--green) !important; -} - -switch.cyan[checked] .wx-switch-input, -checkbox.cyan[checked] .wx-checkbox-input, -radio.cyan[checked] .wx-radio-input { - border-color: var(--cyan) !important; -} - -switch.blue[checked] .wx-switch-input, -checkbox.blue[checked] .wx-checkbox-input, -radio.blue[checked] .wx-radio-input { - border-color: var(--blue) !important; -} - -switch.purple[checked] .wx-switch-input, -checkbox.purple[checked] .wx-checkbox-input, -radio.purple[checked] .wx-radio-input { - border-color: var(--purple) !important; -} - -switch.mauve[checked] .wx-switch-input, -checkbox.mauve[checked] .wx-checkbox-input, -radio.mauve[checked] .wx-radio-input { - border-color: var(--mauve) !important; -} - -switch.pink[checked] .wx-switch-input, -checkbox.pink[checked] .wx-checkbox-input, -radio.pink[checked] .wx-radio-input { - border-color: var(--pink) !important; -} - -switch.brown[checked] .wx-switch-input, -checkbox.brown[checked] .wx-checkbox-input, -radio.brown[checked] .wx-radio-input { - border-color: var(--brown) !important; -} - -switch.grey[checked] .wx-switch-input, -checkbox.grey[checked] .wx-checkbox-input, -radio.grey[checked] .wx-radio-input { - border-color: var(--grey) !important; -} - -switch.gray[checked] .wx-switch-input, -checkbox.gray[checked] .wx-checkbox-input, -radio.gray[checked] .wx-radio-input { - border-color: var(--grey) !important; -} - -switch.black[checked] .wx-switch-input, -checkbox.black[checked] .wx-checkbox-input, -radio.black[checked] .wx-radio-input { - border-color: var(--black) !important; -} - -switch.white[checked] .wx-switch-input, -checkbox.white[checked] .wx-checkbox-input, -radio.white[checked] .wx-radio-input { - border-color: var(--white) !important; -} - -switch.red[checked] .wx-switch-input.wx-switch-input-checked, -checkbox.red[checked] .wx-checkbox-input, -radio.red[checked] .wx-radio-input { - background-color: var(--red) !important; - color: var(--white) !important; -} - -switch.orange[checked] .wx-switch-input, -checkbox.orange[checked] .wx-checkbox-input, -radio.orange[checked] .wx-radio-input { - background-color: var(--orange) !important; - color: var(--white) !important; -} - -switch.yellow[checked] .wx-switch-input, -checkbox.yellow[checked] .wx-checkbox-input, -radio.yellow[checked] .wx-radio-input { - background-color: var(--yellow) !important; - color: var(--black) !important; -} - -switch.olive[checked] .wx-switch-input, -checkbox.olive[checked] .wx-checkbox-input, -radio.olive[checked] .wx-radio-input { - background-color: var(--olive) !important; - color: var(--white) !important; -} - -switch.green[checked] .wx-switch-input, -switch[checked] .wx-switch-input, -checkbox.green[checked] .wx-checkbox-input, -checkbox[checked] .wx-checkbox-input, -radio.green[checked] .wx-radio-input, -radio[checked] .wx-radio-input { - background-color: var(--green) !important; - color: var(--white) !important; -} - -switch.cyan[checked] .wx-switch-input, -checkbox.cyan[checked] .wx-checkbox-input, -radio.cyan[checked] .wx-radio-input { - background-color: var(--cyan) !important; - color: var(--white) !important; -} - -switch.blue[checked] .wx-switch-input, -checkbox.blue[checked] .wx-checkbox-input, -radio.blue[checked] .wx-radio-input { - background-color: var(--blue) !important; - color: var(--white) !important; -} - -switch.purple[checked] .wx-switch-input, -checkbox.purple[checked] .wx-checkbox-input, -radio.purple[checked] .wx-radio-input { - background-color: var(--purple) !important; - color: var(--white) !important; -} - -switch.mauve[checked] .wx-switch-input, -checkbox.mauve[checked] .wx-checkbox-input, -radio.mauve[checked] .wx-radio-input { - background-color: var(--mauve) !important; - color: var(--white) !important; -} - -switch.pink[checked] .wx-switch-input, -checkbox.pink[checked] .wx-checkbox-input, -radio.pink[checked] .wx-radio-input { - background-color: var(--pink) !important; - color: var(--white) !important; -} - -switch.brown[checked] .wx-switch-input, -checkbox.brown[checked] .wx-checkbox-input, -radio.brown[checked] .wx-radio-input { - background-color: var(--brown) !important; - color: var(--white) !important; -} - -switch.grey[checked] .wx-switch-input, -checkbox.grey[checked] .wx-checkbox-input, -radio.grey[checked] .wx-radio-input { - background-color: var(--grey) !important; - color: var(--white) !important; -} - -switch.gray[checked] .wx-switch-input, -checkbox.gray[checked] .wx-checkbox-input, -radio.gray[checked] .wx-radio-input { - background-color: #f0f0f0 !important; - color: var(--black) !important; -} - -switch.black[checked] .wx-switch-input, -checkbox.black[checked] .wx-checkbox-input, -radio.black[checked] .wx-radio-input { - background-color: var(--black) !important; - color: var(--white) !important; -} - -switch.white[checked] .wx-switch-input, -checkbox.white[checked] .wx-checkbox-input, -radio.white[checked] .wx-radio-input { - background-color: var(--white) !important; - color: var(--black) !important; -} - -/* ================== - 边框 - ==================== */ - -/* -- 实线 -- */ - -.solid, -.solid-top, -.solid-right, -.solid-bottom, -.solid-left, -.solids, -.solids-top, -.solids-right, -.solids-bottom, -.solids-left, -.dashed, -.dashed-top, -.dashed-right, -.dashed-bottom, -.dashed-left { - position: relative; -} - -.solid::after, -.solid-top::after, -.solid-right::after, -.solid-bottom::after, -.solid-left::after, -.solids::after, -.solids-top::after, -.solids-right::after, -.solids-bottom::after, -.solids-left::after, -.dashed::after, -.dashed-top::after, -.dashed-right::after, -.dashed-bottom::after, -.dashed-left::after { - content: " "; - width: 200%; - height: 200%; - position: absolute; - top: 0; - left: 0; - border-radius: inherit; - transform: scale(0.5); - transform-origin: 0 0; - pointer-events: none; - box-sizing: border-box; -} - -.solid::after { - border: 1rpx solid rgba(0, 0, 0, 0.1); -} - -.solid-top::after { - border-top: 1rpx solid rgba(0, 0, 0, 0.1); -} - -.solid-right::after { - border-right: 1rpx solid rgba(0, 0, 0, 0.1); -} - -.solid-bottom::after { - border-bottom: 1rpx solid rgba(0, 0, 0, 0.1); -} - -.solid-left::after { - border-left: 1rpx solid rgba(0, 0, 0, 0.1); -} - -.solids::after { - border: 8rpx solid #eee; -} - -.solids-top::after { - border-top: 8rpx solid #eee; -} - -.solids-right::after { - border-right: 8rpx solid #eee; -} - -.solids-bottom::after { - border-bottom: 8rpx solid #eee; -} - -.solids-left::after { - border-left: 8rpx solid #eee; -} - -/* -- 虚线 -- */ - -.dashed::after { - border: 1rpx dashed #ddd; -} - -.dashed-top::after { - border-top: 1rpx dashed #ddd; -} - -.dashed-right::after { - border-right: 1rpx dashed #ddd; -} - -.dashed-bottom::after { - border-bottom: 1rpx dashed #ddd; -} - -.dashed-left::after { - border-left: 1rpx dashed #ddd; -} - -/* -- 阴影 -- */ - -.shadow[class*='white'] { - --ShadowSize: 0 1rpx 6rpx; -} - -.shadow-lg { - --ShadowSize: 0rpx 40rpx 100rpx 0rpx; -} - -.shadow-warp { - position: relative; - box-shadow: 0 0 10rpx rgba(0, 0, 0, 0.1); -} - -.shadow-warp:before, -.shadow-warp:after { - position: absolute; - content: ""; - top: 20rpx; - bottom: 30rpx; - left: 20rpx; - width: 50%; - box-shadow: 0 30rpx 20rpx rgba(0, 0, 0, 0.2); - transform: rotate(-3deg); - z-index: -1; -} - -.shadow-warp:after { - right: 20rpx; - left: auto; - transform: rotate(3deg); -} - -.shadow-blur { - position: relative; -} - -.shadow-blur::before { - content: ""; - display: block; - background: inherit; - filter: blur(10rpx); - position: absolute; - width: 100%; - height: 100%; - top: 10rpx; - left: 10rpx; - z-index: -1; - opacity: 0.4; - transform-origin: 0 0; - border-radius: inherit; - transform: scale(1, 1); -} - -/* ================== - 按钮 - ==================== */ - -.cu-btn { - position: relative; - border: 0rpx; - display: inline-flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - padding: 0 30rpx; - font-size: 28rpx; - height: 64rpx; - line-height: 1; - text-align: center; - text-decoration: none; - overflow: visible; - margin-left: initial; - transform: translate(0rpx, 0rpx); - margin-right: initial; -} - -.cu-btn::after { - display: none; -} - -.cu-btn:not([class*="bg-"]) { - background-color: #f0f0f0; -} - -.cu-btn[class*="line"] { - background-color: transparent; -} - -.cu-btn[class*="line"]::after { - content: " "; - display: block; - width: 200%; - height: 200%; - position: absolute; - top: 0; - left: 0; - border: 1rpx solid currentColor; - transform: scale(0.5); - transform-origin: 0 0; - box-sizing: border-box; - border-radius: 12rpx; - z-index: 1; - pointer-events: none; -} - -.cu-btn.round[class*="line"]::after { - border-radius: 1000rpx; -} - -.cu-btn[class*="lines"]::after { - border: 6rpx solid currentColor; -} - -.cu-btn[class*="bg-"]::after { - display: none; -} - -.cu-btn.sm { - padding: 0 20rpx; - font-size: 20rpx; - height: 48rpx; -} - -.cu-btn.lg { - padding: 0 40rpx; - font-size: 32rpx; - height: 80rpx; -} - -.cu-btn.icon.sm { - width: 48rpx; - height: 48rpx; -} - -.cu-btn.icon { - width: 64rpx; - height: 64rpx; - border-radius: 500rpx; - padding: 0; -} - -button.icon.lg { - width: 80rpx; - height: 80rpx; -} - -.cu-btn.shadow-blur::before { - top: 4rpx; - left: 4rpx; - filter: blur(6rpx); - opacity: 0.6; -} - -.cu-btn.button-hover { - transform: translate(1rpx, 1rpx); -} - -.block { - display: block; -} - -.cu-btn.block { - display: flex; -} - -.cu-btn[disabled] { - opacity: 0.6; - color: var(--white); -} - -/* ================== - 徽章 - ==================== */ - -.cu-tag { - font-size: 24rpx; - vertical-align: middle; - position: relative; - display: inline-flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - padding: 0rpx 16rpx; - height: 48rpx; - font-family: Helvetica Neue, Helvetica, sans-serif; - white-space: nowrap; -} - -.cu-tag:not([class*="bg"]):not([class*="line"]) { - background-color: var(--ghostWhite); -} - -.cu-tag[class*="line-"]::after { - content: " "; - width: 200%; - height: 200%; - position: absolute; - top: 0; - left: 0; - border: 1rpx solid currentColor; - transform: scale(0.5); - transform-origin: 0 0; - box-sizing: border-box; - border-radius: inherit; - z-index: 1; - pointer-events: none; -} - -.cu-tag.radius[class*="line"]::after { - border-radius: 12rpx; -} - -.cu-tag.round[class*="line"]::after { - border-radius: 1000rpx; -} - -.cu-tag[class*="line-"]::after { - border-radius: 0; -} - -.cu-tag+.cu-tag { - margin-left: 10rpx; -} - -.cu-tag.sm { - font-size: 20rpx; - padding: 0rpx 12rpx; - height: 32rpx; -} - -.cu-capsule { - display: inline-flex; - vertical-align: middle; -} - -.cu-capsule+.cu-capsule { - margin-left: 10rpx; -} - -.cu-capsule .cu-tag { - margin: 0; -} - -.cu-capsule .cu-tag[class*="line-"]:last-child::after { - border-left: 0rpx solid transparent; -} - -.cu-capsule .cu-tag[class*="line-"]:first-child::after { - border-right: 0rpx solid transparent; -} - -.cu-capsule.radius .cu-tag:first-child { - border-top-left-radius: 6rpx; - border-bottom-left-radius: 6rpx; -} - -.cu-capsule.radius .cu-tag:last-child::after, -.cu-capsule.radius .cu-tag[class*="line-"] { - border-top-right-radius: 12rpx; - border-bottom-right-radius: 12rpx; -} - -.cu-capsule.round .cu-tag:first-child { - border-top-left-radius: 200rpx; - border-bottom-left-radius: 200rpx; - text-indent: 4rpx; -} - -.cu-capsule.round .cu-tag:last-child::after, -.cu-capsule.round .cu-tag:last-child { - border-top-right-radius: 200rpx; - border-bottom-right-radius: 200rpx; - text-indent: -4rpx; -} - -.cu-tag.badge { - border-radius: 200rpx; - position: absolute; - top: -10rpx; - right: -10rpx; - font-size: 20rpx; - padding: 0rpx 10rpx; - height: 28rpx; - color: var(--white); -} - -.cu-tag.badge:not([class*="bg-"]) { - background-color: #dd514c; -} - -.cu-tag:empty:not([class*="cuIcon-"]) { - padding: 0rpx; - width: 16rpx; - height: 16rpx; - top: -4rpx; - right: -4rpx; -} - -.cu-tag[class*="cuIcon-"] { - width: 32rpx; - height: 32rpx; - top: -4rpx; - right: -4rpx; -} - -/* ================== - 头像 - ==================== */ - -.cu-avatar { - font-variant: small-caps; - margin: 0; - padding: 0; - display: inline-flex; - text-align: center; - justify-content: center; - align-items: center; - background-color: #ccc; - color: var(--white); - white-space: nowrap; - position: relative; - width: 64rpx; - height: 64rpx; - background-size: cover; - background-position: center; - vertical-align: middle; - font-size: 1.5em; -} - -.cu-avatar.sm { - width: 48rpx; - height: 48rpx; - font-size: 1em; -} - -.cu-avatar.lg { - width: 96rpx; - height: 96rpx; - font-size: 2em; -} - -.cu-avatar.xl { - width: 128rpx; - height: 128rpx; - font-size: 2.5em; -} - -.cu-avatar.xxl { - width: 168rpx; - height: 168rpx; - font-size: 3em; -} - -.cu-avatar.xxl { - width: 256rpx; - height: 256rpx; - font-size: 3.5em; -} - -.cu-avatar .avatar-text { - font-size: 0.4em; -} - -.cu-avatar-group { - direction: rtl; - unicode-bidi: bidi-override; - padding: 0 10rpx 0 40rpx; - display: inline-block; -} - -.cu-avatar-group .cu-avatar { - margin-left: -30rpx; - border: 4rpx solid var(--ghostWhite); - vertical-align: middle; -} - -.cu-avatar-group .cu-avatar.sm { - margin-left: -20rpx; - border: 1rpx solid var(--ghostWhite); -} - -/* ================== - 进度条 - ==================== */ - -.cu-progress { - overflow: hidden; - height: 28rpx; - background-color: #ebeef5; - display: inline-flex; - align-items: center; - width: 100%; -} - -.cu-progress+view, -.cu-progress+text { - line-height: 1; -} - -.cu-progress.xs { - height: 10rpx; -} - -.cu-progress.sm { - height: 20rpx; -} - -.cu-progress view { - width: 0; - height: 100%; - align-items: center; - display: flex; - justify-items: flex-end; - justify-content: space-around; - font-size: 20rpx; - color: var(--white); - transition: width 0.6s ease; -} - -.cu-progress text { - align-items: center; - display: flex; - font-size: 20rpx; - color: var(--black); - text-indent: 10rpx; -} - -.cu-progress.text-progress { - padding-right: 60rpx; -} - -.cu-progress.striped view { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 72rpx 72rpx; -} - -.cu-progress.active view { - animation: progress-stripes 2s linear infinite; -} - -@keyframes progress-stripes { - from { - background-position: 72rpx 0; - } - - to { - background-position: 0 0; - } -} - -/* ================== - 加载 - ==================== */ - -.cu-load { - display: block; - line-height: 3em; - text-align: center; -} - -.cu-load::before { - font-family: "cuIcon"; - display: inline-block; - margin-right: 6rpx; -} - -.cu-load.loading::before { - content: "\e67a"; - animation: cuIcon-spin 2s infinite linear; -} - -.cu-load.loading::after { - content: "加载中..."; -} - -.cu-load.over::before { - content: "\e64a"; -} - -.cu-load.over::after { - content: "没有更多了"; -} - -.cu-load.erro::before { - content: "\e658"; -} - -.cu-load.erro::after { - content: "加载失败"; -} - -.cu-load.load-icon::before { - font-size: 32rpx; -} - -.cu-load.load-icon::after { - display: none; -} - -.cu-load.load-icon.over { - display: none; -} - -.cu-load.load-modal { - position: fixed; - top: 0; - right: 0; - bottom: 140rpx; - left: 0; - margin: auto; - width: 260rpx; - height: 260rpx; - background-color: var(--white); - border-radius: 10rpx; - box-shadow: 0 0 0rpx 2000rpx rgba(0, 0, 0, 0.5); - display: flex; - align-items: center; - flex-direction: column; - justify-content: center; - font-size: 28rpx; - z-index: 9999; - line-height: 2.4em; -} - -.cu-load.load-modal [class*="cuIcon-"] { - font-size: 60rpx; -} - -.cu-load.load-modal image { - width: 70rpx; - height: 70rpx; -} - -.cu-load.load-modal::after { - content: ""; - position: absolute; - background-color: var(--white); - border-radius: 50%; - width: 200rpx; - height: 200rpx; - font-size: 10px; - border-top: 6rpx solid rgba(0, 0, 0, 0.05); - border-right: 6rpx solid rgba(0, 0, 0, 0.05); - border-bottom: 6rpx solid rgba(0, 0, 0, 0.05); - border-left: 6rpx solid var(--orange); - animation: cuIcon-spin 1s infinite linear; - z-index: -1; -} - -.load-progress { - pointer-events: none; - top: 0; - position: fixed; - width: 100%; - left: 0; - z-index: 2000; -} - -.load-progress.hide { - display: none; -} - -.load-progress .load-progress-bar { - position: relative; - width: 100%; - height: 4rpx; - overflow: hidden; - transition: all 200ms ease 0s; -} - -.load-progress .load-progress-spinner { - position: absolute; - top: 10rpx; - right: 10rpx; - z-index: 2000; - display: block; -} - -.load-progress .load-progress-spinner::after { - content: ""; - display: block; - width: 24rpx; - height: 24rpx; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border: solid 4rpx transparent; - border-top-color: inherit; - border-left-color: inherit; - border-radius: 50%; - -webkit-animation: load-progress-spinner 0.4s linear infinite; - animation: load-progress-spinner 0.4s linear infinite; -} - -@-webkit-keyframes load-progress-spinner { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes load-progress-spinner { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -/* ================== - 列表 - ==================== */ -.grayscale { - filter: grayscale(1); -} - -.cu-list+.cu-list { - margin-top: 30rpx -} - -.cu-list>.cu-item { - transition: all .6s ease-in-out 0s; - transform: translateX(0rpx) -} - -.cu-list>.cu-item.move-cur { - transform: translateX(-260rpx) -} - -.cu-list>.cu-item .move { - position: absolute; - right: 0; - display: flex; - width: 260rpx; - height: 100%; - transform: translateX(100%) -} - -.cu-list>.cu-item .move view { - display: flex; - flex: 1; - justify-content: center; - align-items: center -} - -.cu-list.menu-avatar { - overflow: hidden; -} - -.cu-list.menu-avatar>.cu-item { - position: relative; - display: flex; - padding-right: 10rpx; - height: 140rpx; - background-color: var(--white); - justify-content: flex-end; - align-items: center -} - -.cu-list.menu-avatar>.cu-item>.cu-avatar { - position: absolute; - left: 30rpx -} - -.cu-list.menu-avatar>.cu-item .flex .text-cut { - max-width: 510rpx -} - -.cu-list.menu-avatar>.cu-item .content { - position: absolute; - left: 146rpx; - width: calc(100% - 96rpx - 60rpx - 120rpx - 20rpx); - line-height: 1.6em; -} - -.cu-list.menu-avatar>.cu-item .content.flex-sub { - width: calc(100% - 96rpx - 60rpx - 20rpx); -} - -.cu-list.menu-avatar>.cu-item .content>view:first-child { - font-size: 30rpx; - display: flex; - align-items: center -} - -.cu-list.menu-avatar>.cu-item .content .cu-tag.sm { - display: inline-block; - margin-left: 10rpx; - height: 28rpx; - font-size: 16rpx; - line-height: 32rpx -} - -.cu-list.menu-avatar>.cu-item .action { - width: 100rpx; - text-align: center -} - -.cu-list.menu-avatar>.cu-item .action view+view { - margin-top: 10rpx -} - -.cu-list.menu-avatar.comment>.cu-item .content { - position: relative; - left: 0; - width: auto; - flex: 1; -} - -.cu-list.menu-avatar.comment>.cu-item { - padding: 30rpx 30rpx 30rpx 120rpx; - height: auto -} - -.cu-list.menu-avatar.comment .cu-avatar { - align-self: flex-start -} - -.cu-list.menu>.cu-item { - position: relative; - display: flex; - padding: 0 30rpx; - min-height: 100rpx; - background-color: var(--white); - justify-content: space-between; - align-items: center -} - -.cu-list.menu>.cu-item:last-child:after { - border: none -} - -.cu-list.menu>.cu-item:after { - position: absolute; - top: 0; - left: 0; - box-sizing: border-box; - width: 200%; - height: 200%; - border-bottom: 1rpx solid #ddd; - border-radius: inherit; - content: " "; - transform: scale(.5); - transform-origin: 0 0; - pointer-events: none -} - -.cu-list.menu>.cu-item.grayscale { - background-color: #f5f5f5 -} - -.cu-list.menu>.cu-item.cur { - background-color: #fcf7e9 -} - -.cu-list.menu>.cu-item.arrow { - padding-right: 90rpx -} - -.cu-list.menu>.cu-item.arrow:before { - position: absolute; - top: 0; - right: 30rpx; - bottom: 0; - display: block; - margin: auto; - width: 30rpx; - height: 30rpx; - color: var(--grey); - content: "\e6a3"; - text-align: center; - font-size: 34rpx; - font-family: "cuIcon"; - line-height: 30rpx -} - -.cu-list.menu>.cu-item button.content { - padding: 0; - background-color: transparent; - justify-content: flex-start -} - -.cu-list.menu>.cu-item button.content:after { - display: none -} - -.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar { - border-color: var(--white) -} - -.cu-list.menu>.cu-item .content>view:first-child { - display: flex; - align-items: center -} - -.cu-list.menu>.cu-item .content>text[class*=cuIcon] { - display: inline-block; - margin-right: 10rpx; - width: 1.6em; - text-align: center -} - -.cu-list.menu>.cu-item .content>image { - display: inline-block; - margin-right: 10rpx; - width: 1.6em; - height: 1.6em; - vertical-align: middle -} - -.cu-list.menu>.cu-item .content { - font-size: 30rpx; - line-height: 1.6em; - flex: 1 -} - -.cu-list.menu>.cu-item .content .cu-tag.sm { - display: inline-block; - margin-left: 10rpx; - height: 28rpx; - font-size: 16rpx; - line-height: 32rpx -} - -.cu-list.menu>.cu-item .action .cu-tag:empty { - right: 10rpx -} - -.cu-list.menu { - display: block; - overflow: hidden -} - -.cu-list.menu.sm-border>.cu-item:after { - left: 30rpx; - width: calc(200% - 120rpx) -} - -.cu-list.grid>.cu-item { - position: relative; - display: flex; - padding: 20rpx 0 30rpx; - transition-duration: 0s; - flex-direction: column -} - -.cu-list.grid>.cu-item:after { - position: absolute; - top: 0; - left: 0; - box-sizing: border-box; - width: 200%; - height: 200%; - border-right: 1px solid rgba(0, 0, 0, .1); - border-bottom: 1px solid rgba(0, 0, 0, .1); - border-radius: inherit; - content: " "; - transform: scale(.5); - transform-origin: 0 0; - pointer-events: none -} - -.cu-list.grid>.cu-item text { - display: block; - margin-top: 10rpx; - color: #888; - font-size: 26rpx; - line-height: 40rpx -} - -.cu-list.grid>.cu-item [class*=cuIcon] { - position: relative; - display: block; - margin-top: 20rpx; - width: 100%; - font-size: 48rpx -} - -.cu-list.grid>.cu-item .cu-tag { - right: auto; - left: 50%; - margin-left: 20rpx -} - -.cu-list.grid { - background-color: var(--white); - text-align: center -} - -.cu-list.grid.no-border>.cu-item { - padding-top: 10rpx; - padding-bottom: 20rpx -} - -.cu-list.grid.no-border>.cu-item:after { - border: none -} - -.cu-list.grid.no-border { - padding: 20rpx 10rpx -} - -.cu-list.grid.col-3>.cu-item:nth-child(3n):after, -.cu-list.grid.col-4>.cu-item:nth-child(4n):after, -.cu-list.grid.col-5>.cu-item:nth-child(5n):after { - border-right-width: 0 -} - -.cu-list.card-menu { - overflow: hidden; - margin-right: 30rpx; - margin-left: 30rpx; - border-radius: 20rpx -} - - -/* ================== - 操作条 - ==================== */ - -.cu-bar { - display: flex; - position: relative; - align-items: center; - min-height: 100rpx; - justify-content: space-between; -} - -.cu-bar .action { - display: flex; - align-items: center; - height: 100%; - justify-content: center; - max-width: 100%; -} - -.cu-bar .action.border-title { - position: relative; - top: -10rpx; -} - -.cu-bar .action.border-title text[class*="bg-"]:last-child { - position: absolute; - bottom: -0.5rem; - min-width: 2rem; - height: 6rpx; - left: 0; -} - -.cu-bar .action.sub-title { - position: relative; - top: -0.2rem; -} - -.cu-bar .action.sub-title text { - position: relative; - z-index: 1; -} - -.cu-bar .action.sub-title text[class*="bg-"]:last-child { - position: absolute; - display: inline-block; - bottom: -0.2rem; - border-radius: 6rpx; - width: 100%; - height: 0.6rem; - left: 0.6rem; - opacity: 0.3; - z-index: 0; -} - -.cu-bar .action.sub-title text[class*="text-"]:last-child { - position: absolute; - display: inline-block; - bottom: -0.7rem; - left: 0.5rem; - opacity: 0.2; - z-index: 0; - text-align: right; - font-weight: 900; - font-size: 36rpx; -} - -.cu-bar.justify-center .action.border-title text:last-child, -.cu-bar.justify-center .action.sub-title text:last-child { - left: 0; - right: 0; - margin: auto; - text-align: center; -} - -.cu-bar .action:first-child { - margin-left: 30rpx; - font-size: 30rpx; -} - -.cu-bar .action text.text-cut { - text-align: left; - width: 100%; -} - -.cu-bar .cu-avatar:first-child { - margin-left: 20rpx; -} - -.cu-bar .action:first-child>text[class*="cuIcon-"] { - margin-left: -0.3em; - margin-right: 0.3em; -} - -.cu-bar .action:last-child { - margin-right: 30rpx; -} - -.cu-bar .action>text[class*="cuIcon-"], -.cu-bar .action>view[class*="cuIcon-"] { - font-size: 36rpx; -} - -.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] { - margin-left: 0.5em; -} - -.cu-bar .content { - position: absolute; - text-align: center; - width: calc(100% - 340rpx); - left: 0; - right: 0; - bottom: 0; - top: 0; - margin: auto; - height: 60rpx; - font-size: 32rpx; - line-height: 60rpx; - cursor: none; - pointer-events: none; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.cu-bar.ios .content { - bottom: 7px; - height: 30px; - font-size: 32rpx; - line-height: 30px; -} - -.cu-bar.btn-group { - justify-content: space-around; -} - -.cu-bar.btn-group button { - padding: 20rpx 32rpx; -} - -.cu-bar.btn-group button { - flex: 1; - margin: 0 20rpx; - max-width: 50%; -} - -.cu-bar .search-form { - background-color: #f5f5f5; - line-height: 64rpx; - height: 64rpx; - font-size: 24rpx; - color: var(--black); - flex: 1; - display: flex; - align-items: center; - margin: 0 30rpx; -} - -.cu-bar .search-form+.action { - margin-right: 30rpx; -} - -.cu-bar .search-form input { - flex: 1; - padding-right: 30rpx; - height: 64rpx; - line-height: 64rpx; - font-size: 26rpx; - background-color: transparent; -} - -.cu-bar .search-form [class*="cuIcon-"] { - margin: 0 0.5em 0 0.8em; -} - -.cu-bar .search-form [class*="cuIcon-"]::before { - top: 0rpx; -} - -.cu-bar.fixed, -.nav.fixed { - position: fixed; - width: 100%; - top: 0; - z-index: 1024; - box-shadow: 0 1rpx 6rpx rgba(0, 0, 0, 0.1); -} - -.cu-bar.foot { - position: fixed; - width: 100%; - bottom: 0; - z-index: 1024; - box-shadow: 0 -1rpx 6rpx rgba(0, 0, 0, 0.1); -} - -.cu-bar.tabbar { - padding: 0; - height: calc(100rpx + env(safe-area-inset-bottom) / 2); - padding-bottom: calc(env(safe-area-inset-bottom) / 2); -} - -.cu-tabbar-height { - min-height: 100rpx; - height: calc(100rpx + env(safe-area-inset-bottom) / 2); -} - -.cu-bar.tabbar.shadow { - box-shadow: 0 -1rpx 6rpx rgba(0, 0, 0, 0.1); -} - -.cu-bar.tabbar .action { - font-size: 22rpx; - position: relative; - flex: 1; - text-align: center; - padding: 0; - display: block; - height: auto; - line-height: 1; - margin: 0; - overflow: initial; -} - -.cu-bar.tabbar.shop .action { - width: 140rpx; - flex: initial; -} - -.cu-bar.tabbar .action.add-action { - position: relative; - z-index: 2; - padding-top: 50rpx; - background-color: inherit; -} - -.cu-bar.tabbar .action.add-action [class*="cuIcon-"] { - position: absolute; - width: 70rpx; - z-index: 2; - height: 70rpx; - border-radius: 50%; - line-height: 70rpx; - font-size: 50rpx; - top: -35rpx; - left: 0; - right: 0; - margin: auto; - padding: 0; -} - -.cu-bar.tabbar .action.add-action::after { - content: ""; - position: absolute; - width: 100rpx; - height: 100rpx; - top: -50rpx; - left: 0; - right: 0; - margin: auto; - box-shadow: 0 -3rpx 8rpx rgba(0, 0, 0, 0.08); - border-radius: 50rpx; - background-color: inherit; - z-index: 0; -} - -.cu-bar.tabbar .action.add-action::before { - content: ""; - position: absolute; - width: 100rpx; - height: 30rpx; - bottom: 30rpx; - left: 0; - right: 0; - margin: auto; - background-color: inherit; - z-index: 1; -} - -.cu-bar.tabbar .btn-group { - flex: 1; - display: flex; - justify-content: space-around; - align-items: center; - padding: 0 10rpx; -} - -.cu-bar.tabbar button.action::after { - border: 0; -} - -.cu-bar.tabbar .action [class*="cuIcon-"] { - width: 100rpx; - position: relative; - display: block; - height: auto; - margin: 0 auto 10rpx; - text-align: center; - font-size: 40rpx; -} - -.cu-bar.tabbar .action .cuIcon-cu-image { - margin: 0 auto; -} - -.cu-bar.tabbar .action .cuIcon-cu-image image { - width: 50rpx; - height: 50rpx; - display: inline-block; -} - -.cu-bar.tabbar .submit { - align-items: center; - display: flex; - justify-content: center; - text-align: center; - position: relative; - flex: 2; - align-self: stretch; -} - -.cu-bar.tabbar .submit:last-child { - flex: 2.6; -} - -.cu-bar.tabbar .submit+.submit { - flex: 2; -} - -.cu-bar.tabbar.border .action::before { - content: " "; - width: 200%; - height: 200%; - position: absolute; - top: 0; - left: 0; - transform: scale(0.5); - transform-origin: 0 0; - border-right: 1rpx solid rgba(0, 0, 0, 0.1); - z-index: 3; -} - -.cu-bar.tabbar.border .action:last-child:before { - display: none; -} - -.cu-bar.input { - padding-right: 20rpx; - background-color: var(--white); -} - -.cu-bar.input input { - overflow: initial; - line-height: 64rpx; - height: 64rpx; - min-height: 64rpx; - flex: 1; - font-size: 30rpx; - margin: 0 20rpx; -} - -.cu-bar.input .action { - margin-left: 20rpx; -} - -.cu-bar.input .action [class*="cuIcon-"] { - font-size: 48rpx; -} - -.cu-bar.input input+.action { - margin-right: 20rpx; - margin-left: 0rpx; -} - -.cu-bar.input .action:first-child [class*="cuIcon-"] { - margin-left: 0rpx; -} - -.cu-custom { - display: block; - position: relative; -} - -.cu-custom .cu-bar .content { - width: calc(100% - 440rpx); -} - - -.cu-custom .cu-bar .content image { - height: 60rpx; - width: 240rpx; -} - -.cu-custom .cu-bar { - min-height: 0px; - padding-right: 220rpx; - box-shadow: 0rpx 0rpx 0rpx; - z-index: 9999; -} - -.cu-custom .cu-bar .border-custom { - position: relative; - background: rgba(0, 0, 0, 0.15); - border-radius: 1000rpx; - height: 30px; -} - -.cu-custom .cu-bar .border-custom::after { - content: " "; - width: 200%; - height: 200%; - position: absolute; - top: 0; - left: 0; - border-radius: inherit; - transform: scale(0.5); - transform-origin: 0 0; - pointer-events: none; - box-sizing: border-box; - border: 1rpx solid var(--white); - opacity: 0.5; -} - -.cu-custom .cu-bar .border-custom::before { - content: " "; - width: 1rpx; - height: 110%; - position: absolute; - top: 22.5%; - left: 0; - right: 0; - margin: auto; - transform: scale(0.5); - transform-origin: 0 0; - pointer-events: none; - box-sizing: border-box; - opacity: 0.6; - background-color: var(--white); -} - -.cu-custom .cu-bar .border-custom text { - display: block; - flex: 1; - margin: auto !important; - text-align: center; - font-size: 34rpx; -} - -/* ================== - 导航栏 - ==================== */ - -.nav { - white-space: nowrap; -} - -::-webkit-scrollbar { - display: none; -} - -.nav .cu-item { - height: 90rpx; - display: inline-block; - line-height: 90rpx; - margin: 0 10rpx; - padding: 0 20rpx; -} - -.nav .cu-item.cur { - border-bottom: 4rpx solid; -} - -/* ================== - 时间轴 - ==================== */ - -.cu-timeline { - display: block; - background-color: var(--white); -} - -.cu-timeline .cu-time { - width: 120rpx; - text-align: center; - padding: 20rpx 0; - font-size: 26rpx; - color: #888; - display: block; -} - -.cu-timeline>.cu-item { - padding: 30rpx 30rpx 30rpx 120rpx; - position: relative; - display: block; - z-index: 0; -} - -.cu-timeline>.cu-item:not([class*="text-"]) { - color: #ccc; -} - -.cu-timeline>.cu-item::after { - content: ""; - display: block; - position: absolute; - width: 1rpx; - background-color: #bbb; - left: 60rpx; - height: 100%; - top: 0; - z-index: 8; -} - -.cu-timeline>.cu-item::before { - font-family: "cuIcon"; - display: block; - position: absolute; - top: 36rpx; - z-index: 9; - background-color: var(--white); - width: 50rpx; - height: 50rpx; - text-align: center; - border: none; - line-height: 50rpx; - left: 36rpx; -} - -.cu-timeline>.cu-item:not([class*="cuIcon-"])::before { - content: "\e763"; -} - -.cu-timeline>.cu-item[class*="cuIcon-"]::before { - background-color: var(--white); - width: 50rpx; - height: 50rpx; - text-align: center; - border: none; - line-height: 50rpx; - left: 36rpx; -} - -.cu-timeline>.cu-item>.content { - padding: 30rpx; - border-radius: 6rpx; - display: block; - line-height: 1.6; -} - -.cu-timeline>.cu-item>.content:not([class*="bg-"]) { - background-color: var(--ghostWhite); - color: var(--black); -} - -.cu-timeline>.cu-item>.content+.content { - margin-top: 20rpx; -} - -/* ================== - 聊天 - ==================== */ - -.cu-chat { - display: flex; - flex-direction: column; -} - -.cu-chat .cu-item { - display: flex; - padding: 30rpx 30rpx 70rpx; - position: relative; -} - -.cu-chat .cu-item>.cu-avatar { - width: 80rpx; - height: 80rpx; -} - -.cu-chat .cu-item>.main { - max-width: calc(100% - 260rpx); - margin: 0 40rpx; - display: flex; - align-items: center; -} - -.cu-chat .cu-item>image { - height: 320rpx; -} - -.cu-chat .cu-item>.main .content { - padding: 20rpx; - border-radius: 6rpx; - display: inline-flex; - max-width: 100%; - align-items: center; - font-size: 30rpx; - position: relative; - min-height: 80rpx; - line-height: 40rpx; - text-align: left; -} - -.cu-chat .cu-item>.main .content:not([class*="bg-"]) { - background-color: var(--white); - color: var(--black); -} - -.cu-chat .cu-item .date { - position: absolute; - font-size: 24rpx; - color: var(--grey); - width: calc(100% - 320rpx); - bottom: 20rpx; - left: 160rpx; -} - -.cu-chat .cu-item .action { - padding: 0 30rpx; - display: flex; - align-items: center; -} - -.cu-chat .cu-item>.main .content::after { - content: ""; - top: 27rpx; - transform: rotate(45deg); - position: absolute; - z-index: 100; - display: inline-block; - overflow: hidden; - width: 24rpx; - height: 24rpx; - left: -12rpx; - right: initial; - background-color: inherit; -} - -.cu-chat .cu-item.self>.main .content::after { - left: auto; - right: -12rpx; -} - -.cu-chat .cu-item>.main .content::before { - content: ""; - top: 30rpx; - transform: rotate(45deg); - position: absolute; - z-index: -1; - display: inline-block; - overflow: hidden; - width: 24rpx; - height: 24rpx; - left: -12rpx; - right: initial; - background-color: inherit; - filter: blur(5rpx); - opacity: 0.3; -} - -.cu-chat .cu-item>.main .content:not([class*="bg-"])::before { - background-color: var(--black); - opacity: 0.1; -} - -.cu-chat .cu-item.self>.main .content::before { - left: auto; - right: -12rpx; -} - -.cu-chat .cu-item.self { - justify-content: flex-end; - text-align: right; -} - -.cu-chat .cu-info { - display: inline-block; - margin: 20rpx auto; - font-size: 24rpx; - padding: 8rpx 12rpx; - background-color: rgba(0, 0, 0, 0.2); - border-radius: 6rpx; - color: var(--white); - max-width: 400rpx; - line-height: 1.4; -} - -/* ================== - 卡片 - ==================== */ - -.cu-card { - display: block; - overflow: hidden; -} - -.cu-card>.cu-item { - display: block; - background-color: var(--white); - overflow: hidden; - border-radius: 10rpx; - margin: 30rpx; -} - -.cu-card>.cu-item.shadow-blur { - overflow: initial; -} - -.cu-card.no-card>.cu-item { - margin: 0rpx; - border-radius: 0rpx; -} - -.cu-card .grid.grid-square { - margin-bottom: -20rpx; -} - -.cu-card.case .image { - position: relative; -} - -.cu-card.case .image image { - width: 100%; -} - -.cu-card.case .image .cu-tag { - position: absolute; - right: 0; - top: 0; -} - -.cu-card.case .image .cu-bar { - position: absolute; - bottom: 0; - width: 100%; - background-color: transparent; - padding: 0rpx 30rpx; -} - -.cu-card.case.no-card .image { - margin: 30rpx 30rpx 0; - overflow: hidden; - border-radius: 10rpx; -} - -.cu-card.dynamic { - display: block; -} - -.cu-card.dynamic>.cu-item { - display: block; - background-color: var(--white); - overflow: hidden; -} - -.cu-card.dynamic>.cu-item>.text-content { - padding: 0 30rpx 0; - max-height: 6.4em; - overflow: hidden; - font-size: 30rpx; - margin-bottom: 20rpx; -} - -.cu-card.dynamic>.cu-item .square-img { - width: 100%; - height: 200rpx; - border-radius: 6rpx; -} - -.cu-card.dynamic>.cu-item .only-img { - width: 100%; - height: 320rpx; - border-radius: 6rpx; -} - -.cu-card.article { - display: block; -} - -.cu-card.article>.cu-item { - padding-bottom: 30rpx; -} - -.cu-card.article>.cu-item .title { - font-size: 30rpx; - font-weight: 900; - color: var(--black); - line-height: 100rpx; - padding: 0 30rpx; -} - -.cu-card.article>.cu-item .content { - display: flex; - padding: 0 30rpx; -} - -.cu-card.article>.cu-item .content>image { - width: 240rpx; - height: 6.4em; - margin-right: 20rpx; - border-radius: 6rpx; -} - -.cu-card.article>.cu-item .content .desc { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; -} - -.cu-card.article>.cu-item .content .text-content { - font-size: 28rpx; - color: #888; - height: 4.8em; - overflow: hidden; -} - -/* ================== - 表单 - ==================== */ - -.cu-form-group { - background-color: var(--white); - padding: 1rpx 30rpx; - display: flex; - align-items: center; - min-height: 100rpx; - justify-content: space-between; -} - -.cu-form-group+.cu-form-group { - border-top: 1rpx solid #eee; -} - -.cu-form-group .title { - text-align: justify; - padding-right: 30rpx; - font-size: 30rpx; - position: relative; - height: 60rpx; - line-height: 60rpx; -} - -.cu-form-group input { - flex: 1; - font-size: 30rpx; - color: #555; - padding-right: 20rpx; -} - -.cu-form-group>text[class*="cuIcon-"] { - font-size: 36rpx; - padding: 0; - box-sizing: border-box; -} - -.cu-form-group textarea { - margin: 32rpx 0 30rpx; - height: 4.6em; - width: 100%; - line-height: 1.2em; - flex: 1; - font-size: 28rpx; - padding: 0; -} - -.cu-form-group.align-start .title { - height: 1em; - margin-top: 32rpx; - line-height: 1em; -} - -.cu-form-group picker { - flex: 1; - padding-right: 40rpx; - overflow: hidden; - position: relative; -} - -.cu-form-group picker .picker { - line-height: 100rpx; - font-size: 28rpx; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - width: 100%; - text-align: right; -} - -.cu-form-group picker::after { - font-family: "cuIcon"; - display: block; - content: "\e6a3"; - position: absolute; - font-size: 34rpx; - color: var(--grey); - line-height: 100rpx; - width: 60rpx; - text-align: center; - top: 0; - bottom: 0; - right: -20rpx; - margin: auto; -} - -.cu-form-group textarea[disabled], -.cu-form-group textarea[disabled] .placeholder { - color: transparent; -} - -/* ================== - 模态窗口 - ==================== */ - -.cu-modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1110; - opacity: 0; - outline: 0; - text-align: center; - -ms-transform: scale(1.185); - transform: scale(1.185); - backface-visibility: hidden; - perspective: 2000rpx; - background: rgba(0, 0, 0, 0.6); - transition: all 0.3s ease-in-out 0s; - pointer-events: none; -} - -.cu-modal::before { - content: "\200B"; - display: inline-block; - height: 100%; - vertical-align: middle; -} - -.cu-modal.show { - opacity: 1; - transition-duration: 0.3s; - -ms-transform: scale(1); - transform: scale(1); - overflow-x: hidden; - overflow-y: auto; - pointer-events: auto; -} - -.cu-dialog { - position: relative; - display: inline-block; - vertical-align: middle; - margin-left: auto; - margin-right: auto; - width: 680rpx; - max-width: 100%; - background-color: #f8f8f8; - border-radius: 10rpx; - overflow: hidden; -} - -.cu-modal.bottom-modal::before { - vertical-align: bottom; -} - -.cu-modal.bottom-modal .cu-dialog { - width: 100%; - border-radius: 0; -} - -.cu-modal.bottom-modal { - margin-bottom: -1000rpx; -} - -.cu-modal.bottom-modal.show { - margin-bottom: 0; -} - -.cu-modal.drawer-modal { - transform: scale(1); - display: flex; -} - -.cu-modal.drawer-modal .cu-dialog { - height: 100%; - min-width: 200rpx; - border-radius: 0; - margin: initial; - transition-duration: 0.3s; -} - -.cu-modal.drawer-modal.justify-start .cu-dialog { - transform: translateX(-100%); -} - -.cu-modal.drawer-modal.justify-end .cu-dialog { - transform: translateX(100%); -} - -.cu-modal.drawer-modal.show .cu-dialog { - transform: translateX(0%); -} -.cu-modal .cu-dialog>.cu-bar:first-child .action{ - min-width: 100rpx; - margin-right: 0; - min-height: 100rpx; -} -/* ================== - 轮播 - ==================== */ -swiper .a-swiper-dot { - display: inline-block; - width: 16rpx; - height: 16rpx; - background: rgba(0, 0, 0, .3); - border-radius: 50%; - vertical-align: middle; -} - -swiper[class*="-dot"] .wx-swiper-dots { - display: flex; - align-items: center; - width: 100%; - justify-content: center; -} - -swiper.square-dot .wx-swiper-dot { - background-color: var(--white); - opacity: 0.4; - width: 10rpx; - height: 10rpx; - border-radius: 20rpx; - margin: 0 8rpx !important; -} - -swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active { - opacity: 1; - width: 30rpx; -} - -swiper.round-dot .wx-swiper-dot { - width: 10rpx; - height: 10rpx; - position: relative; - margin: 4rpx 8rpx !important; -} - -swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after { - content: ""; - position: absolute; - width: 10rpx; - height: 10rpx; - top: 0rpx; - left: 0rpx; - right: 0; - bottom: 0; - margin: auto; - background-color: var(--white); - border-radius: 20rpx; -} - -swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active { - width: 18rpx; - height: 18rpx; -} - -.screen-swiper { - min-height: 375rpx; -} - -.screen-swiper image, -.screen-swiper video, -.swiper-item image, -.swiper-item video { - width: 100%; - display: block; - height: 100%; - margin: 0; - pointer-events: none; -} - -.card-swiper { - height: 420rpx !important; -} - -.card-swiper swiper-item { - width: 610rpx !important; - left: 70rpx; - box-sizing: border-box; - padding: 40rpx 0rpx 70rpx; - overflow: initial; -} - -.card-swiper swiper-item .swiper-item { - width: 100%; - display: block; - height: 100%; - border-radius: 10rpx; - transform: scale(0.9); - transition: all 0.2s ease-in 0s; - overflow: hidden; -} - -.card-swiper swiper-item.cur .swiper-item { - transform: none; - transition: all 0.2s ease-in 0s; -} - - -.tower-swiper { - height: 420rpx; - position: relative; - max-width: 750rpx; - overflow: hidden; -} - -.tower-swiper .tower-item { - position: absolute; - width: 300rpx; - height: 380rpx; - top: 0; - bottom: 0; - left: 50%; - margin: auto; - transition: all 0.2s ease-in 0s; - opacity: 1; -} - -.tower-swiper .tower-item.none { - opacity: 0; -} - -.tower-swiper .tower-item .swiper-item { - width: 100%; - height: 100%; - border-radius: 6rpx; - overflow: hidden; -} - -/* ================== - 步骤条 - ==================== */ - -.cu-steps { - display: flex; -} - -scroll-view.cu-steps { - display: block; - white-space: nowrap; -} - -scroll-view.cu-steps .cu-item { - display: inline-block; -} - -.cu-steps .cu-item { - flex: 1; - text-align: center; - position: relative; - min-width: 100rpx; -} - -.cu-steps .cu-item:not([class*="text-"]) { - color: var(--grey); -} - -.cu-steps .cu-item [class*="cuIcon-"], -.cu-steps .cu-item .num { - display: block; - font-size: 40rpx; - line-height: 80rpx; -} - -.cu-steps .cu-item::before, -.cu-steps .cu-item::after, -.cu-steps.steps-arrow .cu-item::before, -.cu-steps.steps-arrow .cu-item::after { - content: ""; - display: block; - position: absolute; - height: 0px; - width: calc(100% - 80rpx); - border-bottom: 1px solid #ccc; - left: calc(0px - (100% - 80rpx) / 2); - top: 40rpx; - z-index: 0; -} - -.cu-steps.steps-arrow .cu-item::before, -.cu-steps.steps-arrow .cu-item::after { - content: "\e6a3"; - font-family: "cuIcon"; - height: 30rpx; - border-bottom-width: 0px; - line-height: 30rpx; - top: 0; - bottom: 0; - margin: auto; - color: #ccc; -} - -.cu-steps.steps-bottom .cu-item::before, -.cu-steps.steps-bottom .cu-item::after { - bottom: 40rpx; - top: initial; -} - -.cu-steps .cu-item::after { - border-bottom: 1px solid currentColor; - width: 0px; - transition: all 0.3s ease-in-out 0s; -} - -.cu-steps .cu-item[class*="text-"]::after { - width: calc(100% - 80rpx); - color: currentColor; -} - -.cu-steps .cu-item:first-child::before, -.cu-steps .cu-item:first-child::after { - display: none; -} - -.cu-steps .cu-item .num { - width: 40rpx; - height: 40rpx; - border-radius: 50%; - line-height: 40rpx; - margin: 20rpx auto; - font-size: 24rpx; - border: 1px solid currentColor; - position: relative; - overflow: hidden; -} - -.cu-steps .cu-item[class*="text-"] .num { - background-color: currentColor; -} - -.cu-steps .cu-item .num::before, -.cu-steps .cu-item .num::after { - content: attr(data-index); - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - transition: all 0.3s ease-in-out 0s; - transform: translateY(0rpx); -} - -.cu-steps .cu-item[class*="text-"] .num::before { - transform: translateY(-40rpx); - color: var(--white); -} - -.cu-steps .cu-item .num::after { - transform: translateY(40rpx); - color: var(--white); - transition: all 0.3s ease-in-out 0s; -} - -.cu-steps .cu-item[class*="text-"] .num::after { - content: "\e645"; - font-family: "cuIcon"; - color: var(--white); - transform: translateY(0rpx); -} - -.cu-steps .cu-item[class*="text-"] .num.err::after { - content: "\e646"; -} - -/* ================== - 布局 - ==================== */ - -/* -- flex弹性布局 -- */ - -.flex { - display: flex; -} - -.basis-xs { - flex-basis: 20%; -} - -.basis-xxs { - flex-basis: 30%; -} - -.basis-sm { - flex-basis: 40%; -} - -.basis-df { - flex-basis: 50%; -} - -.basis-lg { - flex-basis: 60%; -} - -.basis-llg { - flex-basis: 70%; -} - -.basis-xl { - flex-basis: 80%; -} - -.flex-sub { - flex: 1; -} - -.flex-twice { - flex: 2; -} - -.flex-treble { - flex: 3; -} - -.flex-direction { - flex-direction: column; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.align-start { - align-items: flex-start; -} - -.align-end { - align-items: flex-end; -} - -.align-center { - align-items: center; -} - -.align-stretch { - align-items: stretch; -} - -.self-start { - align-self: flex-start; -} - -.self-center { - align-self: flex-center; -} - -.self-end { - align-self: flex-end; -} - -.self-stretch { - align-self: stretch; -} - -.align-stretch { - align-items: stretch; -} - -.justify-start { - justify-content: flex-start; -} - -.justify-end { - justify-content: flex-end; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.justify-around { - justify-content: space-around; -} - -/* grid布局 */ - -.grid { - display: flex; - flex-wrap: wrap; -} - -.grid.grid-square { - overflow: hidden; -} - -.grid.grid-square .cu-tag { - position: absolute; - right: 0; - top: 0; - border-bottom-left-radius: 6rpx; - padding: 6rpx 12rpx; - height: auto; - background-color: rgba(0, 0, 0, 0.5); -} - -.grid.grid-square>view>text[class*="cuIcon-"] { - font-size: 52rpx; - position: absolute; - color: var(--grey); - margin: auto; - top: 0; - bottom: 0; - left: 0; - right: 0; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.grid.grid-square>view { - margin-right: 20rpx; - margin-bottom: 20rpx; - border-radius: 6rpx; - position: relative; - overflow: hidden; -} - -.grid.grid-square>view.bg-img image { - width: 100%; - height: 100%; - position: absolute; -} - -.grid.col-1.grid-square>view { - padding-bottom: 100%; - height: 0; - margin-right: 0; -} - -.grid.col-2.grid-square>view { - padding-bottom: calc((100% - 20rpx)/2); - height: 0; - width: calc((100% - 20rpx)/2); -} - -.grid.col-3.grid-square>view { - padding-bottom: calc((100% - 40rpx)/3); - height: 0; - width: calc((100% - 40rpx)/3); -} - -.grid.col-4.grid-square>view { - padding-bottom: calc((100% - 60rpx)/4); - height: 0; - width: calc((100% - 60rpx)/4); -} - -.grid.col-5.grid-square>view { - padding-bottom: calc((100% - 80rpx)/5); - height: 0; - width: calc((100% - 80rpx)/5); -} - -.grid.col-2.grid-square>view:nth-child(2n), -.grid.col-3.grid-square>view:nth-child(3n), -.grid.col-4.grid-square>view:nth-child(4n), -.grid.col-5.grid-square>view:nth-child(5n){ - margin-right: 0; -} - -.grid.col-1>view { - width: 100%; -} - -.grid.col-2>view { - width: 50%; -} - -.grid.col-3>view { - width: 33.33%; -} - -.grid.col-4>view { - width: 25%; -} - -.grid.col-5>view { - width: 20%; -} - -/* -- 内外边距 -- */ - -.margin-0 { - margin: 0; -} - -.margin-xs { - margin: 10rpx; -} - -.margin-sm { - margin: 20rpx; -} - -.margin { - margin: 30rpx; -} - -.margin-lg { - margin: 40rpx; -} - -.margin-xl { - margin: 50rpx; -} - -.margin-top-xs { - margin-top: 10rpx; -} - -.margin-top-sm { - margin-top: 20rpx; -} - -.margin-top { - margin-top: 30rpx; -} - -.margin-top-lg { - margin-top: 40rpx; -} - -.margin-top-xl { - margin-top: 50rpx; -} - -.margin-right-xs { - margin-right: 10rpx; -} - -.margin-right-sm { - margin-right: 20rpx; -} - -.margin-right { - margin-right: 30rpx; -} - -.margin-right-lg { - margin-right: 40rpx; -} - -.margin-right-xl { - margin-right: 50rpx; -} - -.margin-bottom-xs { - margin-bottom: 10rpx; -} - -.margin-bottom-sm { - margin-bottom: 20rpx; -} - -.margin-bottom { - margin-bottom: 30rpx; -} - -.margin-bottom-lg { - margin-bottom: 40rpx; -} - -.margin-bottom-xl { - margin-bottom: 50rpx; -} - -.margin-left-xs { - margin-left: 10rpx; -} - -.margin-left-sm { - margin-left: 20rpx; -} - -.margin-left { - margin-left: 30rpx; -} - -.margin-left-lg { - margin-left: 40rpx; -} - -.margin-left-xl { - margin-left: 50rpx; -} - -.margin-lr-xs { - margin-left: 10rpx; - margin-right: 10rpx; -} - -.margin-lr-sm { - margin-left: 20rpx; - margin-right: 20rpx; -} - -.margin-lr { - margin-left: 30rpx; - margin-right: 30rpx; -} - -.margin-lr-lg { - margin-left: 40rpx; - margin-right: 40rpx; -} - -.margin-lr-xl { - margin-left: 50rpx; - margin-right: 50rpx; -} - -.margin-tb-xs { - margin-top: 10rpx; - margin-bottom: 10rpx; -} - -.margin-tb-sm { - margin-top: 20rpx; - margin-bottom: 20rpx; -} - -.margin-tb { - margin-top: 30rpx; - margin-bottom: 30rpx; -} - -.margin-tb-lg { - margin-top: 40rpx; - margin-bottom: 40rpx; -} - -.margin-tb-xl { - margin-top: 50rpx; - margin-bottom: 50rpx; -} - -.padding-0 { - padding: 0; -} - -.padding-xs { - padding: 10rpx; -} - -.padding-sm { - padding: 20rpx; -} - -.padding { - padding: 30rpx; -} - -.padding-lg { - padding: 40rpx; -} - -.padding-xl { - padding: 50rpx; -} - -.padding-top-xs { - padding-top: 10rpx; -} - -.padding-top-sm { - padding-top: 20rpx; -} - -.padding-top { - padding-top: 30rpx; -} - -.padding-top-lg { - padding-top: 40rpx; -} - -.padding-top-xl { - padding-top: 50rpx; -} - -.padding-right-xs { - padding-right: 10rpx; -} - -.padding-right-sm { - padding-right: 20rpx; -} - -.padding-right { - padding-right: 30rpx; -} - -.padding-right-lg { - padding-right: 40rpx; -} - -.padding-right-xl { - padding-right: 50rpx; -} - -.padding-bottom-xs { - padding-bottom: 10rpx; -} - -.padding-bottom-sm { - padding-bottom: 20rpx; -} - -.padding-bottom { - padding-bottom: 30rpx; -} - -.padding-bottom-lg { - padding-bottom: 40rpx; -} - -.padding-bottom-xl { - padding-bottom: 50rpx; -} - -.padding-left-xs { - padding-left: 10rpx; -} - -.padding-left-sm { - padding-left: 20rpx; -} - -.padding-left { - padding-left: 30rpx; -} - -.padding-left-lg { - padding-left: 40rpx; -} - -.padding-left-xl { - padding-left: 50rpx; -} - -.padding-lr-xs { - padding-left: 10rpx; - padding-right: 10rpx; -} - -.padding-lr-sm { - padding-left: 20rpx; - padding-right: 20rpx; -} - -.padding-lr { - padding-left: 30rpx; - padding-right: 30rpx; -} - -.padding-lr-lg { - padding-left: 40rpx; - padding-right: 40rpx; -} - -.padding-lr-xl { - padding-left: 50rpx; - padding-right: 50rpx; -} - -.padding-tb-xs { - padding-top: 10rpx; - padding-bottom: 10rpx; -} - -.padding-tb-sm { - padding-top: 20rpx; - padding-bottom: 20rpx; -} - -.padding-tb { - padding-top: 30rpx; - padding-bottom: 30rpx; -} - -.padding-tb-lg { - padding-top: 40rpx; - padding-bottom: 40rpx; -} - -.padding-tb-xl { - padding-top: 50rpx; - padding-bottom: 50rpx; -} - -/* -- 浮动 -- */ - -.cf::after, -.cf::before { - content: " "; - display: table; -} - -.cf::after { - clear: both; -} - -.fl { - float: left; -} - -.fr { - float: right; -} - -/* ================== - 背景 - ==================== */ - -.line-red::after, -.lines-red::after { - border-color: var(--red); -} - -.line-orange::after, -.lines-orange::after { - border-color: var(--orange); -} - -.line-yellow::after, -.lines-yellow::after { - border-color: var(--yellow); -} - -.line-olive::after, -.lines-olive::after { - border-color: var(--olive); -} - -.line-green::after, -.lines-green::after { - border-color: var(--green); -} - -.line-cyan::after, -.lines-cyan::after { - border-color: var(--cyan); -} - -.line-blue::after, -.lines-blue::after { - border-color: var(--blue); -} - -.line-purple::after, -.lines-purple::after { - border-color: var(--purple); -} - -.line-mauve::after, -.lines-mauve::after { - border-color: var(--mauve); -} - -.line-pink::after, -.lines-pink::after { - border-color: var(--pink); -} - -.line-brown::after, -.lines-brown::after { - border-color: var(--brown); -} - -.line-grey::after, -.lines-grey::after { - border-color: var(--grey); -} - -.line-gray::after, -.lines-gray::after { - border-color: var(--gray); -} - -.line-black::after, -.lines-black::after { - border-color: var(--black); -} - -.line-white::after, -.lines-white::after { - border-color: var(--white); -} - -.bg-red { - background-color: var(--red); - color: var(--white); -} - -.bg-orange { - background-color: var(--orange); - color: var(--white); -} - -.bg-yellow { - background-color: var(--yellow); - color: var(--black); -} - -.bg-olive { - background-color: var(--olive); - color: var(--white); -} - -.bg-green { - background-color: var(--green); - color: var(--white); -} - -.bg-cyan { - background-color: var(--cyan); - color: var(--white); -} - -.bg-blue { - background-color: var(--blue); - color: var(--white); -} - -.bg-purple { - background-color: var(--purple); - color: var(--white); -} - -.bg-mauve { - background-color: var(--mauve); - color: var(--white); -} - -.bg-pink { - background-color: var(--pink); - color: var(--white); -} - -.bg-brown { - background-color: var(--brown); - color: var(--white); -} - -.bg-grey { - background-color: var(--grey); - color: var(--white); -} - -.bg-gray { - background-color: #f0f0f0; - color: var(--black); -} - -.bg-black { - background-color: var(--black); - color: var(--white); -} - -.bg-white { - background-color: var(--white); - color: var(--darkGray); -} - -.bg-wegreen { - background-color: var(--wegreen); - color: var(--white); -} - -.bg-netfee { - background-color: #ffcb63; - color: var(--white); -} - -.bg-shadeTop { - background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01)); - color: var(--white); -} - -.bg-shadeBottom { - background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1)); - color: var(--white); -} - -.bg-red.light { - color: var(--red); - background-color: var(--redLight); -} - -.bg-orange.light { - color: var(--orange); - background-color: var(--orangeLight); -} - -.bg-yellow.light { - color: var(--yellow); - background-color: var(--yellowLight); -} - -.bg-olive.light { - color: var(--olive); - background-color: var(--oliveLight); -} - -.bg-green.light { - color: var(--green); - background-color: var(--greenLight); -} - -.bg-cyan.light { - color: var(--cyan); - background-color: var(--cyanLight); -} - -.bg-blue.light { - color: var(--blue); - background-color: var(--blueLight); -} - -.bg-purple.light { - color: var(--purple); - background-color: var(--purpleLight); -} - -.bg-mauve.light { - color: var(--mauve); - background-color: var(--mauveLight); -} - -.bg-pink.light { - color: var(--pink); - background-color: var(--pinkLight); -} - -.bg-brown.light { - color: var(--brown); - background-color: var(--brownLight); -} - -.bg-grey.light { - color: var(--grey); - background-color: var(--greyLight); -} - -.bg-gradual-red { - background-image: var(--gradualRed); - color: var(--white); -} - -.bg-gradual-orange { - background-image: var(--gradualOrange); - color: var(--white); -} - -.bg-gradual-green { - background-image: var(--gradualGreen); - color: var(--white); -} - -.bg-gradual-purple { - background-image: var(--gradualPurple); - color: var(--white); -} - -.bg-gradual-pink { - background-image: var(--gradualPink); - color: var(--white); -} - -.bg-gradual-blue { - background-image: var(--gradualBlue); - color: var(--white); -} - -.shadow[class*="-red"] { - box-shadow: var(--ShadowSize) var(--redShadow); -} - -.shadow[class*="-orange"] { - box-shadow: var(--ShadowSize) var(--orangeShadow); -} - -.shadow[class*="-yellow"] { - box-shadow: var(--ShadowSize) var(--yellowShadow); -} - -.shadow[class*="-olive"] { - box-shadow: var(--ShadowSize) var(--oliveShadow); -} - -.shadow[class*="-green"] { - box-shadow: var(--ShadowSize) var(--greenShadow); -} - -.shadow[class*="-cyan"] { - box-shadow: var(--ShadowSize) var(--cyanShadow); -} - -.shadow[class*="-blue"] { - box-shadow: var(--ShadowSize) var(--blueShadow); -} - -.shadow[class*="-purple"] { - box-shadow: var(--ShadowSize) var(--purpleShadow); -} - -.shadow[class*="-mauve"] { - box-shadow: var(--ShadowSize) var(--mauveShadow); -} - -.shadow[class*="-pink"] { - box-shadow: var(--ShadowSize) var(--pinkShadow); -} - -.shadow[class*="-brown"] { - box-shadow: var(--ShadowSize) var(--brownShadow); -} - -.shadow[class*="-grey"] { - box-shadow: var(--ShadowSize) var(--greyShadow); -} - -.shadow[class*="-gray"] { - box-shadow: var(--ShadowSize) var(--grayShadow); -} - -.shadow[class*="-black"] { - box-shadow: var(--ShadowSize) var(--blackShadow); -} - -.shadow[class*="-white"] { - box-shadow: var(--ShadowSize) var(--blackShadow); -} - -.text-shadow[class*="-red"] { - text-shadow: var(--ShadowSize) var(--redShadow); -} - -.text-shadow[class*="-orange"] { - text-shadow: var(--ShadowSize) var(--orangeShadow); -} - -.text-shadow[class*="-yellow"] { - text-shadow: var(--ShadowSize) var(--yellowShadow); -} - -.text-shadow[class*="-olive"] { - text-shadow: var(--ShadowSize) var(--oliveShadow); -} - -.text-shadow[class*="-green"] { - text-shadow: var(--ShadowSize) var(--greenShadow); -} - -.text-shadow[class*="-cyan"] { - text-shadow: var(--ShadowSize) var(--cyanShadow); -} - -.text-shadow[class*="-blue"] { - text-shadow: var(--ShadowSize) var(--blueShadow); -} - -.text-shadow[class*="-purple"] { - text-shadow: var(--ShadowSize) var(--purpleShadow); -} - -.text-shadow[class*="-mauve"] { - text-shadow: var(--ShadowSize) var(--mauveShadow); -} - -.text-shadow[class*="-pink"] { - text-shadow: var(--ShadowSize) var(--pinkShadow); -} - -.text-shadow[class*="-brown"] { - text-shadow: var(--ShadowSize) var(--brownShadow); -} - -.text-shadow[class*="-grey"] { - text-shadow: var(--ShadowSize) var(--greyShadow); -} - -.text-shadow[class*="-gray"] { - text-shadow: var(--ShadowSize) var(--grayShadow); -} - -.text-shadow[class*="-black"] { - text-shadow: var(--ShadowSize) var(--blackShadow); -} - -.bg-img { - background-size: cover; - background-position: center; - background-repeat: no-repeat; -} - -.bg-mask { - background-color: var(--black); - position: relative; -} - -.bg-mask::after { - content: ""; - border-radius: inherit; - width: 100%; - height: 100%; - display: block; - background-color: rgba(0, 0, 0, 0.4); - position: absolute; - left: 0; - right: 0; - bottom: 0; - top: 0; -} - -.bg-mask view, -.bg-mask cover-view { - z-index: 5; - position: relative; -} - -.bg-video { - position: relative; -} - -.bg-video video { - display: block; - height: 100%; - width: 100%; - -o-object-fit: cover; - object-fit: cover; - position: absolute; - top: 0; - z-index: 0; - pointer-events: none; -} - -/* ================== - 文本 - ==================== */ - -.text-xs { - font-size: 20rpx; -} - -.text-sm { - font-size: 24rpx; -} - -.text-df { - font-size: 28rpx; -} - -.text-lg { - font-size: 32rpx; -} - -.text-xl { - font-size: 36rpx; -} - -.text-xxl { - font-size: 44rpx; -} - -.text-sl { - font-size: 80rpx; -} - -.text-xsl { - font-size: 120rpx; -} - -.text-Abc { - text-transform: Capitalize; -} - -.text-ABC { - text-transform: Uppercase; -} - -.text-abc { - text-transform: Lowercase; -} - -.text-price::before { - content: "¥"; - font-size: 80%; - margin-right: 4rpx; -} - -.text-cut { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.text-bold { - font-weight: bold; -} - -.text-center { - text-align: center; -} - -.text-content { - line-height: 1.6; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-red, -.line-red, -.lines-red { - color: var(--red); -} - -.text-orange, -.line-orange, -.lines-orange { - color: var(--orange); -} - -.text-wegreen, -.line-wegreen, -.lines-wegreen { - color: var(--wegreen); -} - -.text-yellow, -.line-yellow, -.lines-yellow { - color: var(--yellow); -} - -.text-olive, -.line-olive, -.lines-olive { - color: var(--olive); -} - -.text-green, -.line-green, -.lines-green { - color: var(--green); -} - -.text-cyan, -.line-cyan, -.lines-cyan { - color: var(--cyan); -} - -.text-blue, -.line-blue, -.lines-blue { - color: var(--blue); -} - -.text-purple, -.line-purple, -.lines-purple { - color: var(--purple); -} - -.text-mauve, -.line-mauve, -.lines-mauve { - color: var(--mauve); -} - -.text-pink, -.line-pink, -.lines-pink { - color: var(--pink); -} - -.text-brown, -.line-brown, -.lines-brown { - color: var(--brown); -} - -.text-grey, -.line-grey, -.lines-grey { - color: var(--grey); -} - -.text-gray, -.line-gray, -.lines-gray { - color: var(--gray); -} - -.text-black, -.line-black, -.lines-black { - color: var(--black); -} - -.text-white, -.line-white, -.lines-white { - color: var(--white); -} diff --git a/config.js b/config.js new file mode 100644 index 0000000..909b9ff --- /dev/null +++ b/config.js @@ -0,0 +1,40 @@ +/** + * 小程序配置文件 + */ + +// 此处主机域名是腾讯云解决方案分配的域名 +// 小程序后台服务解决方案:https://www.qcloud.com/solution/la + +var host = "14592619.qcloud.la" + +var config = { + + // 下面的地址配合云端 Server 工作 + host, + + // 登录地址,用于建立会话 + loginUrl: `https://${host}/login`, + + // 测试的请求地址,用于测试会话 + requestUrl: `https://${host}/testRequest`, + + // 用code换取openId + openIdUrl: `https://${host}/openid`, + + // 测试的信道服务接口 + tunnelUrl: `https://${host}/tunnel`, + + // 生成支付订单的接口 + paymentUrl: `https://${host}/payment`, + + // 发送模板消息接口 + templateMessageUrl: `https://${host}/templateMessage`, + + // 上传文件接口 + uploadFileUrl: `https://${host}/upload`, + + // 下载示例图片接口 + downloadExampleUrl: `https://${host}/static/weapp.jpg` +}; + +module.exports = config \ No newline at end of file diff --git a/images/base64.js b/images/base64.js new file mode 100644 index 0000000..97e51d0 --- /dev/null +++ b/images/base64.js @@ -0,0 +1,4 @@ +module.exports = { + icon20: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAMAAABgZ9sFAAAAVFBMVEXx8fHMzMzr6+vn5+fv7+/t7e3d3d2+vr7W1tbHx8eysrKdnZ3p6enk5OTR0dG7u7u3t7ejo6PY2Njh4eHf39/T09PExMSvr6+goKCqqqqnp6e4uLgcLY/OAAAAnklEQVRIx+3RSRLDIAxE0QYhAbGZPNu5/z0zrXHiqiz5W72FqhqtVuuXAl3iOV7iPV/iSsAqZa9BS7YOmMXnNNX4TWGxRMn3R6SxRNgy0bzXOW8EBO8SAClsPdB3psqlvG+Lw7ONXg/pTld52BjgSSkA3PV2OOemjIDcZQWgVvONw60q7sIpR38EnHPSMDQ4MjDjLPozhAkGrVbr/z0ANjAF4AcbXmYAAAAASUVORK5CYII=", + icon60: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAAeFBMVEUAwAD///+U5ZTc9twOww7G8MYwzDCH4YcfyR9x23Hw+/DY9dhm2WZG0kbT9NP0/PTL8sux7LFe115T1VM+zz7i+OIXxhes6qxr2mvA8MCe6J6M4oz6/frr+us5zjn2/fa67rqB4IF13XWn6ad83nxa1loqyirn+eccHxx4AAAC/klEQVRo3u2W2ZKiQBBF8wpCNSCyLwri7v//4bRIFVXoTBBB+DAReV5sG6lTXDITiGEYhmEYhmEYhmEYhmEY5v9i5fsZGRx9PyGDne8f6K9cfd+mKXe1yNG/0CcqYE86AkBMBh66f20deBc7wA/1WFiTwvSEpBMA2JJOBsSLxe/4QEEaJRrASP8EVF8Q74GbmevKg0saa0B8QbwBdjRyADYxIhqxAZ++IKYtciPXLQVG+imw+oo4Bu56rjEJ4GYsvPmKOAB+xlz7L5aevqUXuePWVhvWJ4eWiwUQ67mK51qPj4dFDMlRLBZTqF3SDvmr4BwtkECu5gHWPkmDfQh02WLxXuvbvC8ku8F57GsI5e0CmUwLz1kq3kD17R1In5816rGvQ5VMk5FEtIiWislTffuDpl/k/PzscdQsv8r9qWq4LRWX6tQYtTxvI3XyrwdyQxChXioOngH3dLgOFjk0all56XRi/wDFQrGQU3Os5t0wJu1GNtNKHdPqYaGYQuRDfbfDf26AGLYSyGS3ZAK4S8XuoAlxGSdYMKwqZKM9XJMtyqXi7HX/CiAZS6d8bSVUz5J36mEMFDTlAFQzxOT1dzLRljjB6+++ejFqka+mXIe6F59mw22OuOw1F4T6lg/9VjL1rLDoI9Xzl1MSYDNHnPQnt3D1EE7PrXjye/3pVpr1Z45hMUdcACc5NVQI0bOdS1WA0wuz73e7/5TNqBPhQXPEFGJNV2zNqWI7QKBd2Gn6AiBko02zuAOXeWIXjV0jNqdKegaE/kJQ6Bfs4aju04lMLkA2T5wBSYPKDGF3RKhFYEa6A1L1LG2yacmsaZ6YPOSAMKNsO+N5dNTfkc5Aqe26uxHpx7ZirvgCwJpWq/lmX1hA7LyabQ34tt5RiJKXSwQ+0KU0V5xg+hZrd4Bn1n4EID+WkQdgLfRNtvil9SPfwy+WQ7PFBWQz6dGWZBLkeJFXZGCfLUjCgGgqXo5TuSu3cugdcTv/HjqnBTEMwzAMwzAMwzAMwzAMw/zf/AFbXiOA6frlMAAAAABJRU5ErkJggg==" +}; \ No newline at end of file diff --git a/images/bjkb.png b/images/bjkb.png new file mode 100644 index 0000000..9c42e23 Binary files /dev/null and b/images/bjkb.png differ diff --git a/images/call.png b/images/call.png new file mode 100644 index 0000000..d259c52 Binary files /dev/null and b/images/call.png differ diff --git a/images/call_HL.png b/images/call_HL.png new file mode 100644 index 0000000..75705a3 Binary files /dev/null and b/images/call_HL.png differ diff --git a/images/cjcx.png b/images/cjcx.png new file mode 100644 index 0000000..d638b63 Binary files /dev/null and b/images/cjcx.png differ diff --git a/images/dfcx.png b/images/dfcx.png new file mode 100644 index 0000000..f0cc2bd Binary files /dev/null and b/images/dfcx.png differ diff --git a/images/findCET.png b/images/findCET.png new file mode 100644 index 0000000..e9229bc Binary files /dev/null and b/images/findCET.png differ diff --git a/images/grkb.png b/images/grkb.png new file mode 100644 index 0000000..b34028d Binary files /dev/null and b/images/grkb.png differ diff --git a/images/gyhz.png b/images/gyhz.png new file mode 100644 index 0000000..a0aa63c Binary files /dev/null and b/images/gyhz.png differ diff --git a/images/isbn.png b/images/isbn.png new file mode 100644 index 0000000..acec3e9 Binary files /dev/null and b/images/isbn.png differ diff --git a/images/jskb.png b/images/jskb.png new file mode 100644 index 0000000..80740cf Binary files /dev/null and b/images/jskb.png differ diff --git a/images/jy.png b/images/jy.png new file mode 100644 index 0000000..70f6224 Binary files /dev/null and b/images/jy.png differ diff --git a/images/jyxx.png b/images/jyxx.png new file mode 100644 index 0000000..3c243ea Binary files /dev/null and b/images/jyxx.png differ diff --git a/images/kefu.png b/images/kefu.png new file mode 100644 index 0000000..db95f73 Binary files /dev/null and b/images/kefu.png differ diff --git a/images/search-sign.png b/images/search-sign.png new file mode 100644 index 0000000..d62c785 Binary files /dev/null and b/images/search-sign.png differ diff --git a/images/service.png b/images/service.png new file mode 100644 index 0000000..ee7ead6 Binary files /dev/null and b/images/service.png differ diff --git a/images/share_green.png b/images/share_green.png new file mode 100644 index 0000000..936bf53 Binary files /dev/null and b/images/share_green.png differ diff --git a/images/smcs.png b/images/smcs.png new file mode 100644 index 0000000..c67f37c Binary files /dev/null and b/images/smcs.png differ diff --git a/images/tel.png b/images/tel.png new file mode 100644 index 0000000..0171ced Binary files /dev/null and b/images/tel.png differ diff --git a/images/wfcx.png b/images/wfcx.png new file mode 100644 index 0000000..ef34145 Binary files /dev/null and b/images/wfcx.png differ diff --git a/images/xl.png b/images/xl.png new file mode 100644 index 0000000..d720a0c Binary files /dev/null and b/images/xl.png differ diff --git a/images/xycx.png b/images/xycx.png new file mode 100644 index 0000000..7a2ac2a Binary files /dev/null and b/images/xycx.png differ diff --git a/images/xydh.png b/images/xydh.png new file mode 100644 index 0000000..3a83e30 Binary files /dev/null and b/images/xydh.png differ diff --git a/package.json b/package.json deleted file mode 100644 index 7a0c0c9..0000000 --- a/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "shellbox", - "version": "3.4.7", - "description": "更新社科馆音像室放映地点", - "author": "Airmole" - } \ No newline at end of file diff --git a/pages/Transport/Transport.js b/pages/Transport/Transport.js new file mode 100644 index 0000000..8b5c0f3 --- /dev/null +++ b/pages/Transport/Transport.js @@ -0,0 +1,85 @@ +var sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置 + +Page({ + data: { + tabs: ["北京", "天津", "宝坻"], + activeIndex: 1, + sliderOffset: 0, + sliderLeft: 0, + isLoading: true, + }, + onLoad: function(r) { + var that = this; + wx.getSystemInfo({ + success: function(res) { + that.setData({ + sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2, + sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex + }); + } + }); + if (r.activeIndex) { + that.setData({ + sliderOffset: r.activeIndex * that.data.sliderOffset, + activeIndex: r.activeIndex, + }) + + } + }, + onReady: function() { + var that = this; + setTimeout(function() { + that.setData({ + isLoading: false + }); + }, 400); + }, + tabClick: function(e) { + this.setData({ + sliderOffset: e.currentTarget.offsetLeft, + activeIndex: e.currentTarget.id + }); + }, + goJJXCStation: function() { + wx.getLocation({ + type: 'gcj02', // 返回可以用于wx.openLocation的经纬度 + success(res) { + wx.openLocation({ + latitude: 39.548662, + longitude: 117.363274, + scale: 17, + name: '京津新城公交站', + address: '京津新城北京国贸商务班车' + }) + } + }) + }, + goBJGMStation: function() { + wx.getLocation({ + type: 'gcj02', // 返回可以用于wx.openLocation的经纬度 + success(res) { + wx.openLocation({ + latitude: 39.905531, + longitude: 116.461934, + scale: 17, + name: '北京国贸乘车点', + address: '北京国贸桥南艾维克酒店西门三环辅路' + }) + } + }) + }, + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + var that = this; + if (res.from === 'button') { + // 来自页面内转发按钮 + console.log(res.target.id) + } + return { + title: '贝壳田园到' + that.data.tabs[that.data.activeIndex] + '出行方案', + path: 'pages/Transport/Transport?activeIndex=' + that.data.activeIndex, + } + } +}); \ No newline at end of file diff --git a/pages/Transport/Transport.json b/pages/Transport/Transport.json new file mode 100644 index 0000000..c5752a5 --- /dev/null +++ b/pages/Transport/Transport.json @@ -0,0 +1,7 @@ +{ + "navigationBarTitleText": "校园出行 - 贝壳小盒子", + "usingComponents": { + "wux-steps": "../common/steps/index", + "wux-step": "../common/step/index" + } +} \ No newline at end of file diff --git a/pages/Transport/Transport.wxml b/pages/Transport/Transport.wxml new file mode 100644 index 0000000..92eb7f4 --- /dev/null +++ b/pages/Transport/Transport.wxml @@ -0,0 +1,215 @@ + + + + + + + + + + {{item}} + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/Transport/Transport.wxss b/pages/Transport/Transport.wxss new file mode 100644 index 0000000..f8f8044 --- /dev/null +++ b/pages/Transport/Transport.wxss @@ -0,0 +1,88 @@ +@import "../common/weui.wxss"; + +Page { + background-color: #7acfa6; +} + +.ads { + padding: 0rpx 15rpx 15rpx 15rpx; +} + +page, .page, .page__bd { + height: 100%; +} + +image { + margin: 4px 0; +} + +.page__bd { + padding-bottom: 0; +} + +.weui-tab__content { + /* padding-top: 30px; */ + text-align: center; +} + +.history-table-wrap { + position: absolute; + width: 668rpx; + /* height: 578rpx; */ + left: 50%; + margin-left: -334rpx; + top: 70rpx; + overflow-y: scroll; + overflow-x: hidden; +} + +.shareIcon { + width: 26px; + height: 26px; + vertical-align: middle; +} + +.setCenter { + text-align: center; + padding-top: 30px; +} + +/* preview代码 */ + +.weui-form-preview { + margin-bottom: 25px; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 0 30rpx 30rpx; +} + +.ykt-detail-wraper { + display: flex; + flex-direction: column; + margin: 0 30rpx 30rpx; + background: rgba(255, 255, 255, 0.3); + border-radius: 15px; + box-shadow: 5rpx 5rpx 15rpx #ccc; +} + +.wraper { + background: rgba(255, 255, 255, 0.3); + margin: 0 30rpx 30rpx; + border-radius: 15px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + text-align: left; +} + +.warmtips { + text-align: center; + color: #000; +} diff --git a/pages/bookSearch/bookInfo/bookDetail.js b/pages/bookSearch/bookInfo/bookDetail.js new file mode 100644 index 0000000..3d1eb26 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookDetail.js @@ -0,0 +1,74 @@ +// pages/bookSearch/bookInfo/bookDetail.js +var app = getApp(); +Page({ + data: { + marc_no: "", + ISBN: "", + jsonStr: "", + doubanStr: '', + }, + onLoad: function(options) { + console.log(options); + wx.showToast({ + title: "loading", + icon: "loading", + duration: 20000 + }) + wx.setNavigationBarTitle({ + title: options.title + }) + var that = this; + wx.request({ + url: app.globalData.apiURL + '/book/marcno2info.php?marc_no=' + options.marc_no, + success: function(res) { + that.setData({ + jsonStr: res.data, + }) + console.log(res.data); + if (res.data[0][5] !== "") { + wx.request({ + url: app.globalData.doubanApi + '/book/isbn/' + res.data[0][5], + method: 'GET', + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + success: function(res) { + that.setData({ + doubanStr: res.data, + }) + // console.log(res.statusCode) + if (res.statusCode == 404) { + that.setData({ + doubanStr: 'null', + }) + } + } + }) + } else { + that.setData({ + doubanStr: 'null', + }) + } + wx.hideToast(); + } + }); + }, + goLibrary: function(ep) { + console.log(ep.currentTarget.dataset.place); + var placeArr = ["理工馆", "社科馆"]; + var markerIdArr = [5, 4]; + var result = placeArr.indexOf(ep.currentTarget.dataset.place.substr(0, 3)); + console.log(result); + wx.navigateTo({ + url: '/pages/schoolNav/schoolNav?markerId=' + markerIdArr[result], + }) + }, + onShareAppMessage: function(res) { + console.log(this.options.marc_no) + return { + title: '我在北科天院图书馆找到本《' + this.data.doubanStr.title + '》,你也来看看吧~', + path: 'pages/bookSearch/bookInfo/bookDetail?marc_no=' + this.options.marc_no, + imageUrl: this.data.doubanStr.images.large + } + }, +}); \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookDetail.json b/pages/bookSearch/bookInfo/bookDetail.json new file mode 100644 index 0000000..8a0d326 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookDetail.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "图书 - 贝壳小盒子" +} \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookDetail.wxml b/pages/bookSearch/bookInfo/bookDetail.wxml new file mode 100644 index 0000000..38831b6 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookDetail.wxml @@ -0,0 +1,85 @@ + + + + + + + + + {{doubanStr.title}} + 作者:{{doubanStr.author[0]}} + 出版社:{{doubanStr.publisher}} + 出版日期:{{doubanStr.pubdate}} + + + {{doubanStr.rating.average}} + {{doubanStr.rating.numRaters}}参与 + + + + + + + + + 只有馆藏信息哦 + + + + + + 图书馆OPAC系统无响应,请耐心等待 + 您可以先看看该书的简介信息 + + + + + + 本校图书馆暂无馆藏 + + + + 图书馆馆藏 + + + 索书号:{{item[0]}} + 条码号:{{item[1]}} + 图书状态: + {{item[4]}} + {{item[4]}} + + + + + + 📍{{jsonStr[0][3]}} + + + + + + 简介 + + {{doubanStr.summary}} + + + + 作者信息 + + {{doubanStr.author_intro}} + + + + + + + + + + Airmole. + + Copyright © 2020 贝壳小盒子(ShellBox) + + \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookDetail.wxss b/pages/bookSearch/bookInfo/bookDetail.wxss new file mode 100644 index 0000000..c06ac8c --- /dev/null +++ b/pages/bookSearch/bookInfo/bookDetail.wxss @@ -0,0 +1,168 @@ +/* pages/bookSearch/bookInfo/bookDetail.wxss */ +@import "../../common/weui.wxss"; + +page { + background-color: #eee; + font-size: 16px; + font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; +} + +.page__hd { + padding: 40px; +} + +.page__bd { + padding-bottom: 40px; +} + +.page__bd_spacing { + padding-left: 15px; + padding-right: 15px; +} + +.page__ft { + padding-bottom: 10px; + text-align: center; +} + +.page__title { + text-align: left; + font-size: 20px; + font-weight: 400; +} + +.page__desc { + margin-top: 5px; + color: #888; + text-align: left; + font-size: 14px; +} + +.raduis { + border-radius: 25px; +} + +.ads { + padding: 30rpx 15rpx 30rpx 15rpx; +} + +.suoshuNO { + font-family: 'Times New Roman', Times, serif; +} + +.sharerange { + position: absolute; + top: 190rpx; + right: 20rpx; + width: 200rpx; + text-align: center; + box-shadow: 2px 2px 10px #ccc; +} + +.cover-container { + background: #7acfa6; + text-align: center; + padding: 50rpx 0; +} + +.cover-container image { + display: inline-block; + width: 300rpx; + height: 400rpx; +} + +.book-meta { + position: relative; + padding: 20rpx; + overflow: hidden; +} + +.book-meta .range { + position: absolute; + top: 10rpx; + right: 20rpx; + width: 180rpx; + background: #fff; + padding: 20rpx 10rpx; + text-align: center; + box-shadow: 2px 2px 10px #ccc; +} + +.book-meta .meta-info { + margin-right: 200rpx; +} + +.meta-info text { + display: block; +} + +.book-title { + font-weight: bold; + font-size: 40rpx; +} + +.other-meta { + padding-top: 10rpx; + color: #888; + font-size: 30rpx; +} + +.range text { + display: block; +} + +.range .score { + font-size: 50rpx; + font-weight: bold; +} + +.range .starts { + font-size: 40rpx; +} + +.range .viewers { + font-size: 30rpx; +} + +.book-intro { + margin-bottom: 40rpx; + padding: 20rpx; + background: #fafafa; +} + +.book-intro .intro-header { + color: #888; + font-weight: bold; + padding: 40rpx 0; +} + +.book-intro .intro-content { + font-size: 35rpx; + line-height: 2; + text-align: justify; +} + +.shareIcon { + width: 26px; + height: 26px; + vertical-align: middle; +} + +.remind-box { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.remind-img { + width: 250rpx; + height: 250rpx; + padding-bottom: 25rpx; +} + +.remind-text { + font-size: 12pt; + line-height: 150%; +} diff --git a/pages/bookSearch/bookInfo/bookInfo.js b/pages/bookSearch/bookInfo/bookInfo.js new file mode 100644 index 0000000..213ae16 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookInfo.js @@ -0,0 +1,60 @@ +var app = getApp(); +Page({ + data: { + ISBN: "", + jsonStr: "", + doubanStr: '', + }, + onLoad: function(options) { + wx.showToast({ + title: "loading", + icon: "loading", + duration: 10000 + }) + var that = this; + wx.request({ + url: app.globalData.apiURL + '/book/isbn2info2.php?ISBN=' + options.ISBN, + success: function(res) { + that.setData({ + jsonStr: res.data, + }) + console.log(res.data) + } + }); + wx.request({ + url: app.globalData.doubanApi + '/book/isbn/' + options.ISBN, + method: 'GET', + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + success: function(res) { + that.setData({ + doubanStr: res.data, + }) + // console.log(res.data); + wx.hideToast() + } + }) + }, + onReady: function() { + + }, + goLibrary: function(ep) { + console.log(ep.currentTarget.dataset.place); + var placeArr = ["理工馆", "社科馆"]; + var markerIdArr = [5, 4]; + var result = placeArr.indexOf(ep.currentTarget.dataset.place.substr(0, 3)); + console.log(result); + wx.navigateTo({ + url: '/pages/schoolNav/schoolNav?markerId=' + markerIdArr[result], + }) + }, + onShareAppMessage: function(res) { + console.log(this) + return { + title: '我在北科天院图书馆找到本《' + this.data.doubanStr.title + '》,你也来看看吧~', + path: 'pages/bookSearch/bookInfo/bookInfo?ISBN=' + this.options.ISBN, + imageUrl: this.data.doubanStr.images.large + } + }, +}); \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookInfo.json b/pages/bookSearch/bookInfo/bookInfo.json new file mode 100644 index 0000000..8a0d326 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookInfo.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "图书 - 贝壳小盒子" +} \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookInfo.wxml b/pages/bookSearch/bookInfo/bookInfo.wxml new file mode 100644 index 0000000..22702fe --- /dev/null +++ b/pages/bookSearch/bookInfo/bookInfo.wxml @@ -0,0 +1,74 @@ + + + + + + + + + {{doubanStr.title}} + 作者:{{doubanStr.author[0]}} + 出版社:{{doubanStr.publisher}} + 出版日期:{{doubanStr.pubdate}} + + + {{doubanStr.rating.average}} + {{doubanStr.rating.numRaters}}参与 + + + + + + + + + 图书馆OPAC系统无响应,请耐心等待 + 您可以先看看该书的简介信息 + + + + + + 本校图书馆暂无馆藏 + + + + 图书馆馆藏 + + + 索书号:{{item[0]}} + 条码号:{{item[1]}} + 图书状态: + {{item[4]}} + {{item[4]}} + + + + + + 📍{{jsonStr[0][3]}} + + + + + + 简介 + + {{doubanStr.summary}} + + + + 作者信息 + + {{doubanStr.author_intro}} + + + + + Airmole. + + Copyright © 2020 贝壳小盒子(ShellBox) + + \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookInfo.wxss b/pages/bookSearch/bookInfo/bookInfo.wxss new file mode 100644 index 0000000..498d41c --- /dev/null +++ b/pages/bookSearch/bookInfo/bookInfo.wxss @@ -0,0 +1,132 @@ +/* pages/bookSearch/bookInfo/bookInfo.wxss */ +@import "../../common/weui.wxss"; + +page { + background: #eee; +} + +.raduis { + border-radius: 25px; +} + +.suoshuNO { + font-family: 'Times New Roman', Times, serif; +} + +.cover-container { + background: #7acfa6; + text-align: center; + padding: 50rpx 0; +} + +.cover-container image { + display: inline-block; + width: 300rpx; + height: 400rpx; +} + +.book-meta { + position: relative; + padding: 20rpx; + padding-bottom: 40rpx; + overflow: hidden; +} + +.sharerange { + position: absolute; + top: 190rpx; + right: 20rpx; + width: 200rpx; + text-align: center; + box-shadow: 2px 2px 10px #ccc; +} + +.book-meta .range { + position: absolute; + top: 10rpx; + right: 20rpx; + width: 180rpx; + background: #fff; + padding: 20rpx 10rpx; + text-align: center; + box-shadow: 2px 2px 10px #ccc; +} + +.book-meta .meta-info { + margin-right: 200rpx; +} + +.meta-info text { + display: block; +} + +.book-title { + font-weight: bold; + font-size: 40rpx; +} + +.other-meta { + padding-top: 10rpx; + color: #888; + font-size: 30rpx; +} + +.range text { + display: block; +} + +.range .score { + font-size: 50rpx; + font-weight: bold; +} + +.range .starts { + font-size: 40rpx; +} + +.range .viewers { + font-size: 30rpx; +} + +.book-intro { + margin-bottom: 40rpx; + padding: 20rpx; + background: #fafafa; +} + +.book-intro .intro-header { + color: #888; + font-weight: bold; + padding: 40rpx 0; +} + +.book-intro .intro-content { + font-size: 35rpx; + line-height: 2; + text-align: justify; +} + +.shareIcon { + width: 26px; + height: 26px; + vertical-align: middle; +} + +.remind-box { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.remind-img { + width: 250rpx; + height: 250rpx; + padding-bottom: 25rpx; +} + +.remind-text { + font-size: 12pt; + line-height: 150%; +} diff --git a/pages/bookSearch/bookInfo/bookList.js b/pages/bookSearch/bookInfo/bookList.js new file mode 100644 index 0000000..e480700 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookList.js @@ -0,0 +1,86 @@ +// pages/bookSearch/bookInfo/bookList.js +var app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + keyword: "", + keywordStr: "", + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + console.log(options) + wx.showToast({ + title: "loading", + icon: "loading", + duration: 5000 + }) + var that = this; + wx.request({ + url: app.globalData.apiURL + '/book/booksearch_adv.php?type=' + options.SearchType + '&keyword=' + options.keyword, + success: function(res) { + that.setData({ + keywordStr: res.data, + }) + console.log(res.data); + wx.hideToast() + if (res.data.total == 0) { + wx.redirectTo({ + url: '/pages/error/queryerror?ErrorTips=' + '您查找的图书暂无馆藏' + }) + } + } + }) + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function() { + return { + path: 'pages/bookSearch/bookInfo/bookList?keyword=' + this.options.keyword + '&SearchType=' + this.options.SearchType, + title: '相见恨晚!原来图书馆有这么多关于"' + this.options.keyword + '"的书啊~', + } + } +}) \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookList.json b/pages/bookSearch/bookInfo/bookList.json new file mode 100644 index 0000000..624730b --- /dev/null +++ b/pages/bookSearch/bookInfo/bookList.json @@ -0,0 +1,5 @@ +{ + "navigationBarBackgroundColor": "#73b4ef", + "backgroundColor": "#73b4ef", + "navigationBarTitleText": "图书查找 - 贝壳小盒子" +} \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookList.wxml b/pages/bookSearch/bookInfo/bookList.wxml new file mode 100644 index 0000000..aa42d75 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookList.wxml @@ -0,0 +1,24 @@ + + + 查询结果 + 在经历{{keywordStr.cost}}秒的折腾后,我们为您找到了以下{{keywordStr.total}}条内容: + + + + + + + + + + {{item.title}} + 作者:{{item.author}} + 索书号:{{item.callNo}} + + + + + + + + \ No newline at end of file diff --git a/pages/bookSearch/bookInfo/bookList.wxss b/pages/bookSearch/bookInfo/bookList.wxss new file mode 100644 index 0000000..e41a1d6 --- /dev/null +++ b/pages/bookSearch/bookInfo/bookList.wxss @@ -0,0 +1,44 @@ +/* pages/bookSearch/bookInfo/bookList.wxss */ +@import "../../common/weui.wxss"; + +.bookImg { + width: 120rpx; + height: 160rpx; +} + +page { + background-color: #f8f8f8; + font-size: 16px; + font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; +} + +.page__hd { + padding: 40px; +} + +.page__bd { + padding-bottom: 40px; +} + +.page__bd_spacing { + padding-left: 15px; + padding-right: 15px; +} + +.page__ft { + padding-bottom: 10px; + text-align: center; +} + +.page__title { + text-align: left; + font-size: 20px; + font-weight: 400; +} + +.page__desc { + margin-top: 5px; + color: #888; + text-align: left; + font-size: 14px; +} diff --git a/pages/bookSearch/index.js b/pages/bookSearch/index.js new file mode 100644 index 0000000..93749a2 --- /dev/null +++ b/pages/bookSearch/index.js @@ -0,0 +1,322 @@ +var app = getApp(); +var timeJs = require('../../utils/time.js'); +var utilsJs = require('../../utils/util.js'); +Page({ + data: { + offlinePeronalClass: 'null', //缓存的今天全天的课表数组 + nextCourse: "null", + inputShowed: false, + adsError: false, + isLoading: '加载中', + isShowAllCourse: false, + isLogined: false, + keyword: "", + jsonStr: "", + dayOfWeek: '', + keywordStr: '', + shouldReturnBook:[], + SearchType: '02', + radioItems: [{ + name: '书名', + value: '02', + checked: true + }, + { + name: '作者', + value: '03' + }, { + name: '主题', + value: '04' + }, + { + name: '出版社', + value: '09' + } + ] + }, + onLoad: function() { + + this.checkEffectiveIdAndPasswoed(); + this.showReadingBooks(); + + }, + onReady: function() { + + }, + + onShow: function() { + this.onLoad(); + }, + setTodayOfflineClass: function(personalClass) { + var that = this; + var date = new Date(); + var dayOfWeek = date.getDay(); + var weekArr = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]; + var createArr = []; + var nextCourseArr = []; + + personalClass = personalClass.course[weekArr[dayOfWeek]]; + for (let i in personalClass) { + if (personalClass[i].length > 1) { + for (let j in personalClass[i]) { + createArr.push(personalClass[i][j]); + } + } else { + createArr.push(personalClass[i]); + } + } + let nowMintues = date.getMinutes(); + if (nowMintues < 10) { + nowMintues = "0" + nowMintues; + } + var nowTime = date.getHours() + ':' + nowMintues; + // console.log(createArr); + for (let i = 0; i < createArr.length; i++) { + if (createArr[i]['startTime'] != '') { + // if (timeJs.CompareDate(nowTime, createArr[i]['startTime']) && utilsJs.needThisWeekGo(that.data.jsonStr.teachWeek, createArr[i]['teachWeek'])) { + // nextCourseArr = createArr[i]; + // } + if (timeJs.CompareDate(nowTime, createArr[i]['startTime'])) { + nextCourseArr = createArr[i]; + break; + } + } + } + // console.log(nextCourseArr) + that.setData({ + offlinePeronalClass: createArr, + nextCourse: nextCourseArr + }) + + + }, + checkEffectiveIdAndPasswoed: function() { + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + var netPassword = wx.getStorageSync('netPassword'); + var zhai = wx.getStorageSync('building'); + var room = wx.getStorageSync('roomNo'); + if (uid != '' && pwd != '') { + this.getWelcomeJson(uid, pwd, zhai, room, netPassword); + } else { + this.getWelcomeJson(uid, pwd, zhai, room, netPassword); + that.setData({ + isLogined: false + }) + } + }, + isShowAllCourse: function() { + this.setData({ + isShowAllCourse: !this.data.isShowAllCourse + }) + }, + showInput: function() { + this.setData({ + inputShowed: true + }); + }, + onBindFocus: function(event) { + + }, + onBindBlur: function(event) { + this.setData({ + inputVal: "", + inputShowed: false + }) + }, + hideInput: function() { + this.setData({ + inputVal: "", + inputShowed: false + }); + }, + radioChange: function(e) { + // console.log(e.detail.value); + this.setData({ + SearchType: e.detail.value + }) + var radioItems = this.data.radioItems; + for (var i = 0, len = radioItems.length; i < len; ++i) { + radioItems[i].checked = radioItems[i].value == e.detail.value; + } + this.setData({ + radioItems: radioItems, + }); + }, + inputTyping: function(e) { + this.setData({ + keyword: e.detail.value + }); + // console.log("输入了" + this.data.keyword); + }, + clearInput: function() { + this.setData({ + inputVal: "" + }); + }, + searchIt: function(e) { + var that = this; + if (that.data.keyword == 0) { + wx.showToast({ + title: '请输入检索关键字', + icon: 'none', + duration: 2000 + }); + } else { + wx.showToast({ + title: "正在搜索..", + icon: "loading", + duration: 10000 + }) + wx.request({ + url: app.globalData.apiURL + '/book/booksearch_adv.php?type=' + that.data.SearchType + '&keyword=' + that.data.keyword, + success: function(res) { + that.setData({ + keywordStr: res.data, + }) + // console.log(res.data); + wx.hideToast() + if (res.data.total == '图书馆系统无响应') { + wx.navigateTo({ + url: '/pages/error/queryerror?ErrorTips=' + "图书馆OPAC系统无响应" + }) + } else if (res.data.total == 0) { + wx.showToast({ + title: '本馆暂无此书', + image: '/images/info.png', + icon: 'none', + duration: 2000 + }); + } else { + wx.navigateTo({ + url: '../bookSearch/bookInfo/bookList?keyword=' + that.data.keyword + '&SearchType=' + that.data.SearchType, + }) + } + } + }) + } + }, + getWelcomeJson: function(uid, pwd, zhai, room, netPassword) { + var that = this; + wx.request({ + url: app.globalData.apiURL + '/v2/welcome.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + uid: uid, + pwd: pwd, + netPassword: netPassword, + zhai: zhai, + room: room, + }, + success: function(res) { + that.setData({ + jsonStr: res.data + }) + // console.log(res.data); + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + var personalClass = wx.getStorageSync('personal19Class'); + if (res.data.todayCourse.getCourseStatus != 403) { + that.setData({ + isLoading: "finished", + isLogined: true + }) + if (uid == '' || pwd == '') { + that.setData({ + isLogined: false + }) + } else { + if (personalClass != '') { + // console.log(personalClass) + that.setTodayOfflineClass(personalClass); + } + } + + } else { + that.setData({ + isLoading: "finished", + isLogined: false + }) + } + } + }) + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function() { + var that = this; + that.onLoad(); + wx.stopPullDownRefresh(); + wx.showToast({ + title: "刷新完成", + icon: "succeed", + duration: 3000 + }) + }, + onReachBottom: function() { + //拉到底了,做点什么好呢 + }, + adsError: function(e) { + // console.log(e) + var that = this; + that.setData({ + adsError: true + }) + }, + bindGetUserInfo: function(e) { + console.log(e); + app.globalData.nickName = e.detail.userInfo.nickName; + this.toLogin(); + }, + toLogin: function() { + wx.navigateTo({ + url: '/pages/index/index', + }) + }, + showRule: function() { + this.setData({ + isRuleTrue: true + }) + }, + hideRule: function() { + this.setData({ + isRuleTrue: false + }) + wx.setStorageSync('whShowStatus', 'saw'); + }, + showBigWH: function() { + wx.previewImage({ + urls: ["https://z4a.net/images/2019/10/28/lite.jpg"], + }) + wx.showToast({ + title: '长按保存后,打开QQ扫一扫识别', + icon: 'none', + duration: 3000 + }) + }, + showReadingBooks: function() { + var that = this; + var readingBook = wx.getStorageSync('readingBook'); + var nowTimestamp = new Date().getTime(); + var bookReturnDate = new Date(); + var shouldReturnBook = []; + + for (let i in readingBook) { + let formatedNeedReturnDate = readingBook[i].needReturnDate; + var needReturnDateArr = formatedNeedReturnDate.split("-"); + bookReturnDate.setFullYear(needReturnDateArr[0], needReturnDateArr[1] - 1, needReturnDateArr[2]); + if (nowTimestamp < bookReturnDate.getTime()) { + shouldReturnBook.push(readingBook[i]); + } + } + that.setData({ + shouldReturnBook: shouldReturnBook + }) + } +}); \ No newline at end of file diff --git a/pages/bookSearch/index.json b/pages/bookSearch/index.json new file mode 100644 index 0000000..1c155c7 --- /dev/null +++ b/pages/bookSearch/index.json @@ -0,0 +1,8 @@ +{ + "enablePullDownRefresh": true, + "backgroundColor": "#7acfa6", + "navigationBarTitleText": "贝壳小盒子", + "usingComponents": { + "wux-notice-bar": "../common/notice-bar/index" + } +} \ No newline at end of file diff --git a/pages/bookSearch/index.wxml b/pages/bookSearch/index.wxml new file mode 100644 index 0000000..12d5fc7 --- /dev/null +++ b/pages/bookSearch/index.wxml @@ -0,0 +1,518 @@ + + + + + + 📖 + 图书检索查询 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 您咋还没绑定学号呢? + + + + + + + + + {{jsonStr.notice}} + + + + + + + + + + + + + + Hi! + 🎉 + + + + + 今天是: + + + {{jsonStr.year}} 年 {{jsonStr.month}} 月 {{jsonStr.day}} 日 {{jsonStr.dayOfWeek}} + + + + + {{jsonStr.teachWeek}} + + + + + + + + + + + + + + Hi! + 🎉 + + + + + + 假期就要痛快玩啊🏃‍ + + + + + + + + + + + 💀 + 讲个鬼故事 + + + + + + + 您的 假期余额 + + + 已不足 + {{jsonStr.gap2StartClass}} + + + + + + + + + + + + + 🎓 + 下节课 + + + + + + {{nextCourse.courseName}} + {{nextCourse.startTime}}上课 ~ {{nextCourse.endTime}}下课 + + {{nextCourse.place}} + + + + + 展示全天课表👇 + + + 朕知道了,赶紧收起来吧😂 + + + + + + 😭 + 下一节 + + + + + + + 你还没有查询过课表,点我查下😁 + + + + + + 展示全天课表👇 + + + 朕知道了,赶紧收起来吧😂 + + + + + + 😁 + 下一节 + + + + + + + 没有课啦,休息一下吧😊 + + + + + + 展示全天课表👇 + + + 朕知道了,赶紧收起来吧😂 + + + + + + + + + + 😎 + 今日({{jsonStr['month']}}月{{jsonStr['day']}}日 {{jsonStr['dayOfWeek']}}) + + + + + + 一整天都没课,出去嗨啊🏃‍ + + + + + + + + + 😭 + 无数据 + + + + + + 你还没有查询过课表,点我查下 + + + + + + + + + + 😡 + ({{jsonStr['month']}}月{{jsonStr['day']}}日 {{jsonStr['dayOfWeek']}})课表 + + + + + {{item.courseName}}【{{item.teachWeek}}】 + {{item.startTime}}上课 - {{item.endTime}}下课 + + {{item.place}} + + + + 查看完整个人课表 + + + + + + + + + + + 📚 + 借阅图书 + + + + + + + {{item.bookName}} + + + + + 借阅日期: + {{item.brrowDate}} + + + 归还日期: + {{item.needReturnDate}} + + + + + + + 不想交罚款就按时归还图书📕 + + + + + + + 🍪 + 广告赞助 + + + + + + + + + + + + + + + + + + + + {{item.holidayName}} + + + + + + 今天距 {{item.holidayName}} + + + 还有 + {{item.gapDays}} + + + + + + + + + + 今天是 + {{item.holidayName}} + 哟~ + + + + + + + + + + + + 🖊 + 考试 + + + + + + 今天距 集中考试周 + + + 仅剩 + {{jsonStr.gap2ExamWeek}} + + + + + + + + + + + + + 🌐 + 网费余额 + + + + + {{jsonStr.netInfo.name}} + + + 截至时间:{{jsonStr.netInfo.time}} + + + + + 账户余额 + {{jsonStr.netInfo.balance}} + + + + + + + + + + 🌐 + 网费余额 + + + + + 系统关闭,暂时无法查询(;′⌒`) + + + + + + + + 🌐 + 网费余额 + + + + + 绑定一下校园网账号嘛(ಥ _ ಥ) + 绑定校园网 + + + + + + + + + + + 宿舍用电 + + + + + {{jsonStr.eleInfo.zhai}}斋{{jsonStr.eleInfo.room}} + + + 截至时间:{{jsonStr.eleInfo.time}} + + + + + 剩余电量 + {{jsonStr.eleInfo.Balance}} + + + + + + + + + + + 宿舍用电 + + + + + 建议您绑定一下宿舍 + 绑定宿舍 + + + + + + + + + 宿舍用电 + + + + + 系统维护,暂时无法查询(ಥ _ ಥ) + + + + + + + \ No newline at end of file diff --git a/pages/bookSearch/index.wxss b/pages/bookSearch/index.wxss new file mode 100644 index 0000000..8cc7e61 --- /dev/null +++ b/pages/bookSearch/index.wxss @@ -0,0 +1,699 @@ +/* pages/bookSearch/index.wxss */ +@import "../common/weui.wxss"; + +.login-btn { + margin-top: 20rpx; + font-size: 9pt; + text-align: center; + background-color: #7acfa6; + border-radius: 25rpx; + border-bottom: 2px solid #4fc08d; + color: #fff; +} + +.ads { + padding: 30rpx 15rpx 30rpx 15rpx; +} + +.noDisplay { + visibility: hidden; + height: 230rpx; +} + +.blockView { + display: inline-block; +} + +.radio { + margin-right: 10rpx; +} + +.radios { + margin-top: 20rpx; + margin-bottom: 70rpx; + flex-direction: row; + align-items: baseline; +} + +.mini-btn { + float: right; + display: inline-block; + margin-top: -8rpx; +} + +/* @import '/utils/weui-searchbar.wxss'; */ + +.container { + padding-bottom: 0; + background-color: #f0eff5; + background-repeat: no-repeat; + background-size: 100% auto; + background-position: bottom center; + /* background-image: url('/images/index/tri.png'); *//*微信暂不支持静态bgimg文件,改用服务器url*//* background-image: url('https://z4a.net/images/2019/02/01/tri.png'); */ + background-image: url('https://z4a.net/images/2019/02/01/timmg.png'); +} + +/**功能导航**/ + +.main-core { + display: flex; + flex-flow: row wrap; + align-content: flex-start; + background: #fff; + border-bottom: 1rpx solid #e5e5e5; + padding: 15rpx 10rpx 10rpx; + min-height: 350rpx; + overflow: hidden; +} + +.main-core-item { + display: flex; + flex-flow: column wrap; + justify-content: center; + align-items: center; + box-sizing: border-box; + width: 20%; + height: 170rpx; +} + +.main-core-item.disabled { + color: #9c9c9c; +} + +.core-item-icon { + display: block; + width: 85rpx; + height: 85rpx; + margin: 15rpx auto; +} + +.core-item-name { + display: block; + margin: 5rpx; +} + +.main-swpier { + height: 390rpx; + margin-bottom: 20rpx; +} + +.main-swpier .wx-swiper-dots.wx-swiper-dots-horizontal { + bottom: 0; + margin-bottom: -5rpx; +} + +/**卡片列表**/ + +.main-card { + padding-bottom: 300rpx; +} + +.main-card-item { + display: flex; + flex-direction: column; + background: #fff; + border-top: 1rpx solid #e5e5e5; + border-bottom: 1rpx solid #e5e5e5; + border-radius: 25rpx; + margin-bottom: 20rpx; + background-repeat: no-repeat; + background-size: 100% auto; + background-position: bottom center; + overflow: hidden; +} + +.examWeek-Margin { + margin-bottom: 40rpx; +} + +.main-card-item#kb { + background-image: url('https://z4a.net/images/2019/02/01/kb-bg.png'); +} + +.main-card-item#nextCourse { + background-image: url('https://z4a.net/images/2019/02/01/kb-bg.png'); +} + +.main-card-item#jwClosed { + background-image: url('https://z4a.net/images/2019/02/03/profile-first-issue.png'); +} + +.main-card-item#ks { + background-image: url('https://z4a.net/images/2019/02/02/tools.png'); +} + +.main-card-item#kaixue { + background-image: url('https://z4a.net/images/2019/02/03/f916aa746928d9b32ff09fe82c61f54c.png'); +} + +.main-card-item#vocation { + background-image: url('https://z4a.net/images/2019/02/03/profile-first-repo.png'); +} + +.main-card-item#ykt { + /*background-image: url('/images/index/ykt-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://z4a.net/images/2019/03/10/ykt-bg.png'); +} + +.main-card-item#chashu { + /*background-image: url('/images/index/ykt-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://z4a.net/images/2019/02/02/books.png'); +} + +.main-card-item#jy { + /*background-image: url('/images/index/jy-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://we.cqu.pt/app/images/index/ykt-bg.png'); +} + +.main-card-item#fj { + /*background-image: url('/images/index/jy-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://we.cqu.pt/app/images/index/ykt-bg.png'); +} + +.main-card-item#mk { + /*background-image: url('/images/index/jy-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://z4a.net/images/2019/02/02/profile-joined-github.png'); +} + +.main-card-item#sdf { + /*background-image: url('/images/index/sdf-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://i.loli.net/2019/06/22/5d0d1dc62946864090.png'); +} + +.main-card-item#swf { + /*background-image: url('/images/index/sdf-bg.png');*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background-image: url('https://z4a.net/images/2019/07/29/netFareBk9b1a72dabcc8947f.png'); +} + +.main-card-item navigator { + display: flex; + flex-direction: column; +} + +page .navigator-hover { + background-color: rgba(100, 100, 100, 0.1); + opacity: 0.8; +} + +.card-item-hd { + display: flex; + align-items: center; + height: 75rpx; + border-bottom: 1rpx solid #e5e5e5; + margin-left: 30rpx; +} + +.card-item-icon { + width: 40rpx; + height: 40rpx; + margin-right: 10rpx; +} + +.card-item-name { + letter-spacing: 2px; +} + +.card-item-more { + flex: 1; + display: flex; + align-items: center; + justify-content: flex-end; + padding-right: 25rpx; +} + +.card-item-open { + width: 30rpx; + height: 30rpx; +} + +.card-item-bd { + padding: 20rpx 25rpx 30rpx 0; + margin-left: 30rpx; + display: flex; + flex-direction: column; +} + +.card-info-hd { + display: flex; + justify-content: space-between; +} + +.card-info-left { + display: flex; + flex-direction: column; +} + +.card-info-right { + display: flex; + color: #acacac; + flex-direction: column; +} + +.card-info-name { + font-size: 16pt; + line-height: 1.2; + letter-spacing: 1px; + color: #acacac; +} + +.card-info-number { + line-height: 175%; + text-indent: 1px; + color: #aaa; +} + +.main-ending { + display: none; + /*display: flex;*/ + align-items: center; + justify-content: center; + width: 100%; + margin-top: 75rpx; + overflow: hidden; +} + +.main-ending-text { + width: 72pt; + color: #ccc; + font-size: 8pt; + padding: 0 16rpx; + text-align: center; + white-space: nowrap; +} + +.main-ending-line { + width: 100%; + height: 0; + border-top: 1rpx solid #e5e5e5; +} + +/**今日课表**/ + +.main-card-item#kb .card-item-bd { + padding: 0; + margin-right: 25rpx; +} + +.kb-nothing { + align-items: center; + justify-content: center; + font-size: 11pt; + min-height: 150rpx; +} + +.kb-open { + display: flex; + align-items: center; + justify-content: center; + text-align: center; + color: #0d50a3; + height: 90rpx; + border-top: 1rpx solid #e5e5e5; + margin-top: -1rpx; +} + +.kb-item { + display: flex; + height: 120rpx; + align-items: center; + justify-content: space-between; + border-bottom: 1px dotted #e5e5e5; +} + +.kb-item-left { + flex: 1 1 auto; + display: flex; + flex-direction: column; + padding-right: 30rpx; + overflow: hidden; +} + +.kb-item-what { + font-size: 12pt; + line-height: 200%; + color: #777; + white-space: nowrap; + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; +} + +.kb-item-when { + line-height: 125%; + color: #bbb; +} + +.kb-item-where { + flex: 0 0 auto; + font-size: 14pt; + color: #999; + letter-spacing: 1px; +} + +/**一卡通**/ + +.ykt-balance { + display: flex; + align-items: flex-end; + justify-content: center; + font-weight: bold; + padding: 0rpx 0 10rpx; +} + +.ykt-balance-text { + font-size: 17pt; + line-height: 2; + color: #999; +} + +.ykt-balance-value { + font-size: 58pt; + line-height: 1; + padding: 0 20rpx; + color: #ffbf92; +} + +.ykt-cost { + display: flex; + flex-wrap: wrap; + align-items: center; + font-weight: bold; + line-height: 200%; +} + +.ykt-cost-text { + font-size: 10pt; + color: #999; +} + +.ykt-cost-value { + font-size: 12pt; + font-weight: normal; + color: #777; + padding: 0 10rpx; +} + +.ykt-cost-total { + font-size: 16pt; + color: #ffbf92; + padding: 0 10rpx; +} + +.ykt-title { + font-size: 10pt; +} + +.ykt-no-cost { + color: #bbb; +} + +/**借阅信息**/ + +.main-card-item#jy .card-item-bd { + padding-bottom: 85rpx; +} + +.jy-list { + display: flex; + flex-wrap: wrap; + justify-content: space-around; +} + +.jy-item { + display: flex; + flex-direction: column; + align-items: center; + margin: 20rpx 15rpx 15rpx; +} + +.jy-book { + display: flex; + flex-direction: column; + align-items: stretch; + box-sizing: border-box; + width: 176rpx; + height: 231rpx; + background-size: 100% 100%; + padding: 5rpx 5rpx 50rpx 30rpx; + color: #fff; + margin-bottom: 10rpx; +} + +.jy-pickup-time { + text-align: right; + font-size: 8pt; + word-wrap: break-word; + white-space: nowrap; +} + +.jy-pickup-time-text { + padding-left: 4rpx; +} + +.jy-book-name { + height: 126rpx; + font-size: 28rpx; + font-weight: bold; + line-height: 150%; + word-wrap: break-word; + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; +} + +.jy-timing, jy-return-time { + line-height: 200%; +} + +.jy-timing-value { + font-size: 13pt; + font-weight: bold; + color: #729fc3; + padding: 0 8rpx; +} + +.jy-timing-text { + font-size: 10pt; + color: #acacac; +} + +.jy-return-time-value { + font-size: 12pt; + color: #7f848a; +} + +.jy-return-time-text { + font-size: 10pt; + color: #acacac; + padding-left: 8rpx; +} + +/**水电费**/ + +.main-card-item#sdf .card-item-bd { + padding-bottom: 80rpx; +} + +.sdf-hd { + color: #acacac; + margin: 40rpx 0 20rpx; +} + +.sdf-bd { + display: flex; + justify-content: space-between; + padding: 30rpx 0; + margin: 0 auto; +} + +.sdf-key { + padding: 0 10rpx; +} + +.sdf-value { + color: #ffbf92; + font-size: 46pt; + font-weight: bold; + padding: 0 15rpx; +} + +.swf-value { + color: #0693d49c; + font-size: 46pt; + font-weight: bold; + padding: 0 15rpx; +} + +.sdf-text { + color: #acacac; + font-size: 13pt; +} + +.searchbar-result { + margin-top: 0; + font-size: 14px; +} + +.searchbar-result:before { + display: none; +} + +.weui-cell { + padding: 12px 15px 12px 35px; +} + +.remind-box { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.remind-img { + width: 200rpx; + height: 200rpx; + padding-bottom: 25rpx; +} + +.remind-text { + font-size: 12pt; + line-height: 150%; +} + +/* showrule */ + +.isRuleShow { + display: block; +} + +.isRuleHide { + display: none; +} + +.ruleZhezhao { + height: 100%; + width: 100%; + position: fixed; + background-color: rgba(0, 0, 0, 0.5); + z-index: 2; + top: 0; + left: 0; +} + +.ruleZhezhaoContent { + width: 330px; + background: rgba(255, 255, 255, 0.377); + margin: 10% auto; + border-radius: 20rpx; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; + position: relative; +} + +.ruleZhezhaoText { + font-size: 30rpx; + color: #856d5f; + display: flex; + flex-direction: row; + align-items: center; +} + +.ruleZhezhaoText text:nth-child(1) { + color: #fff; + font-size: 40rpx; + height: 60rpx; + width: 60rpx; + background: #664a2c; + display: block; + text-align: center; + line-height: 60rpx; + border-radius: 30rpx; + margin-right: 10rpx; +} + +.ruleZhezhaoText text:nth-child(2) { + flex-wrap: wrap; + width: 80%; +} + +.ruleHide { + height: 60rpx !important; + width: 60rpx !important; + position: absolute; + top: -20rpx; + right: -20rpx; +} + +.rule { + display: block; + border: 1px solid #fff; + width: 100rpx; + text-align: center; + line-height: 60rpx; + color: #fff; + height: 60rpx; + font-size: 30rpx; + border-radius: 30rpx; + position: absolute; + top: 10%; + right: 5%; +} + +/* end */ + +.book-wraper { + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: space-between; + overflow: hidden; + padding: 35rpx 30rpx 10rpx; + background: #fff; + border-radius: 3px; +} + +.book-name { + font-size: 15pt; + line-height: 135%; + word-break: break-all; +} + +.bookeNameTxt { + float: left; + width: 240px; + white-space: nowrap; /*强制在一行显示*/ + text-overflow: ellipsis; /*设置超出内容显示...*/ + overflow: hidden; /*一定不能少 超出的内容进行隐藏*/ +} + +.historyBookeNameTxt { + float: left; + width: 100%; + white-space: nowrap; /*强制在一行显示*/ + text-overflow: ellipsis; /*设置超出内容显示...*/ + overflow: hidden; /*一定不能少 超出的内容进行隐藏*/ +} + +.book-date { + display: flex; + align-items: flex-end; + justify-content: space-between; + font-size: 9pt; + color: #888; +} + +.book-img { + height: 13pt; + width: 13pt; + margin-top: 2pt; + margin-right: 10rpx; +} +.yhrq-value { + font-size: 13pt; +} \ No newline at end of file diff --git a/pages/bookSearch/isbn/iputIsbn.js b/pages/bookSearch/isbn/iputIsbn.js new file mode 100644 index 0000000..59a5a8a --- /dev/null +++ b/pages/bookSearch/isbn/iputIsbn.js @@ -0,0 +1,57 @@ +// pages/bookSearch/bookInfo/isbn/iputIsbn.js +Page({ + data: { + isLoading: true, + }, + onReady: function() { + var that = this; + setTimeout(function() { + that.setData({ + isLoading: false + }); + }, 500); + }, + ISBNInput: function(e) { + //console.log(e.detail.value['isbn']); + if (e.detail.value['isbn'] == '' || e.detail.value['isbn'].length < 10) { + wx.showToast({ + title: '请输入ISBN码', + image: '/images/info.png', + icon: 'none', + duration: 2000 + }); + } else { + wx.navigateTo({ + url: '/pages/bookSearch/bookInfo/bookInfo?ISBN=' + e.detail.value['isbn'] + }) + } + }, + /** + * 扫码 + */ + scan: function() { + wx.scanCode({ + success: (res) => { + if (res.errMsg !== 'scanCode:ok') { + wx.showToast({ + title: res.errMsg, + icon: 'loading', + duration: 8000 + }) + return false; + } + if (res.scanType !== 'EAN_13') { + wx.showToast({ + title: '这不是ISBN码', + icon: 'loading', + duration: 8000 + }) + return false; + } + wx.navigateTo({ + url: '/pages/bookSearch/bookInfo/bookInfo?ISBN=' + res.result + }) + } + }) + } +}); \ No newline at end of file diff --git a/pages/bookSearch/isbn/iputIsbn.json b/pages/bookSearch/isbn/iputIsbn.json new file mode 100644 index 0000000..2743978 --- /dev/null +++ b/pages/bookSearch/isbn/iputIsbn.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "扫码查书 - 贝壳小盒子" +} \ No newline at end of file diff --git a/pages/bookSearch/isbn/iputIsbn.wxml b/pages/bookSearch/isbn/iputIsbn.wxml new file mode 100644 index 0000000..625c1aa --- /dev/null +++ b/pages/bookSearch/isbn/iputIsbn.wxml @@ -0,0 +1,22 @@ + + + + + + 请扫描或输入书籍背面的的ISBN码 + + + + + \ No newline at end of file diff --git a/pages/bookSearch/isbn/iputIsbn.wxss b/pages/bookSearch/isbn/iputIsbn.wxss new file mode 100644 index 0000000..9308e5f --- /dev/null +++ b/pages/bookSearch/isbn/iputIsbn.wxss @@ -0,0 +1,378 @@ +/* pages/bookSearch/bookInfo/isbn/iputIsbn.wxss */ +@import "../../common/weui.wxss"; + +Page { + /* background-color: #7acfa6; */ + background: linear-gradient(#7acfa6, #93f9b9, #1d976c); +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 0 30rpx 30rpx; +} + +.shareIcon { + width: 26px; + height: 26px; + vertical-align: middle; +} + +.button-sp-area { + margin: 0 auto; + padding-top: 15px; + width: 60%; +} + +.mini-btn { + margin-right: 5px; +} + +.logo-sub { + text-align: center; + margin-top: 50rpx; + margin-bottom: 50rpx; + color: #666; +} + +/**login.wxss**/ + +.container { + background: #7acfa6; + align-items: stretch; + padding: 0; + height: 100%; + overflow: hidden; +} + +.content { + flex: 1; + display: flex; + position: relative; + z-index: 10; + flex-direction: column; + align-items: stretch; + justify-content: center; + width: 100%; + height: 100%; + padding-bottom: 450rpx; + background: -webkit-gradient(linear, left top, left bottom, from(rgba(244, 244, 244, 0)), color-stop(0.1, #f4f4f4), to(#f4f4f4)); + opacity: 0; + transform: translate3d(0, 100%, 0); + animation: rise 3s cubic-bezier(0.19, 1, 0.22, 1) 0.25s forwards; +} + +.ykt-detail-wraper { + display: flex; + flex-direction: column; + margin: 0 30rpx 30rpx; + background: rgba(255, 255, 255, 0.4); + border-radius: 25rpx; + box-shadow: 5rpx 5rpx 15rpx #ccc; +} + +@keyframes rise { + 0% { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 1; + transform: translate3d(0, 450rpx, 0); + } +} + +.title { + position: absolute; + top: 30rpx; + left: 50%; + width: 600rpx; + height: 200rpx; + margin-left: -300rpx; + opacity: 0; + animation: show 2.5s cubic-bezier(0.19, 1, 0.22, 1) 0.5s forwards; +} + +@keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 0.95; + } +} + +.hd { + position: absolute; + top: 0; + left: 50%; + width: 1000rpx; + margin-left: -500rpx; + height: 200rpx; + transition: all 0.35s ease; +} + +@keyframes sway { + 0% { + transform: translate3d(0, 20rpx, 0) rotate(-15deg); + } + + 17% { + transform: translate3d(0, 0rpx, 0) rotate(25deg); + } + + 34% { + transform: translate3d(0, -20rpx, 0) rotate(-20deg); + } + + 50% { + transform: translate3d(0, -10rpx, 0) rotate(15deg); + } + + 67% { + transform: translate3d(0, 10rpx, 0) rotate(-25deg); + } + + 84% { + transform: translate3d(0, 15rpx, 0) rotate(15deg); + } + + 100% { + transform: translate3d(0, 20rpx, 0) rotate(-15deg); + } +} + +.wave { + position: absolute; + z-index: 3; + right: 0; + bottom: 0; + opacity: 0.725; + height: 260rpx; + width: 2250rpx; + animation: wave 10s linear infinite; +} + +.wave-bg { + z-index: 1; + animation: wave-bg 10.25s linear infinite; +} + +@keyframes wave { + from { + transform: translate3d(125rpx, 0, 0); + } + + to { + transform: translate3d(1125rpx, 0, 0); + } +} + +@keyframes wave-bg { + from { + transform: translate3d(375rpx, 0, 0); + } + + to { + transform: translate3d(1375rpx, 0, 0); + } +} + +.bd { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + animation: bd-rise 2s cubic-bezier(0.23, 1, 0.32, 1) 0.75s forwards; + opacity: 0; +} + +@keyframes bd-rise { + from { + opacity: 0; + transform: translate3d(0, 60rpx, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +form { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; +} + +.input-group { + display: flex; + align-items: center; + padding: 25rpx 10rpx; + margin: 40rpx 3%; + background: #fff; + border-radius: 5px; + border: 2px solid #f4f4f4; + transition: all 0.25s ease-in-out; +} + +.input-group.active { + border: 2px solid #7acfa6; +} + +.input-label { + color: #888; + font-size: 13pt; + height: 25rpx; + line-height: 25rpx; + padding: 0 25rpx; + border-right: 1px solid #d8d8d8; +} + +.input-group input, .input-group picker { + flex: 1; + font-size: 13pt; + min-height: 52rpx; + height: 52rpx; + line-height: 52rpx; + padding: 0 25rpx; +} + +.input-placeholder, .input-group picker.placeholder { + color: #ccc; +} + +.login-help { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0 30rpx; + font-size: 10pt; + color: #bbb; +} + +.login-help-img { + width: 11pt; + height: 11pt; + margin: 0 5rpx; +} + +.confirm-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #7acfa6; + color: #fff; + text-align: center; + border-radius: 5px; + margin: 50rpx 3%; +} + +.confirm-btn:active { + opacity: 0.8; +} + +.help { + position: absolute; + z-index: 100; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.box { + position: relative; + display: flex; + flex-direction: column; + align-items: stretch; + width: 80%; + background: #fff; + border-radius: 10px; + box-shadow: 0 0 50px rgba(22, 22, 22, 0.35); + transform: translate3d(0, -400rpx, 0); +} + +.box-hd { + display: flex; + align-items: center; + justify-content: center; + height: 100rpx; + border-bottom: 1px solid #eee; +} + +.box-title { + font-size: 13pt; +} + +.box-close { + position: absolute; + right: 20rpx; + width: 35rpx; + height: 35rpx; + padding: 15rpx; +} + +.box-bd { + flex: 1; + display: flex; + flex-direction: column; + padding: 15rpx 40rpx 30rpx; +} + +.help-q { + color: #999; + font-size: 11pt; + line-height: 200%; + margin-top: 5rpx; +} + +.help-a { + text-indent: 1em; + line-height: 160%; + display: flex; + flex-direction: column; +} + +.help-a text { + word-break: break-all; +} + +/**登录动画**/ + +.login_video { + position: absolute; + z-index: 1; + top: 50%; + left: 50%; + width: 750rpx; + margin-left: -375rpx; + height: 1334rpx; + margin-top: -667rpx; +} + +.video_hidden { + visibility: hidden; +} + +page .wx-video-bar { + display: none; +} diff --git a/pages/books/detail.js b/pages/books/detail.js deleted file mode 100644 index 8bf5638..0000000 --- a/pages/books/detail.js +++ /dev/null @@ -1,233 +0,0 @@ -// pages/books/detail.js -var app = getApp(); -Page({ - data: { - isLoading: '加载中', - code: "", - codeType: '', - jsonStr: "", - doubanStr: '', - title: '', - isbn: '', - place: '', - placeType: 0, - showCollection: true, - showDistribution: true, - showBookInfo: true, - showSameAuthor: true, - socialDistribution: [ - { floor: '四层', content: ['A', 'B', 'C', 'D'], desc: '中文社科图书A,B,C,D类', infloor: false }, - { floor: '三层', content: ['D', 'E', 'F', 'G', 'H', 'I'], desc: '中文社科图书D、E、F、G、H、I类', infloor: false }, - { floor: '二层', content: ['I', 'J', 'K'], desc: '中文社科图书I、J、K类、社科馆外文书库', infloor: false }, - { floor: '一层', content: [], desc: '借还处、音像制品库、新书库、图书漂流区', infloor: false } - ], - industryDistribution: [ - { room: '101', content: ['TP'], desc: '理工馆中文书库101室 TP', infloor: false }, - { room: '102', content: ['TP'], desc: '理工馆中文书库102室 TP', infloor: false }, - { room: '103', content: ['TB', 'TD', 'TE', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TM', 'TN'], desc: '理工馆中文书库103室', infloor: false }, - { room: '104', content: ['TQ', 'TS', 'TU', 'TV'], desc: '理工馆中文书库104室', infloor: false }, - { room: '106', content: ['O', 'P', 'Q', 'R', 'U', 'V', 'X', 'Z'], desc: '理工馆中文书库106室', infloor: false }, - { room: '107', content: [], desc: '理工馆中文书库107室', infloor: false }, - { room: '108', content: [], desc: '理工馆中文书库108 过刊、最新书库', infloor: false }, - { room: '202', content: [], desc: '报刊阅览室', infloor: false }, - ] - }, - onLoad: function (options) { - wx.showLoading({ title: "等我加载一下~" }); - let codeType = options.codeType ? options.codeType : 'marc'; - this.setData({ code: options.code, codeType: codeType }); - if (codeType == 'marc') { - this.getBookDetailByMarc(options.code); - } - if (codeType == 'isbn') { - this.getBookDetailByIsbn(options.code); - } - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - getBookDetailByMarc: function (marc) { - var _this = this; - wx.request({ - url: `${app.globalData.domain}/book/marc/${marc}`, - success: function (res) { - try { - _this.bookPossibleInfloor(res.data) - _this.setData({ - jsonStr: res.data, - title: _this.getTitleFromBookInfo(res.data.bookInfo), - isbn: _this.getIsbnFromBookInfo(res.data.bookInfo), - isLoading: false - }); - wx.hideLoading(); - } catch (error) { - wx.showModal({ - title: '嘿嘿嘿', - content: res.data.message, - showCancel: false, - success() { wx.navigateBack({ delta: 1 }) } - }); - } - } - }); - }, - getBookDetailByIsbn: function (isbn) { - var _this = this; - wx.request({ - url: `${app.globalData.domain}/book/isbn/${isbn}`, - success: function (res) { - if (res.data.length != 0) { - _this.bookPossibleInfloor(res.data) - _this.setData({ jsonStr: res.data, title: res.data.bookInfo[0].value, isLoading: false, isbn: isbn }); - wx.hideLoading(); - } else { - wx.hideLoading(); - wx.showModal({ - title: '温馨提醒', - content: '图书馆貌似没有这本书', - showCancel: false, - success() { wx.navigateBack({ delta: 1 }) } - }); - } - } - }); - }, - goLibrary: function (e) { - console.log(e.currentTarget.dataset.place); - var placeArr = ["理工馆", "社科馆"]; - var markerIdArr = [5, 4]; - var result = placeArr.indexOf(e.currentTarget.dataset.place.substr(0, 3)); - console.log(result); - wx.navigateTo({ - url: '../traffic/navi?markerId=' + markerIdArr[result], - }) - }, - getIsbnFromBookInfo: function (bookInfo) { - let isbn = ''; - let pattern = /((978[\--– ])?[0-9][0-9\--– ]{10}[\--– ][0-9xX])|((978)?[0-9]{9}[0-9Xx])/; - for (let index = 0; index < bookInfo.length; index++) { - const element = bookInfo[index]; - if (element.name.indexOf('ISBN') >= 0) { - let isbnMatched = pattern.exec(element.value); - isbn = isbnMatched == null ? element.value : isbnMatched[1]; - break; - } - } - return isbn; - }, - getTitleFromBookInfo: function (bookInfo) { - let title = ''; - let pattern = /(.*?)\//; - for (let index = 0; index < bookInfo.length; index++) { - const element = bookInfo[index]; - if (element.name.indexOf('题名') >= 0) { - let titleMatched = pattern.exec(element.value); - title = titleMatched == null ? element.value : titleMatched[1]; - break; - } - } - return title; - }, - go2Douban: function () { - var _this = this; - const isbn = _this.data.isbn; - wx.request({ - url: `${app.globalData.domain}/book/isbn/douban/${isbn}`, - success: function (res) { - if (res.data.code == 301) { - wx.navigateToMiniProgram({ - appId: 'wx2f9b06c1de1ccfca', - path: `pages/subject/subject?id=${res.data.id}&type=book` - }) - } else { - wx.showToast({ title: '豆瓣未收录', icon: 'none' }); - } - } - }); - }, - go2Dangdang: function () { - const title = this.data.title; - wx.navigateToMiniProgram({ - appId: 'wx7bb576902363f4ff', - path: `pages/search/index?keyword=${title}&cid=0` - }) - }, - bookPossibleInfloor(book) { - let callNo = '' // 索书号 - let callNoPrefix = '' // 索书号字母前缀 - let place = '' - // 索书号 - book.bookInfo.forEach(element => { - if (element.name.indexOf('中图法分类号') >= 0) { - callNo = element.value - return - } - }) - // 馆藏地 - for (let index = 0; index < book.collection.length; index++) { - const bookItem = book.collection[index]; - bookItem.forEach(prop => { - console.log('prop', prop.title.indexOf('馆藏地')) - if (prop.title == '索书号' && prop.value.length > 0) callNo = prop.value - if (prop.title.indexOf('馆藏地') >= 0) place = prop.value - }) - break - } - const pattern = /^[a-zA-Z]+/ - const matchedCallNoPrefix = pattern.exec(callNo) - callNoPrefix = matchedCallNoPrefix == null ? '' : matchedCallNoPrefix[0] - // 社科馆图书 - if (place.indexOf('社科馆') >= 0) { - let socialDistribution = this.data.socialDistribution - if (place.indexOf('音像制品') === -1) { - socialDistribution.forEach((floor, index) => { - if (floor.content.includes(callNoPrefix)) socialDistribution[index].infloor = true - }) - } - if (place.indexOf('新书库') >= 0 || place.indexOf('音像制品') >= 0) socialDistribution[3].infloor = true - this.setData({ socialDistribution: socialDistribution, place: place, placeType: 0 }) - return - } - // 理工馆图书 - let industryDistribution = this.data.industryDistribution - if (place.indexOf('理工馆') >= 0) { - industryDistribution.forEach((room, index) => { - if (room.content.includes(callNoPrefix)) industryDistribution[index].infloor = true - }) - } - if (place.indexOf('新书库') >= 0) industryDistribution[6].infloor = true - if (place.indexOf('期刊室') >= 0) industryDistribution[industryDistribution.length - 1].infloor = true - this.setData({ industryDistribution: industryDistribution, place: place, placeType: 1 }) - console.log('馆藏地,索书号', callNo, place) - }, - distributionChanged() { - const currentValue = this.data.showDistribution - this.setData({ showDistribution: !currentValue }) - }, - showCollectionChanged() { - const currentValue = this.data.showCollection - this.setData({ showCollection: !currentValue }) - }, - showBookInfoChanged() { - const currentValue = this.data.showBookInfo - this.setData({ showBookInfo: !currentValue }) - }, - showSameAuthorChanged() { - const currentValue = this.data.showSameAuthor - this.setData({ showSameAuthor: !currentValue }) - }, - onShareAppMessage: function (res) { - let code = this.data.code; - let codeType = this.data.codeType; - if (this.data.isbn.length >= 13) { - code = this.data.isbn; - codeType = 'isbn'; - } - return { - title: '《' + this.data.title + '》 - 贝壳小盒子', - path: `pages/books/detail?code=${code}&codeType=${codeType}` - } - }, -}); \ No newline at end of file diff --git a/pages/books/detail.json b/pages/books/detail.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/books/detail.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/books/detail.wxml b/pages/books/detail.wxml deleted file mode 100644 index 637973d..0000000 --- a/pages/books/detail.wxml +++ /dev/null @@ -1,212 +0,0 @@ - - {{title}} - - - - - - - - - 馆藏信息(共{{jsonStr.collection.length}}本) - - - - - - - - - - - - {{row.title}}: - - - - - - {{row.value}} - - - - - {{row.title}}: - - - - - - {{row.value}} - - - - - {{row.title}}: - - - - - - {{row.value}} - - - - - - {{row.title}}: - {{row.value}} - - - - - - - - - - - - - 社科馆图书馆藏分布 - - - - - - - - - - {{item.floor}} - - {{item.desc}} - - - - - 您要找的书"可能"位于边框选中的楼层或位置,也可能位于新书库,本识别结果仅供参考 - - - - - - - - - - - 理工馆图书馆藏分布 - - - - - - - - - - {{item.room}}室 - - {{item.desc}} - - - - - 您要找的书"可能"位于边框选中的位置,也可能位于新书库,本识别结果仅供参考 - - - - - - - - - - - - 图书信息 - - - {{jsonStr.viewedSum}}次 - - - - - - - {{item.name}} - - - {{item.value}} - - - - - - - - - - 相关书架 - - - - - - {{item.name}} - - - {{item.sum}}册图书 - - - - - - - - - 同名作者其他著作 - - - - - - - - - - {{sameAuthor.data[0].value}} - - {{sameAuthor.data[1].value}} | {{sameAuthor.data[2].value}} - - {{sameAuthor.data[3].value}} - - - - - - - - - 其他相关资源 - - - - - - 豆瓣评分 - - 查看热评 - - - - - 当当图书 - - 前往购买 - - - - \ No newline at end of file diff --git a/pages/books/detail.wxss b/pages/books/detail.wxss deleted file mode 100644 index 4a3ed29..0000000 --- a/pages/books/detail.wxss +++ /dev/null @@ -1,10 +0,0 @@ -/* pages/books/detail.wxss */ -@import "../index/index.wxss"; - -page{ - background: var(--cyan); -} - -.infloor { - border: 1px solid #1CBBB4; -} \ No newline at end of file diff --git a/pages/books/hot/index.js b/pages/books/hot/index.js deleted file mode 100644 index dc9fc10..0000000 --- a/pages/books/hot/index.js +++ /dev/null @@ -1,195 +0,0 @@ -// pages/books/hot/index.js -const app = getApp(); -Page({ - - /** - * 页面的初始数据 - */ - data: { - title: '热门图书', - isLoading: '加载中', - screenHeight: '900', - orderby: 'lend', - type: 'ALL', - orderbyList: [{ - title: '借阅', - value: 'lend' - }, { - title: '评分', - value: 'score' - }, { - title: '收藏', - value: 'shelf' - }, { - title: '浏览', - value: 'book' - }], - typeList: [{ - title: '总体排行', - value: 'ALL' - }, { - title: '马列主义、毛泽东思想、邓小平理论', - value: 'A' - }, { - title: '哲学、宗教', - value: 'B' - }, { - title: '社会科学总论', - value: 'C' - }, { - title: '政治、法律', - value: 'D' - }, { - title: '军事', - value: 'E' - }, { - title: '经济', - value: 'F' - }, { - title: '文化、科学、教育、体育', - value: 'G' - }, { - title: '语言、文字', - value: 'H' - }, { - title: '文学', - value: 'I' - }, { - title: '艺术', - value: 'J' - }, { - title: '历史、地理', - value: 'K' - }, { - title: '自然科学总论', - value: 'N' - }, { - title: '自然科学总论', - value: 'N' - }, { - title: '自然科学总论', - value: 'O' - }, { - title: '天文学、地球科学', - value: 'P' - }, { - title: '生物科学', - value: 'Q' - }, { - title: '医药、卫生', - value: 'R' - }, { - title: '农业科学', - value: 'S' - }, { - title: '工业技术', - value: 'T' - }, { - title: '交通运输', - value: 'U' - }, { - title: '航空、航天', - value: 'V' - }, { - title: '环境科学,安全科学', - value: 'X' - }, { - title: '综合性图书', - value: 'Z' - }], - type: 'ALL', - booklist: [] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - const type = options.type ? options.type : 'ALL'; - const orderby = options.orderby ? options.orderby : 'lend'; - this.inital(type, orderby); - this.getHotBooksData(orderby, type); - }, - inital: function (type, orderby) { - const device = wx.getSystemInfoSync(); - this.setData({ screenHeight: device.screenHeight, type: type, orderby: orderby }); - wx.showShareMenu({ withShareTicket: true, menus: ['shareAppMessage', 'shareTimeline'] }); - }, - getHotBooksData: function (orderby = 'lend', type = 'ALL') { - const _this = this; - wx.request({ - url: `${app.globalData.domain}/book/hot/${orderby}/${type}`, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({booklist: res.data, isLoading: false}) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - typeChanged: function (e) { - const type = this.data.typeList[e.currentTarget.dataset.index].value; - const orderby = this.data.orderby; - // console.log(type, orderby); - this.setData({ type: type}); - this.getHotBooksData(orderby, type); - }, - orderbyChanged: function (e) { - const orderby = this.data.orderbyList[e.currentTarget.dataset.index].value; - const type = this.data.type; - // console.log(type, orderby); - this.setData({ orderby: orderby}); - this.getHotBooksData(orderby, type); - }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - // var _this = this; - // setTimeout(function () { _this.setData({ isLoading: false }) }, 1000); - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - path: `pages/books/hot/index?orderby=${this.data.orderby}&type=${this.data.type}`, - title: `【贝壳小盒子】 - 北科天院图书馆热门图书排行榜单~`, - } - } -}) \ No newline at end of file diff --git a/pages/books/hot/index.json b/pages/books/hot/index.json deleted file mode 100644 index 2e3378c..0000000 --- a/pages/books/hot/index.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/books/hot/index.wxml b/pages/books/hot/index.wxml deleted file mode 100644 index 4653b68..0000000 --- a/pages/books/hot/index.wxml +++ /dev/null @@ -1,77 +0,0 @@ - - - {{title}} - - - - - - - - - - - {{item.title}} - - - - - - - {{item.value}} {{item.title}} - - - - - - - - - {{item.data[0].value}}.{{item.data[1].value}} - - {{item.data[2].value}} | {{item.data[3].value}} \n {{item.data[4].title}}:{{item.data[4].value}} | {{item.data[5].value}}册 - - - - - {{item.data[6].title}}:{{item.data[6].value}} \n - {{item.data[7].title}}:{{item.data[7].value}} - - - - - {{item.data[0].value}}.{{item.data[1].value}} - - {{item.data[2].value}} | {{item.data[3].value}} \n {{item.data[4].title}}:{{item.data[4].value}} - - - - - - - {{item.data[6].title}}:{{item.data[6].value}} - - - - - {{item.data[0].value}}.{{item.data[1].value}} - - {{item.data[2].value}} | {{item.data[3].value}} \n {{item.data[4].title}}:{{item.data[4].value}} - - - - - {{item.data[5].value}}收藏 - {{item.data[5].value}}浏览 - - - - - - - - \ No newline at end of file diff --git a/pages/books/hot/index.wxss b/pages/books/hot/index.wxss deleted file mode 100644 index 23f43f7..0000000 --- a/pages/books/hot/index.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/books/hot/index.wxss */ -@import "../../school/cert.wxss"; \ No newline at end of file diff --git a/pages/books/index.js b/pages/books/index.js deleted file mode 100644 index 5753577..0000000 --- a/pages/books/index.js +++ /dev/null @@ -1,57 +0,0 @@ -// pages/books/index.js -var app = getApp(); -Page({ - /** - * 页面的初始数据 - */ - data: { - keyword: "", - searchType: '', - searchResult: {}, - isLoading: true - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function(options) { - const searchType = options.type; - const keyword = options.keyword; - if (keyword.indexOf('978') >= 0) { - wx.redirectTo({ url: `../books/detail?code=${keyword}&codeType=isbn` }) - return - } - // console.log(options) - this.setData({ searchType: searchType, keyword: keyword }) - wx.showLoading({ title: '在找了在找了...' }); - var _this = this; - wx.request({ - url: `${app.globalData.domain}/book/search`, - data: {type: searchType, keyword: keyword}, - timeout: app.globalData.requestTimeout, - method: 'GET', - success: function(res) { - wx.hideLoading({}) - _this.setData({ isLoading: '' }) - if (res.data.total > 0) { - _this.setData({ - searchResult: res.data - }) - } - } - }) - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function() { - return { - path: `pages/books/index?keyword=${this.data.keyword}&type=${this.data.searchType}`, - title: `图书馆有这么多关于【${this.data.keyword}】的书啊~`, - } - } -}) \ No newline at end of file diff --git a/pages/books/index.json b/pages/books/index.json deleted file mode 100644 index 10ada01..0000000 --- a/pages/books/index.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/books/index.wxml b/pages/books/index.wxml deleted file mode 100644 index 2fd0197..0000000 --- a/pages/books/index.wxml +++ /dev/null @@ -1,37 +0,0 @@ - - - 图书查询 - - - - - - - - - - 【{{keyword}}】相关的图书 - - - - 在经历{{searchResult.cost}}秒的折腾后,我们为您找到了以下{{searchResult.total}}条内容 - - - - - - - {{item.title}} - - {{item.author}} \n 索书号:{{item.callNo}} - - - - - - - - - - - \ No newline at end of file diff --git a/pages/books/index.wxss b/pages/books/index.wxss deleted file mode 100644 index d06fa53..0000000 --- a/pages/books/index.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/books/index.wxss */ -@import "../school/cert.wxss"; - -page { - background: var(--cyan); -} \ No newline at end of file diff --git a/pages/books/overdue/index.js b/pages/books/overdue/index.js deleted file mode 100644 index e279b31..0000000 --- a/pages/books/overdue/index.js +++ /dev/null @@ -1,136 +0,0 @@ -// pages/books/overdue/index.js -const app = getApp(); -Page({ - - /** - * 页面的初始数据 - */ - data: { - title: '图书超期', - isLoading: '加载中', - screenHeight: '900', - type: 'bulletin', - uid: '', - myFine: '', - typeList: [{ - title: '超期催还', - value: 'bulletin' - }, { - title: '超期欠款', - value: 'debt' - }], - datalist: [] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - const type = options.type ? options.type : 'bulletin'; - this.inital(type); - this.getDatalist(type); - }, - inital: function (type) { - const device = wx.getSystemInfoSync(); - const uid = app.globalData.edusysUserInfo.uid; - this.setData({ screenHeight: device.screenHeight, type: type, uid: uid }); - wx.showShareMenu({ withShareTicket: true, menus: ['shareAppMessage', 'shareTimeline'] }); - }, - typeChanged: function (e) { - const type = this.data.typeList[e.currentTarget.dataset.index].value; - // console.log(type); - this.setData({ type: type}); - this.getDatalist(type); - }, - getDatalist: function (type = 'bulletin', page = '1') { - const _this = this; - wx.request({ - url: `${app.globalData.domain}/book/overdue/${type}`, - data: { page: page}, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({datalist: res.data, isLoading: false}) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - // 上一页 - lastPage: function () { - const current = this.data.datalist.pagination.current; - const targetPage = current > 1 ? Number(current) - 1 : 2; - this.getDatalist(this.data.type, targetPage); - }, - // 下一页 - nextPage: function () { - const current = this.data.datalist.pagination.current; - const last = this.data.datalist.pagination.last; - const targetPage = current < last ? Number(current) + 1 : last; - this.getDatalist(this.data.type, targetPage); - }, - searchInput: function (e) { - const value = e.detail.value; - // console.log(value) - this.setData({ uid: value }); - }, - search: function () { - const uid = this.data.uid; - const _this = this; - wx.request({ - url: `${app.globalData.domain}/book/fine/${uid}`, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({myFine: res.data}) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - var _this = this; - setTimeout(function () { _this.setData({ isLoading: false }) }, 1000); - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - - } -}) \ No newline at end of file diff --git a/pages/books/overdue/index.json b/pages/books/overdue/index.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/books/overdue/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/books/overdue/index.wxml b/pages/books/overdue/index.wxml deleted file mode 100644 index 30ceabc..0000000 --- a/pages/books/overdue/index.wxml +++ /dev/null @@ -1,82 +0,0 @@ - - - {{title}} - - - - - - - - - - - {{item.title}} - - - - - - 检索我的借阅超期信息 - - - - 证件号 - - - - - - - - - - 查找结果 - - - - - 您有{{myFine.overdueCount}}条超期图书记录 \n {{myFine.fineCount}}条欠款记录,共{{myFine.fineSum}}元\n - - 您所查找的证件号:{{myFine.opacid}} - - - - - - - - 书已经超期,请及时归还 - 有超期欠款未缴纳 - - - - - - - - - {{item[1].value}} - - - {{item[1].value}} - - {{item[0].title}}:{{item[0].value}} | {{item[2].value}} - - - - - - - - - {{datalist.pagination.current}} / - {{datalist.pagination.last}} - - - - \ No newline at end of file diff --git a/pages/books/overdue/index.wxss b/pages/books/overdue/index.wxss deleted file mode 100644 index 4d83faf..0000000 --- a/pages/books/overdue/index.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/books/overdue/index.wxss */ -@import "../../school/cert.wxss"; \ No newline at end of file diff --git a/pages/books/recommend/index.js b/pages/books/recommend/index.js deleted file mode 100644 index ba7a018..0000000 --- a/pages/books/recommend/index.js +++ /dev/null @@ -1,85 +0,0 @@ -// pages/books/recommend/index.js -const app = getApp(); -Page({ - - /** - * 页面的初始数据 - */ - data: { - title: '图书荐购', - isLoading: '加载中', - screenHeight: '900', - datalist: [] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.inital(); - }, - inital: function () { - this.getRecommendBooks(); - }, - getRecommendBooks:function () { - var _this = this - wx.request({ - url: `${app.globalData.domain}/book/recommend/history`, - timeout: app.globalData.requestTimeout, - success: function(res) { - _this.setData({ - datalist: res.data - }) - } - }) - }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - var _this = this; - setTimeout(function () { _this.setData({ isLoading: false }) }, 1000); - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - - } -}) \ No newline at end of file diff --git a/pages/books/recommend/index.json b/pages/books/recommend/index.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/books/recommend/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/books/recommend/index.wxml b/pages/books/recommend/index.wxml deleted file mode 100644 index 7592d49..0000000 --- a/pages/books/recommend/index.wxml +++ /dev/null @@ -1,27 +0,0 @@ - - - {{title}} - - - - - - - - - - - - {{item.data[0].value}}.《{{item.data[1].value}}》 - - {{item.data[2].value}} | {{item.data[3].value}} \n {{item.data[4].title}}:{{item.data[4].value}} | {{item.data[5].value}}\n {{item.data[6].title}}:{{item.data[6].value}}暂无 - - - - - - - - - \ No newline at end of file diff --git a/pages/books/recommend/index.wxss b/pages/books/recommend/index.wxss deleted file mode 100644 index c79a027..0000000 --- a/pages/books/recommend/index.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/books/recommend/index.wxss */ -@import "../../school/cert.wxss"; \ No newline at end of file diff --git a/pages/books/search.js b/pages/books/search.js deleted file mode 100644 index b46a07d..0000000 --- a/pages/books/search.js +++ /dev/null @@ -1,108 +0,0 @@ -// pages/books/search.js -var app = getApp(); -Page({ - /** - * 页面的初始数据 - */ - data: { - searchType: '02', - radioItems: [ - { name: '书名', value: '02', checked: true }, - { name: '作者', value: '03' }, - { name: '主题', value: '04' }, - { name: '出版社', value: '09' } - ], - keyword: '', - hotwords: [], - shelfCatalog: [] - }, - onLoad: function() { - this.inital() - }, - inital: function () { - this.getHotKeyword() - this.getShelfCatalog() - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - getHotKeyword: function () { - var _this = this - wx.request({ - url: `${app.globalData.domain}/book/hot/keyword/top10`, - timeout: app.globalData.requestTimeout, - success: function (res) { - _this.setData({ hotwords: res.data }) - } - }) - }, - getShelfCatalog: function () { - var _this = this - wx.request({ - url: `${app.globalData.domain}/book/shelf/catalog`, - timeout: app.globalData.requestTimeout, - success: function (res) { - _this.setData({ shelfCatalog: res.data }) - } - }) - }, - radioChange: function (e) { - this.setData({ searchType: e.detail.value }) - var radioItems = this.data.radioItems; - for (var i = 0, len = radioItems.length; i < len; ++i) { - radioItems[i].checked = radioItems[i].value == e.detail.value; - } - this.setData({ - radioItems: radioItems, - }); - }, - keywordInput: function (e) { - this.setData({ - keyword: e.detail.value - }); - }, - searchBook: function () { - const searchType = this.data.searchType; - const keyword = this.data.keyword; - // console.log(searchType, keyword); - if(keyword.length == 0){ - wx.showToast({ title: '请输入检索关键字', icon: 'none' }); - return - } - wx.showLoading({ title: '在找了在找了...' }) - if (keyword.indexOf('978') >= 0) { - wx.navigateTo({ url: `../books/detail?code=${keyword}&codeType=isbn` }) - return - } - wx.request({ - url: `${app.globalData.domain}/book/search`, - data: {type: searchType, keyword: keyword}, - method: 'GET', - success: function (res) { - wx.hideLoading() - if (res.data.total == '图书馆系统无响应') { - wx.showToast({ title: '图书馆OPAC系统无响应', icon: 'none' }); - } else if (res.data.total == 0) { - wx.showToast({ title: '本馆暂无此书', icon: 'none' }); - } else if (res.data.code == 500) { - wx.showToast({ title: res.data.message, icon: 'none' }); - } else { - wx.navigateTo({ - url: `../books/index?type=${searchType}&keyword=${keyword}`, - }) - } - } - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - path: `pages/books/search`, - title: `图书查找检索 - 贝壳小盒子`, - } - } -}) \ No newline at end of file diff --git a/pages/books/search.json b/pages/books/search.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/books/search.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/books/search.wxml b/pages/books/search.wxml deleted file mode 100644 index a71af4e..0000000 --- a/pages/books/search.wxml +++ /dev/null @@ -1,45 +0,0 @@ - - - 贝壳小盒子 - 图书检索 - - - - - - 馆藏图书检索 - - - - - - - - - - - {{item.name}} - - - - - - - - - 热门检索关键词 - - 储物柜 - {{item}} - - - - - - 学科图书类别导航 - - - {{item.title}} - {{citem.title}} - - - \ No newline at end of file diff --git a/pages/books/search.wxss b/pages/books/search.wxss deleted file mode 100644 index e1166fb..0000000 --- a/pages/books/search.wxss +++ /dev/null @@ -1,4 +0,0 @@ -/* pages/books/search.wxss */ -page { - background-color: var(--wegreen); -} \ No newline at end of file diff --git a/pages/books/shelf.js b/pages/books/shelf.js deleted file mode 100644 index e1e51f6..0000000 --- a/pages/books/shelf.js +++ /dev/null @@ -1,86 +0,0 @@ -// pages/books/shelf.js -var app = getApp(); -Page({ - /** - * 页面的初始数据 - */ - data: { - isLoading: true, - title: '', - id: '', - shelf: [], - clc: '', - slc: '', - shelfType: 'personal', - year: 5 - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - let shelfType = options.shelfType ? options.shelfType : 'personal'; // personal或public - if (shelfType == 'personal') { - this.setData({ - title: options.title, - shelfType: shelfType, - id: options.id - }) - this.getShelf(options.id) - } - if (shelfType == 'public') { - this.setData({ - title: options.title, - clc: options.clc, - slc: options.slc, - shelfType: shelfType - }) - this.getShelfCatalogBooks(options.title, options.clc, options.slc) - } - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - getShelf: function (id) { - var _this = this; - wx.request({ - url: `${app.globalData.domain}/book/shelf/${id}`, - method: 'GET', - success: function(res) { - _this.setData({shelf: res.data, isLoading: ''}) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - getShelfCatalogBooks: function (title, clc, slc) { - var _this = this; - wx.request({ - url: `${app.globalData.domain}/book/shelf/catalog/books?name=${title}&clc=${clc}&slc=${slc}`, - method: 'GET', - timeout: app.globalData.requestTimeout, - success: function(res) { - _this.setData({shelf: res.data, isLoading: ''}) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - let para = `?shelfType=${this.data.shelfType}&title=${this.data.title}` - if (this.data.shelfType == 'personal') { - para = `${para}&id=${this.data.id}` - } - if (this.data.shelfType == 'public') { - para = `${para}&clc=${this.data.clc}&slc=${this.data.slc}` - } - - return { - path: `pages/books/shelf?shelfType=${this.data.shelfType}&type=${this.data.searchType}`, - title: `贝壳小盒子 - 书架【${this.data.title}】`, - } - } -}) \ No newline at end of file diff --git a/pages/books/shelf.json b/pages/books/shelf.json deleted file mode 100644 index 10ada01..0000000 --- a/pages/books/shelf.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/books/shelf.wxml b/pages/books/shelf.wxml deleted file mode 100644 index a05afee..0000000 --- a/pages/books/shelf.wxml +++ /dev/null @@ -1,35 +0,0 @@ - - - 书架 - {{title}} - - - - - - - - - - 【{{title}}】书架图书 - - - - - - - - {{item.data[0].value}}. {{item.data[1].value}} - - {{item.data[2].value}} | {{item.data[3].value}} | {{item.data[4].value}} \n {{item.data[5].title}}:{{item.data[5].value}} - - - - - - - - - - - \ No newline at end of file diff --git a/pages/books/shelf.wxss b/pages/books/shelf.wxss deleted file mode 100644 index 3bf7e42..0000000 --- a/pages/books/shelf.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/books/shelf.wxss */ -@import "../school/cert.wxss"; - -page { - background: var(--cyan); -} \ No newline at end of file diff --git a/pages/calendar/calendar.js b/pages/calendar/calendar.js new file mode 100644 index 0000000..f96b181 --- /dev/null +++ b/pages/calendar/calendar.js @@ -0,0 +1,65 @@ +// pages/calendar/calendar.js +var util = require('../../utils/time.js'); +var app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + isLoading: true, + jsonContent: '' + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + // 调用函数时,传入new Date()参数,返回值是日期和时间 + var time = util.formatTime(new Date()); + // 再通过setData更改Page()里面的data,动态更新页面的数据 + var that = this; + wx.request({ + url: app.globalData.apiURL + '/calendar.php', + success(res) { + console.log(res.data) + that.setData({ + jsonContent: res.data, + }) + setTimeout(function() { + that.setData({ + isLoading: false + }); + }, 800); + } + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + + }, + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + return { + title: '北京科技大学天津学院校历', + path: 'pages/calendar/calendar', + } + }, + showPic: function() { + wx.previewImage({ + current: 'https://z4a.net/images/2019/06/22/19-20II.jpg', // 当前显示图片的http链接 + urls: ["https://z4a.net/images/2019/06/22/19-20II.jpg"] // 需要预览的图片http链接列表 + }) + } +}) \ No newline at end of file diff --git a/pages/calendar/calendar.json b/pages/calendar/calendar.json new file mode 100644 index 0000000..c684348 --- /dev/null +++ b/pages/calendar/calendar.json @@ -0,0 +1,5 @@ +{ + "navigationBarBackgroundColor": "#030c13", + "backgroundColor": "#030c13", + "navigationBarTitleText": "校历 - 贝壳小盒子" +} \ No newline at end of file diff --git a/pages/calendar/calendar.wxml b/pages/calendar/calendar.wxml new file mode 100644 index 0000000..17e9854 --- /dev/null +++ b/pages/calendar/calendar.wxml @@ -0,0 +1,147 @@ + + + + + + + + + + 校历 + + {{jsonContent.schoolYear}}学年 第{{jsonContent.semester}}学期\n + {{jsonContent.month}} 月{{jsonContent.day}} 日(第 {{jsonContent.teachWeek}} 周) {{jsonContent.dayOfWeek}} + {{jsonContent.month}} 月 {{jsonContent.day}} 日(假期) {{jsonContent.dayOfWeek}} + + + + + + + + 开学 + + {{jsonContent.startClassDate}} + + + {{jsonContent.gap2StartClass}}天 + + + + + + 本周(第{{jsonContent.teachWeek}}周)事项 + + + 大一 + {{jsonContent.thisWeekWork.freshmanWork}} + + + 大二 + {{jsonContent.thisWeekWork.sophomoreWork}} + + + 大三 + {{jsonContent.thisWeekWork.juniorWork}} + + + 大四 + {{jsonContent.thisWeekWork.seniorWork}} + + + + + + + + + + + + 下周(第{{jsonContent.teachWeek+1}}周)事项 + + + 大一 + {{jsonContent.nextWeekWork.freshmanWork}} + + + 大二 + {{jsonContent.nextWeekWork.sophomoreWork}} + + + 大三 + {{jsonContent.nextWeekWork.juniorWork}} + + + 大四 + {{jsonContent.nextWeekWork.seniorWork}} + + + + + + + + + + {{item.holidayName}} + + {{item.holidayRestInfo}} + {{item.holidayDate}} + + + {{item.gapDays}}天 + + + + + + + + + + 考试周 + + {{jsonContent.examWeekDate}} + + + {{jsonContent.gap2ExamWeek}}天 + + + + + + + + + 放{{jsonContent.month + <8? '暑': '寒'}}假 + {{jsonContent.vactionDate}} + + + {{jsonContent.gap2Vaction}}天 + + + + + + + + 查看校历 + + + + + + + + + + Airmole. + + Copyright © 2020 贝壳小盒子(ShellBox) + + + \ No newline at end of file diff --git a/pages/calendar/calendar.wxss b/pages/calendar/calendar.wxss new file mode 100644 index 0000000..132f6ce --- /dev/null +++ b/pages/calendar/calendar.wxss @@ -0,0 +1,227 @@ +/* pages/calendar/calendar.wxss */ +@import "../common/weui.wxss"; + +Page { + background-color: #030c13; +} + +.page__hd { + padding: 40px; +} + +.page__bd_spacing { + padding-left: 15px; + padding-right: 15px; +} + +.page__ft { + padding-bottom: 10px; + text-align: center; +} + +.page__title { + color: #fff; + margin-left: 30rpx; + text-align: left; + font-size: 20px; + font-weight: 400; +} + +.page__desc { + margin-top: 5px; + color: #fee; + text-align: left; + font-size: 30rpx; + margin-left: 30rpx; +} + +.panelBK { + margin: 25rpx; + background-color: #fff; + padding: 25rpx 0; + border-radius: 25rpx; +} + +.setCenter { + text-align: center; +} + +.shareIcon { + width: 26px; + height: 26px; + vertical-align: text-bottom; +} + +.page__bd { + margin-top: 30rpx; + padding-bottom: 1rpx; +} + +.page__hd { + padding: 20rpx 35rpx 0 35rpx; +} + +.weui-items { + margin: 30rpx 20rpx; +} + +.weui-item { + margin: 30rpx 5rpx; + padding: 20rpx; + color: #fff; + height: 150rpx; +} + +.weui-flex { + justify-content: space-between; + align-items: center; +} + +.background-1 { + background: #ad8dd6; +} + +.background-2 { + background: #ff9abc; +} + +.thisWeek { + color: #010c10; + background: #18febd; + height: 450rpx; +} + +.nextWeek { + color: #010c10; + background: #4ac3d6; + height: 450rpx; +} + +.kaixue { + background: #3494e6; +} + +.hanshujia { + background: #f80759; +} + +.kaoshi { + background: #ff7a5b; +} + +.work { + color: #010c10; + font-size: 32rpx; +} + +.wraper { + /* background: linear-gradient(to right, #77a1d3, #79cbca, #e684ae); */ + color: #d6eceb; + height: 150rpx; + border-radius: 15px; + text-align: left; + margin-top: -50rpx; +} + +.tt { + color: #010c10; + margin-bottom: 15rpx; + font-size: 42rpx; + text-align: center; +} + +.warmtips { + text-align: center; + color: #e5f6f5; + font-size: 42rpx; +} + +.weui-item__title { + font-size: 42rpx; +} + +.weui-item__desc { + font-size: 28rpx; +} + +.border-shadow { + border-radius: 15rpx; +} + +.clear { + position: inherit; + display: inherit; + margin-left: inherit; + margin-right: inherit; + padding-left: 0; + padding-right: 0; + box-sizing: inherit; + font-size: inherit; + text-align: inherit; + text-decoration: inherit; + line-height: inherit; + border-radius: inherit; + -webkit-tap-highlight-color: inherit; + overflow: inherit; + color: inherit; + background-color: inherit; +} + +button::after { + content: inherit; + width: inherit; + height: inherit; + position: inherit; + top: inherit; + left: inherit; + border: inherit; + -webkit-transform: inherit; + transform: inherit; + -webkit-transform-origin: inherit; + transform-origin: inherit; + box-sizing: inherit; + border-radius: inherit; +} + +.button-sp-area { + margin: 0 auto; + padding-top: 15px; + width: 60%; +} + +.mini-btn { + margin-right: 5px; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #18febd; + color: #010c10; + text-align: center; + border-radius: 15rpx; +} + +/* 悬浮按钮的 */ + +.round-click { + height: 120rpx; + width: 120rpx; + background-color: #bc3e49; + border-radius: 100%; + position: fixed; + bottom: 50rpx; + right: 25rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; +} + +.round-click text { + font-size: 32rpx; + max-width: 80rpx; + color: #fff; + text-align: center; +} diff --git a/pages/cet/find.js b/pages/cet/find.js new file mode 100644 index 0000000..66a6ed4 --- /dev/null +++ b/pages/cet/find.js @@ -0,0 +1,139 @@ +// pages/cet/find.js +var app = getApp() +Page({ + data: { + needCookie: '', + needPcookie: '', + PreInfo: {}, + defaultUid: '' + }, + onLoad: function() { + + var nowTimestamp = new Date().getTime(); + var stopCanQueryTime = '1582300800000'; + + + if (nowTimestamp > stopCanQueryTime) { + wx.showToast({ + title: '已超过准考证查询时间,可能查询不到', + icon: 'none', + duration: 10000 + }) + return; + } + + var that = this; + var uid = wx.getStorageSync('uid'); + that.setData({ + defaultUid: uid + }) + this.getVcode(); + }, + submitInfo: function(e) { + wx.showToast({ + title: "查询中...", + icon: "loading", + duration: 10000 + }) + var that = this; + var uid = e.detail.value.username; + var idcard = e.detail.value.idcard; + var name = e.detail.value.name; + var vcode = e.detail.value.vcode; + if ((uid.length == 0 || idcard.length != 18) || (vcode.length != 4 || name.length == 0)) { + wx.showToast({ + title: '输入有误', + image: '/images/info.png', + icon: 'none', + duration: 1000 + }); + } else { + wx.request({ + url: app.globalData.apiURL + '/CET/findCETNO.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + uid: uid, + idcard: idcard, + name: name, + cookie: that.data.PreInfo.cookie, + vcode: vcode, + pcookie: that.data.PreInfo.pcookie, + }, + success: function(res) { + console.log(res.data) + wx.hideToast() + // console.log(res.data); + try { + if (res.data[0].TestTicket.length == 15) { + var modalText = res.data[0].SubjectName + ':' + res.data[0].TestTicket; + if (res.data.length > 1) { + modalText = res.data[0].SubjectName + ':' + res.data[0].TestTicket + '\r\n' + res.data[1].SubjectName + ':' + res.data[1].TestTicket + } + wx.showModal({ + title: '查询成功', + content: modalText, + showCancel: false, + confirmText: '复制', + success(ress) { + if (ress.confirm) { + wx.setClipboardData({ + data: modalText, + success(ress) { + wx.showToast({ + icon: 'success', + title: '已复制到粘贴板', + }) + } + }) + } + } + }) + } + } catch (error) { + wx.showToast({ + icon: 'none', + title: res.data.desc, + }) + } + }, + complete: function() { + that.getVcode(); + } + }) + } + }, + getVcode: function() { + var that = this; + wx.request({ + url: app.globalData.apiURL + '/CET/getVcode.php', + success: function(res) { + // console.log(res.data); + that.setData({ + PreInfo: res.data, + }) + } + }); + }, + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + if (res.from === 'button') { + // 来自页面内转发按钮 + } + return { + title: '忘记四六级准考证号?来小盒子查查看', + path: 'pages/cet/find', + imageUrl: 'https://z4a.net/images/2020/02/13/cetfind.jpg', + success: function(res) { + // 转发成功 + }, + fail: function(res) { + // 转发失败 + } + } + }, +}) \ No newline at end of file diff --git a/pages/cet/find.json b/pages/cet/find.json new file mode 100644 index 0000000..9dea0a5 --- /dev/null +++ b/pages/cet/find.json @@ -0,0 +1,4 @@ +{ + "navigationBarBackgroundColor": "#0FA0D8", + "navigationBarTitleText": "四六级准考证找回" +} \ No newline at end of file diff --git a/pages/cet/find.wxml b/pages/cet/find.wxml new file mode 100644 index 0000000..95bf0e2 --- /dev/null +++ b/pages/cet/find.wxml @@ -0,0 +1,41 @@ + + + + 为避免(2月21日)当天服务器压力过大,请务必提前几天查询\n 查询成功后建议截图保存或记录好自己的准考证号 + + + + + + + + \ No newline at end of file diff --git a/pages/cet/find.wxss b/pages/cet/find.wxss new file mode 100644 index 0000000..1f6cb16 --- /dev/null +++ b/pages/cet/find.wxss @@ -0,0 +1,33 @@ +/* pages/cet/find.wxss */ +@import "../bookSearch/isbn/iputIsbn.wxss"; + +Page { + /* background-color: #7acfa6; */ + background: linear-gradient(45deg, #0081ff, #1cbbb4); +} + +.ads { + padding: 10rpx 15rpx 0rpx 15rpx; +} + +.bg-white { + box-shadow: 1rpx #1cbbb4; + background-color: var(--white); + color: var(--darkGray); +} + +.transparent { + background: rgba(255, 255, 255, 0.35); +} + + +.input-group { + display: flex; + align-items: center; + padding: 25rpx 10rpx; + margin: 40rpx 3%; + background: #fff; + border-radius: 15px; + border: 2px solid #f4f4f4; + transition: all 0.25s ease-in-out; +} \ No newline at end of file diff --git a/pages/classQuery/index.js b/pages/classQuery/index.js new file mode 100644 index 0000000..68dbf9a --- /dev/null +++ b/pages/classQuery/index.js @@ -0,0 +1,406 @@ +//获取应用实例 +var app = getApp(); +Page({ + data: { + uid: '', + pwd: '', + nickName: '', + remind: '加载中', + isLoading: true, + _days: ['一', '二', '三', '四', '五', '六', '日'], + activeClass: '', + activeClassItem: 0, + painting: {}, + shareImage: '', + whichDayOfWeek: '', + scroll: { + left: 0 //判断今天是不周末,是的话滚一下 + }, + timeRow: [{ + l1: '第一小节', + l2: '第二小节', + t1: '8:00-8:45', + t2: '8:50-9:35' + }, + { + l1: '第三小节', + l2: '第四小节', + t1: '9:55-10:40', + t2: '10:45-11:30' + }, + { + l1: '第五小节', + l2: '第六小节', + t1: '13:10-13:55', + t2: '14:00-14:45' + }, + { + l1: '第七小节', + l2: '第八小节', + t1: '15:00-15:45', + t2: '15:50-16:35' + }, + { + l1: '第九小节', + l2: '第十小节', + t1: '16:50-17:35', + t2: '17:40-18:25' + }, + ], + classJson: '', + targetLessons: [], + targetX: 0, //target x轴top距离 + targetY: 0, //target y轴left距离 + targetDay: 0, //target day + targetWid: 0, //target wid + targetI: 0, //target 第几个active + targetLen: 0, //target 课程长度 + blur: false, + is_vacation: false, // 是否为假期 + }, + onLoad: function(options) { + console.log('openID:' + app.globalData.openid) + + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + var courseCache = wx.getStorageSync('personal19Class'); + var cookie = options.cookie; + var vcode = options.vcode; + + if ((typeof(options.cookie) == 'undefined' || typeof(options.vcode) == 'undefined') && courseCache.length == 0) { + wx.redirectTo({ + url: '/pages/index/vcode?to=grkb&update=0', + }) + } + var that = this; + that.setInfo(); + console.log(pwd) + that.setData({ + uid: uid, + pwd: pwd, + }) + + + let showCache = true; + if (options.update == '1') { + showCache = false; + that.getTable(uid, pwd, false, cookie, vcode); + } + if (options.isShareFrom == 'tiue') { + showCache = false; + that.getTable(options.uid, options.pwd, showCache, 'cookie', 'code'); + } + + if (courseCache != "" && showCache) { + that.setData({ + uid: uid, + pwd: pwd, + classJson: courseCache, + isLoading: false + }) + } else if ((uid == '' || pwd == '') || (vcode == '' || cookie == '')) { + wx.navigateTo({ + url: '/pages/index/index' + }) + + } else { + that.getTable(uid, pwd, false, cookie, vcode); + } + + that.setData({ + nickName: app.globalData.nickName + }) + }, + bindGetUserInfo(e) { + console.log(e.detail.userInfo) + }, + setInfo: function() { + var that = this; + const whichDayOfWeek = new Date().getDay(); + const arr = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'staturday']; + that.setData({ + whichDayOfWeek: arr[whichDayOfWeek], + }) + }, + getTable: function(uid, pwd, showCookieClass, cookie, vcode) { + var that = this; + wx.request({ + url: app.globalData.apiURL + '/v4/courseTable.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + cookie: cookie, + vcode: vcode, + openid: app.globalData.openid, + }, + success: function(res) { + that.setData({ + classJson: res.data, + isLoading: false + }) + console.log(res.data); + if (res.data.status == 200) { + wx.setStorageSync('personal19Class', res.data); + wx.showToast({ + title: "刷新完成", + icon: "succeed", + duration: 2000 + }) + } + if (res.data.status == 401) { + wx.navigateTo({ + url: '/pages/error/queryerror?ErrorTips=' + "学号密码不对,请重新登录", + }) + } + if (res.data.status == 500) { + var personalClass = wx.getStorageSync('personal19Class'); + if (personalClass != "" && showCookieClass == true) { + that.setData({ + classJson: personalClass, + isLoading: false + }) + wx.showToast({ + title: '教务无法访问,当前展示离线缓存课表', + icon: 'none', + duration: 2000 + }) + } else {} + } + } + }) + }, + changeActiveItem: function(e) { + var that = this; + // console.log(e); + that.setData({ + activeClassItem: e.currentTarget.dataset.num, + }) + }, + onShow: function() { + var _this = this; + + }, + onReady: function() { + var that = this; + }, + showDetail: function(e) { + console.log(e) + // 点击课程卡片后执行 + var that = this; + that.setData({ + targetX: e.detail.x, + targetY: e.detail.y, + targetDay: 1, + targetWid: 2, + targetI: 1, + blur: true, + activeClass: e.currentTarget.dataset + }); + }, + goClassPlace: function(ep) { + console.log(ep.target.dataset.place); + var placeArr = ["1教", "2教", "3教", "4教", "5教", "6教", "7教", "8教", "9教", "10教", "11教", "12教", "理工馆", "社科馆"]; + var markerIdArr = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 5, 4]; + var result = placeArr.indexOf(ep.target.dataset.place.slice(0, -3)); + // console.log(result); + wx.navigateTo({ + url: '/pages/schoolNav/schoolNav?markerId=' + markerIdArr[result], + }) + }, + hideDetail: function() { + var that = this; + // 点击遮罩层时触发,取消主体部分的模糊,清空target + that.setData({ + blur: false, + targetLessons: [], + targetX: 0, + targetY: 0, + targetDay: 0, + targetWid: 0, + targetI: 0, + targetLen: 0, + activeClassItem: 0, + }); + }, + catchMoveDetail: function() { /*阻止滑动穿透*/ }, + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + var that = this; + // console.log(res); + return { + title: that.data.nickName + '的个人课表', + path: 'pages/classQuery/index?isShareFrom=true&uid=' + that.data.uid + '&pwd=' + that.data.pwd, + } + }, + refreshData: function() { + wx.redirectTo({ + url: '/pages/index/vcode?to=grkb&update=1', + }) + }, + eventDraw() { + var that = this; + if (that.data.shareImage != '') { + wx.previewImage({ + urls: [that.data.shareImage], + }) + wx.showToast({ + title: '图片已存至相册,可发给好友或设为壁纸', + icon: 'none', + duration: 3000 + }) + return + } + wx.showLoading({ + title: '绘制分享图片中', + mask: true + }) + const deviceInfo = wx.getSystemInfoSync(); + const screenWidth = deviceInfo.screenWidth; + const screenHeight = deviceInfo.screenHeight; + let topMargin = 10; + if (screenHeight / screenWidth >= 1.8) { + //检测是否为全面屏 + topMargin = 30; + } + var viewsArr = [{ + type: 'rect', + background: '#fff', + top: 0, + left: 0, + width: screenWidth, + height: screenHeight + }]; + //绘制星期 + const weekArr = ['周一', '周二', '周三', '周四', '周五']; + for (let i = 0; i < weekArr.length; i++) { + let rowTempArr = { + type: 'text', + content: weekArr[i], + fontSize: 16, + color: '#402D16', + textAlign: 'left', + top: topMargin, + left: 30 + (i * ((screenWidth - 30) / weekArr.length)), + bolder: true + }; + viewsArr.push(rowTempArr); + } + //绘制节数 + for (let i = 1; i <= 12; i++) { + let columnTempArr = { + type: 'text', + content: i, + fontSize: 16, + color: '#402D16', + textAlign: 'center', + top: (topMargin - 30) + (i * ((screenHeight - 30) / 12)), + left: 10, + bolder: true + }; + viewsArr.push(columnTempArr); + } + + const allCourseArr = that.data.classJson.course; + let j = 0; + for (let w in allCourseArr) { + if (j < 5) { + for (let i in allCourseArr[w]) { + try { + if (allCourseArr[w][i].courseName.length > 0) { + let classTempBgArr = { + type: 'rect', + background: '#7acfa6', + top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12)), + left: Number(30 + (j * ((screenWidth - 30) / weekArr.length))), + width: ((screenWidth - 30) / weekArr.length) - 1, + height: (1 * ((screenHeight - 30) / 6)) - 1 + }; + viewsArr.push(classTempBgArr); + let classTextTempArr = { + type: 'text', + content: allCourseArr[w][i].place + ' ' + allCourseArr[w][i].courseName, + fontSize: 16, + color: '#fff', + textAlign: 'left', + top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12) + 5), + left: Number(30 + (j * ((screenWidth - 30) / weekArr.length)) + 5), + breakWord: true, + MaxLineNumber: 7, + width: ((screenWidth - 30) / weekArr.length) - 20 + }; + viewsArr.push(classTextTempArr); + } + } catch (error) { + let classTempBgArr = { + type: 'rect', + background: '#7acfa6', + top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12)), + left: Number(30 + (j * ((screenWidth - 30) / weekArr.length))), + width: ((screenWidth - 30) / weekArr.length) - 1, + height: (1 * ((screenHeight - 30) / 6)) - 1 + }; + viewsArr.push(classTempBgArr); + let classTextTempArr = { + type: 'text', + content: allCourseArr[w][i][0].place + allCourseArr[w][i][0].courseName + ' ' + allCourseArr[w][i][1].place + allCourseArr[w][i][1].courseName, + fontSize: 16, + color: '#fff', + textAlign: 'left', + top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12) + 5), + left: Number(30 + (j * ((screenWidth - 30) / weekArr.length)) + 5), + breakWord: true, + MaxLineNumber: 7, + width: ((screenWidth - 30) / weekArr.length) - 20 + }; + viewsArr.push(classTextTempArr); + } + } + j++; + } + } + var canvasJson = { + width: screenWidth, + height: screenHeight, + views: viewsArr + }; + that.setData({ + painting: canvasJson + }) + }, + eventGetImage(event) { + var that = this; + console.log(event) + wx.hideLoading() + const { + tempFilePath, + errMsg + } = event.detail + if (errMsg === 'canvasdrawer:ok') { + this.setData({ + shareImage: tempFilePath + }) + wx.previewImage({ + urls: [tempFilePath], + }) + that.eventSave(); + } + }, + eventSave() { + wx.saveImageToPhotosAlbum({ + filePath: this.data.shareImage, + success(res) { + wx.showToast({ + title: '图片已存至相册,可发给好友或设为壁纸', + icon: 'none', + duration: 3000 + }) + } + }) + }, +}); \ No newline at end of file diff --git a/pages/course/my.json b/pages/classQuery/index.json similarity index 70% rename from pages/course/my.json rename to pages/classQuery/index.json index da49f2a..8b46196 100644 --- a/pages/course/my.json +++ b/pages/classQuery/index.json @@ -1,9 +1,8 @@ -{ +{ "navigationBarBackgroundColor": "#73b4ef", - "navigationBarTitleText": "我的课表", + "navigationBarTitleText": "个人课表 - 贝壳小盒子", "backgroundColor": "#73b4ef", "enablePullDownRefresh": false, - "navigationStyle": "default", "usingComponents": { "canvasdrawer": "/utils/canvasdrawer/canvasdrawer" } diff --git a/pages/classQuery/index.wxml b/pages/classQuery/index.wxml new file mode 100644 index 0000000..b39eb86 --- /dev/null +++ b/pages/classQuery/index.wxml @@ -0,0 +1,203 @@ + + + + + + + + + + + {{dates[week-1][0].month}} + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 周{{item}} + + + 时间 + + + + + + + + + + + + + + + + + + + + {{value.length}}项课程同节异周 + + 点击展开查看 + + + + + + + {{value.place}} + + {{value.courseName}} + + + + + + + + + + + + {{item.l1}} + {{item.t1}} + {{item.l2}} + {{item.t2}} + + + + + + 第十一节课 + 19:10-19:55 + 第十二节课 + 20:00-20:45 + 第十三节课 + 20:50-21:35 + + + + + + + + + + + {{activeClass.place}} + + {{activeClass.coursename}} + + + + + + + + + + + {{classJson.teachWeek}}周{{classJson.dayOfWeek}} + + + 课程{{key+1}} + + + + + + {{classJson.teachWeek}}周{{classJson.dayOfWeek}} + {{classJson.schoolYear}}学年第{{classJson.semester}}学期 + 更新 + 存图 + + + + + + + + + {{activeClass.json[activeClassItem].courseName}} + + + + 课程 + + + {{activeClass.whichjie}} + + 教师: {{activeClass.json[activeClassItem].teacher}} + + + 地点: {{activeClass.json[activeClassItem].place}}(📍前往) + + + 上课周: {{activeClass.json[activeClassItem].teachWeek}} + + + 上课: {{activeClass.json[activeClassItem].startTime}} + + + 下课: {{activeClass.json[activeClassItem].endTime}} + + + + + + + + + + + {{activeClass.coursename}} + + + + 课程 + + + {{activeClass.whichjie}} + + 教师: {{activeClass.teacher}} + + + 地点: {{activeClass.place}}(📍前往) + + + 上课周: {{activeClass.teachweek}} + + + 上课: {{activeClass.starttime}} + + + 下课: {{activeClass.endtime}} + + + + + + + + + + \ No newline at end of file diff --git a/pages/course/my.wxss b/pages/classQuery/index.wxss similarity index 69% rename from pages/course/my.wxss rename to pages/classQuery/index.wxss index 97ae864..febcab5 100644 --- a/pages/course/my.wxss +++ b/pages/classQuery/index.wxss @@ -1,34 +1,45 @@ -/* pages/course/my.wxss */ -@import "../index/login.wxss"; -@import "../../app.wxss"; - -.container{ +.container { background-color: #fff; padding-bottom: 0; overflow: hidden; } +.navText { + color: #0069d9; +} + +.bdwz { + background-color: #7399ff; + color: #fff; +} + /**.main-box**/ -.main-box{ + +.main-box { position: relative; width: 100%; height: 1328rpx; display: flex; flex-direction: row; padding-bottom: 100rpx; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); } -.main-box-active{ + +.main-box-active { padding-bottom: 500rpx; } -.blur-area{ + +.blur-area { overflow: hidden; } -.blur{ - filter: blur(3px); + +.blur { + filter: blur(3px); } + /**.kb-num-ctn**/ -.kb-num-ctn{ + +.kb-num-ctn { position: absolute; top: 0; left: 0; @@ -45,29 +56,34 @@ color: #777; padding-bottom: 100rpx; } -.kb-num-ctn-inner{ + +.kb-num-ctn-inner { z-index: 1; } -.kb-num-ctn-hide{ - transform: translate3d(-35rpx,0,0); + +.kb-num-ctn-hide { + transform: translate3d(-35rpx, 0, 0); } -.kb-num-ctn view{ + +.kb-num-ctn view { height: 100rpx; line-height: 100rpx; text-align: center; } + .kb-num-ctn .kb-timeline-tri { position: absolute; left: 0; top: 50%; - margin-top: 58rpx; + margin-top: 58rpx; width: 0; height: 0; line-height: 0; border: 10rpx solid transparent; border-left-color: #0069d9; - opacity: .6; + opacity: 0.6; } + .kb-num-ctn .kb-mon { height: 60rpx; font-size: 9pt; @@ -78,26 +94,32 @@ justify-content: center; border-bottom: 1rpx solid #eee; } -.mg-t{ + +.mg-t { padding-top: 8rpx; } -.mg-8{ + +.mg-8 { margin-bottom: 8rpx; } -.mg-12{ + +.mg-12 { margin-bottom: 12rpx; } + /**.kb-ctn**/ -.kb-ctn{ + +.kb-ctn { flex: 1; width: 100%; height: 1416rpx; display: flex; flex-direction: column; align-items: stretch; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); } -.kb-title{ + +.kb-title { position: absolute; top: 0; left: 0; @@ -109,10 +131,12 @@ margin-left: 35rpx; color: #777; } -.kb-date{ + +.kb-date { color: #909090; } -.kb-title-item{ + +.kb-title-item { flex: 1; display: flex; flex-direction: column; @@ -124,23 +148,36 @@ font-size: 9pt; line-height: 120%; } +.kb-title-itemTime { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; + text-align: center; + width: 180rpx; + margin-left: 10rpx; + font-size: 9pt; + line-height: 120%; +} -.kb-cards-ctn{ +.kb-cards-ctn { position: absolute; top: 0; left: 0; flex: 1; width: 1100rpx; - height: 1416rpx; + height: 1248rpx; display: flex; align-items: stretch; padding: 8rpx 0 12rpx 10rpx; margin-left: 35rpx; margin-top: 60rpx; padding-bottom: 100rpx; - transition: margin-bottom .15s cubic-bezier(0.19, 1, 0.22, 1); + transition: margin-bottom 0.15s cubic-bezier(0.19, 1, 0.22, 1); } -.kb-cards-column{ + +.kb-cards-column { position: relative; flex: 1; display: flex; @@ -152,17 +189,30 @@ margin-right: 10rpx; } -.kb-bg{ +.kb-cards-columnTime { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + width: 180rpx; + height: 100%; + background: #eee; + margin-left: 10rpx; +} + +.kb-bg { position: absolute; width: 120rpx; top: -8rpx; bottom: -12rpx; background: -webkit-gradient(linear, left top, left bottom, from(#eff7ff), color-stop(0.5, #8cc4ff), to(#eff7ff)); z-index: 1; - opacity: .6; - transition: all .1s; + opacity: 0.6; + transition: all 0.1s; } -.kb-timeline{ + +.kb-timeline { display: none; position: absolute; left: 0; @@ -173,10 +223,10 @@ height: 5rpx; background: #0069d9; z-index: 99; - opacity: .6; + opacity: 0.6; } -.kb-timeline::before, -.kb-timeline::after{ + +.kb-timeline::before, .kb-timeline::after { content: ''; position: absolute; width: 5rpx; @@ -184,16 +234,18 @@ border-radius: 1rpx; background: #0069d9; } -.kb-timeline::before{ + +.kb-timeline::before { left: -3rpx; top: -2rpx; } -.kb-timeline::after{ + +.kb-timeline::after { right: -3rpx; top: -2rpx; } -.kb-card{ +.kb-card { position: relative; z-index: 10; width: 120rpx; @@ -201,12 +253,20 @@ border-radius: 5rpx; } -.kb-card-content{ +.kb-cardTime { + position: relative; + z-index: 10; + width: 180rpx; + min-height: 200rpx; + border-radius: 5rpx; +} + +.kb-card-content { position: absolute; z-index: 11; background: #eee; width: 120rpx; - height: 200rpx; + min-height: 200rpx; padding: 0 10rpx; text-align: center; box-sizing: border-box; @@ -215,25 +275,58 @@ flex-flow: column nowrap; overflow: hidden; color: #fff; - box-shadow: 0 0 6rpx 2rpx rgba(255,255,255,.45) + box-shadow: 0 0 6rpx 2rpx rgba(255, 255, 255, 0.45); +} + +.kb-card-contentTime { + position: absolute; + z-index: 11; + /* background: #eee; */ + width: 180rpx; + min-height: 200rpx; + padding: 0 10rpx; + text-align: center; + box-sizing: border-box; + border-radius: 5rpx; + display: flex; + flex-flow: column nowrap; + overflow: hidden; + color: #000; + box-shadow: 0 0 6rpx 2rpx rgba(255, 255, 255, 0.45); } -.kb-card-place-num{ + +.kb-card-place-num { font-size: 13pt; padding: 15rpx 0; } -.kb-card-place-words{ + +.kb-card-place-words { font-size: 10pt; padding: 15rpx 0; - line-height: 120%; + line-height: 120%; } -.kb-card-name{ + +.kb-card-place-wordsTime { + font-size: 10pt; + padding: 15rpx 0; + line-height: 80%; +} + +.kb-card-place-wordsTime2 { + font-size: 10pt; + padding: 15rpx 0; + line-height: 25%; +} + +.kb-card-name { flex: 1; display: flex; align-items: center; justify-content: center; overflow: hidden; } -.kb-card-name-text{ + +.kb-card-name-text { font-size: 10pt; padding-bottom: 5rpx; display: -webkit-box; @@ -242,7 +335,8 @@ overflow: hidden; line-height: 130%; } -.k-sec::before{ + +.k-sec::before { content: ''; position: absolute; top: 6rpx; @@ -253,43 +347,30 @@ border-radius: 2rpx; background: #fff; } -.green{ + +.green { background: #7acfa6; } -.blue{ - background: #73b4ef; -} -.purple{ - background: #9f8bea; -} -.red{ - background: #e286ab; -} -.yellow{ - background: #ffcb63; -} -.orange{ - background: #f37b1d; +.blue { + background: #73b4ef; } -.olive{ - background: #8dc63f; +.purple { + background: #9f8bea; } -.cyan{ -background: #1cbbb4; +.red { + background: #e286ab; } -.blue{ -background: #0081ff; +.yellow { + background: #ffcb63; } -.mauve{ -background: #9c26b0; -} /* 遮罩层样式 */ -.kb-detail{ + +.kb-detail { position: absolute; z-index: 998; top: 0; @@ -298,25 +379,29 @@ background: #9c26b0; width: 910rpx; height: 1248rpx; padding: 68rpx 0 100rpx 45rpx; - background: rgba(166,166,166,.45); - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + background: rgba(166, 166, 166, 0.45); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); } -.kb-detail-card-content{ + +.kb-detail-card-content { position: absolute; box-shadow: 0 0 50rpx #bbb; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); } -.kb-detail-card-content-active{ - transform: scale(1.08,1.08); + +.kb-detail-card-content-active { + transform: scale(1.08, 1.08); } -.kb-detaile-card-ctn{ + +.kb-detaile-card-ctn { position: absolute; z-index: 999; width: 120rpx; } /* 底部详情样式 */ -.kb-info-ctn{ + +.kb-info-ctn { position: fixed; z-index: 1000; left: 0; @@ -331,30 +416,34 @@ background: #9c26b0; border-top-right-radius: 15rpx; background: #73b4ef; font-size: 11pt; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); - transform: translate3d(0,400rpx,0); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); + transform: translate3d(0, 400rpx, 0); } -.kb-info-ctn-open{ - transform: translate3d(0,0,0); + +.kb-info-ctn-open { + transform: translate3d(0, 0, 0); } -.kb-info-title{ + +.kb-info-title { color: #fff; height: 100rpx; width: 100%; display: flex; align-items: center; } -.kb-term{ + +.kb-term { flex: 1; - text-align: left; - margin-left: 30rpx; + text-align: center; } -.kb-choose-view-box{ + +.kb-choose-view-box { display: flex; margin: 0 20rpx 0 62rpx; padding: 25rpx; } -.kb-choose-view{ + +.kb-choose-view { position: relative; display: flex; flex-direction: column; @@ -363,7 +452,8 @@ background: #9c26b0; width: 38rpx; height: 38rpx; } -.kb-choose-view text{ + +.kb-choose-view text { font-size: 24rpx; width: 28rpx; height: 28rpx; @@ -377,6 +467,7 @@ background: #9c26b0; bottom: 0; right: 0; } + .kb-choose-view text.active { z-index: 2; top: 0; @@ -386,35 +477,40 @@ background: #9c26b0; color: #73b4ef; background: #fff; } -.kb-info-week{ + +.kb-info-week { width: 150rpx; padding: 20rpx 10rpx; text-align: center; } -.kb-swipers{ + +.kb-swipers { flex: 1; position: relative; font-size: 11pt; height: 100%; margin: 0 50rpx; } -.kb-week-swiper{ + +.kb-week-swiper { width: 100%; height: 100%; } -.kb-week-swiper-item{ + +.kb-week-swiper-item { display: flex; justify-content: center; align-items: center; width: 100%; height: 100%; - text-align: center; + text-align: center; } -.kb-week-swiper-item text.active{ + +.kb-week-swiper-item text.active { font-weight: bold; } -.kb-swiper-mask-left, -.kb-swiper-mask-right{ + +.kb-swiper-mask-left, .kb-swiper-mask-right { position: absolute; z-index: 999; top: 0; @@ -424,34 +520,38 @@ background: #9c26b0; align-items: center; justify-content: center; } -.kb-swiper-mask-left{ + +.kb-swiper-mask-left { left: 0; - background: -webkit-gradient(linear, left top, right top, from(#73b4ef), to(rgba(86,165,238,0))); + background: -webkit-gradient(linear, left top, right top, from(#73b4ef), to(rgba(86, 165, 238, 0))); } -.kb-swiper-mask-right{ + +.kb-swiper-mask-right { right: 0; - background: -webkit-gradient(linear, left top, right top, from(rgba(86,165,238,0)), to(#73b4ef)); + background: -webkit-gradient(linear, left top, right top, from(rgba(86, 165, 238, 0)), to(#73b4ef)); } -.kb-swiper-mask-left image, -.kb-swiper-mask-right image { + +.kb-swiper-mask-left image, .kb-swiper-mask-right image { width: 30rpx; height: 30rpx; - opacity: .2; + opacity: 0.2; } -.kb-lesson-time{ + +.kb-lesson-time { font-size: 10pt; flex: 1; width: 250rpx; text-align: left; padding-left: 10rpx; } -.kb-info-card-close{ + +.kb-info-card-close { width: 30rpx; height: 30rpx; - font-size: 22px; padding: 25rpx 35rpx; } -.kb-info-card-tabs{ + +.kb-info-card-tabs { display: flex; flex-wrap: nowrap; width: 100%; @@ -461,30 +561,34 @@ background: #9c26b0; padding-left: 20rpx; overflow: hidden; opacity: 0; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); - transform: translate3d(0,400rpx,0); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); + transform: translate3d(0, 400rpx, 0); } -.kb-info-ctn-open .kb-info-card-tabs{ + +.kb-info-ctn-open .kb-info-card-tabs { opacity: 1; - transform: translate3d(0,0,0); + transform: translate3d(0, 0, 0); } -.kb-info-card-swipers{ + +.kb-info-card-swipers { position: relative; height: 0; overflow: hidden; opacity: 0; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); } -.kb-info-ctn-open .kb-info-card-swipers{ + +.kb-info-ctn-open .kb-info-card-swipers { height: 400rpx; opacity: 1; } -.kb-info-card-swipers swiper{ + +.kb-info-card-swipers swiper { width: 100%; height: 400rpx; } -.kb-info-swiper-mask-left, -.kb-info-swiper-mask-right{ + +.kb-info-swiper-mask-left, .kb-info-swiper-mask-right { position: absolute; z-index: 1; top: 50%; @@ -492,44 +596,52 @@ background: #9c26b0; height: 30rpx; margin-top: -35rpx; padding: 10rpx; - opacity: .2; + opacity: 0.2; } -.kb-info-swiper-mask-left{ + +.kb-info-swiper-mask-left { left: -5rpx; } -.kb-info-swiper-mask-right{ + +.kb-info-swiper-mask-right { right: -5rpx; } -.kb-info-swiper-mask-left image, -.kb-info-swiper-mask-right image{ + +.kb-info-swiper-mask-left image, .kb-info-swiper-mask-right image { width: 100%; height: 100%; } -.kb-info-card{ + +.kb-info-card { position: relative; display: flex; align-items: center; justify-content: center; background: #73b4ef; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); box-sizing: border-box; transform: translateZ(0); } -.kb-info-card-static{ + +.kb-info-card-static { flex-shrink: 0; max-width: 100rpx; } -.kb-info-card-static .kb-info-card-content{ - opacity: .88; + +.kb-info-card-static .kb-info-card-content { + opacity: 0.88; } -.kb-info-card-active{ + +.kb-info-card-active { max-width: 750rpx; flex: 1; } -.kb-info-card-shadow{ - box-shadow: -10px 0 20px -10px rgba(100, 100, 100, .5); + +.kb-info-card-shadow { + box-shadow: -10px 0 20px -10px rgba(100, 100, 100, 0.5); } -.kb-info-card-content{ + +.kb-info-card-content { width: 100%; height: 400rpx; display: flex; @@ -538,33 +650,49 @@ background: #9c26b0; color: #fff; box-sizing: border-box; padding: 0 10rpx; - transition: all .2s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); } -.kb-info-card-swipers .kb-info-card-content{ + +.kb-info-card-swipers .kb-info-card-content { padding: 0 40rpx 20rpx; } -.info-name{ + +.info-name { display: flex; align-items: center; - height: 80rpx; + height: 100rpx; width: 580rpx; - padding: 0 0 0 20rpx; + padding: 0 0 20rpx 20rpx; } -.info-name text{ + +.info-name text { font-size: 16pt; line-height: 120%; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } -.info-bd{ + +.info-bd { flex: 1; width: 100%; display: flex; align-items: center; padding-bottom: 40rpx; } -.info-type{ + +.version-text { + font-size: 10pt; + line-height: 100%; + color: #fff; + border: 1px solid #fff; + padding: 5rpx 10rpx; + border-radius: 5rpx; + margin-left: 10rpx; + text-align: center; +} + +.info-type { flex-shrink: 0; display: flex; flex-direction: column; @@ -572,7 +700,8 @@ background: #9c26b0; justify-content: center; margin: 20rpx; } -.info-type text{ + +.info-type text { display: inline-block; width: 10pt; height: 64rpx; @@ -585,6 +714,7 @@ background: #9c26b0; border-radius: 8rpx; background: #e78ab0; } + .info-list { position: relative; flex: 1; @@ -594,10 +724,12 @@ background: #9c26b0; justify-content: center; padding-left: 15rpx; } -.kb-info-card-active .info-list{ + +.kb-info-card-active .info-list { min-width: none; } -.info-item{ + +.info-item { position: relative; z-index: 2; display: flex; @@ -607,17 +739,20 @@ background: #9c26b0; font-size: 10pt; padding: 6rpx 0; } -.info-item-value{ + +.info-item-value { flex-shrink: 0; font-size: 12pt; } -.info-item-icon{ + +.info-item-icon { flex-shrink: 0; width: 35rpx; height: 35rpx; margin-right: 10rpx; } -.info-text{ + +.info-text { position: absolute; z-index: 1; top: 50%; @@ -626,76 +761,42 @@ background: #9c26b0; font-size: 100pt; line-height: 100%; font-weight: bold; - opacity: .15; + opacity: 0.15; } + /*重定义swiper-dots样式*/ -page .wx-swiper-dots.wx-swiper-dots-horizontal{ + +page .wx-swiper-dots.wx-swiper-dots-horizontal { margin-bottom: -5rpx; } -page .wx-swiper-dot{ - color: rgba(255,255,255,.5); -} -page .wx-swiper-dot-active{ - color: #fff; -} -/* 课表时间列*/ -.kb-cards-columnTime { - position: relative; - flex: 1; - display: flex; - flex-direction: column; - align-items: stretch; - width: 180rpx; - height: 100%; - background: #eee; - margin-left: 10rpx; +page .wx-swiper-dot { + color: rgba(255, 255, 255, 0.5); } -.kb-card-contentTime { - position: absolute; - z-index: 11; - /* background: #eee; */ - width: 180rpx; - min-height: 200rpx; - padding: 0 10rpx; - text-align: center; - box-sizing: border-box; - border-radius: 5rpx; - display: flex; - flex-flow: column nowrap; - overflow: hidden; - color: #000; - box-shadow: 0 0 6rpx 2rpx rgba(255, 255, 255, 0.45); -} -.kb-card-place-wordsTime { - font-size: 10pt; - padding: 15rpx 0; - line-height: 80%; +page .wx-swiper-dot-active { + color: #fff; } -.kb-card-place-wordsTime2 { - font-size: 10pt; - padding: 15rpx 0; - line-height: 25%; -} +/* 悬浮按钮的 */ -.kb-title-itemTime { - flex: 1; +.round-click { + height: 120rpx; + width: 120rpx; + background-color: rgb(115, 180, 240); + border-radius: 100%; + position: fixed; + bottom: 120rpx; + right: 25rpx; display: flex; - flex-direction: column; - align-items: stretch; + align-items: center; justify-content: center; - text-align: center; - width: 180rpx; - margin-left: 10rpx; - font-size: 9pt; - line-height: 120%; + z-index: 9; } -.kb-card-time{ - position: relative; - z-index: 10; - width: 180rpx; - min-height: 200rpx; -} \ No newline at end of file +.round-click text { + font-size: 32rpx; + max-width: 80rpx; + color: #fff; + text-align: center; +} diff --git a/pages/classQuery/jskb.js b/pages/classQuery/jskb.js new file mode 100644 index 0000000..095c1ae --- /dev/null +++ b/pages/classQuery/jskb.js @@ -0,0 +1,179 @@ +// pages/classQuery/jskb.js +//获取应用实例 +var app = getApp(); + +Page({ + data: { + header: { + defaultValue: '', + inputValue: '', + help_status: false, + help_class_status: false + }, + main: { + mainDisplay: true, // main 显示的变化标识 + list: [] + }, + pageType: 'teacher' + }, + + bindClearSearchTap: function(e) { + this.setData({ + 'main.mainDisplay': true, + 'main.total': 0, + 'header.inputValue': '' + }); + }, + + bindSearchInput: function(e) { + if (this.data.main.mainDisplay != false) { + this.setData({ + 'main.mainDisplay': !this.data.main.mainDisplay + }); + } + this.setData({ + 'header.inputValue': e.detail.value + }); + this.search(); + return e.detail.value; + }, + + bindSearchInputClass: function(e) { + if (this.data.main.mainDisplay != false) { + this.setData({ + 'main.mainDisplay': !this.data.main.mainDisplay + }); + } + this.setData({ + 'header.inputValue': e.detail.value + }); + this.searchClass(); + return e.detail.value; + }, + + // 点击搜索教师 + bindConfirmSearchTap: function() { + this.search(); + }, + // 点击搜索班级 + bindConfirmSearchTapClass: function() { + this.searchClass(); + }, + // 搜索教师 + search: function(key) { + if (this.data.header.inputValue.length < 1) { + wx.showToast({ + title: '请输入教师名', + image: '/images/info.png' + }) + return; + } + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + wx.request({ + url: app.globalData.apiURL + '/v4/teacherTable/teacherTableList.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + keyword: that.data.header.inputValue + }, + success: function(res) { + if (res.data.code == '500') { + wx.showToast({ + title: '教务异常不可查', + image: '/images/info.png' + }) + } + that.setData({ + 'main.list': res.data + }) + } + }) + + }, + // 搜索班级 + searchClass: function(key) { + if (this.data.header.inputValue.length < 1) { + wx.showToast({ + title: '请输入班级名', + image: '/images/info.png' + }) + return; + } + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + wx.request({ + url: app.globalData.apiURL + '/v4/classTable/classCourseTableList.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + keyword: that.data.header.inputValue + }, + success: function(res) { + if (res.data.code == '500') { + wx.showToast({ + title: '教务异常不可查', + image: '/images/info.png' + }) + } + that.setData({ + 'main.list': res.data + }) + } + }) + + }, + + + onLoad: function(options) { + var that = this; + if (options.type == 'class') { + wx.setNavigationBarTitle({ + title: '班级课表查询' + }) + that.setData({ + pageType: 'class' + }) + } else { + that.setData({ + pageType: 'teacher' + }) + } + }, + + tapHelp: function(e) { + if (e.target.id == 'help') { + this.hideHelp(); + } + }, + showHelp: function(e) { + console.log(e) + var that = this; + that.setData({ + 'header.help_status': true + }); + }, + showHelpClass: function(e) { + console.log(e) + var that = this; + that.setData({ + 'header.help_class_status': true + }); + }, + hideHelp: function(e) { + this.setData({ + 'header.help_status': false, + 'header.help_class_status': false, + }); + } +}); \ No newline at end of file diff --git a/pages/classQuery/jskb.json b/pages/classQuery/jskb.json new file mode 100644 index 0000000..782a34b --- /dev/null +++ b/pages/classQuery/jskb.json @@ -0,0 +1,6 @@ +{ + "navigationBarBackgroundColor": "#9f8bea", + "navigationBarTitleText": "教师课表", + "backgroundColor": "#9f8bea", + "enablePullDownRefresh": false +} \ No newline at end of file diff --git a/pages/course/search.wxml b/pages/classQuery/jskb.wxml similarity index 82% rename from pages/course/search.wxml rename to pages/classQuery/jskb.wxml index 2b5d8f8..2fdd983 100644 --- a/pages/course/search.wxml +++ b/pages/classQuery/jskb.wxml @@ -1,10 +1,10 @@ - + + - {{pageType=='class'?'班级':'教师'}}课表查询 + - +
- + @@ -34,11 +34,10 @@ - + - + @@ -66,8 +65,7 @@ 1、输入班级的名称查询班级课表 - 您可以通过输入班级名称的完整关键词进行精确搜索,也可以输入班级名称的一部分进行模糊搜索。例如搜索 “计” - ,将会搜索到所有“计算机”和“会计”专业班级的课表。完整的精确搜索宁可少字漏字,也不要错字。 + 您可以通过输入班级名称的完整关键词进行精确搜索,也可以输入班级名称的一部分进行模糊搜索。例如搜索 “计” ,将会搜索到所有“计算机”和“会计”专业班级的课表。完整的精确搜索宁可少字漏字,也不要错字。 @@ -76,12 +74,14 @@ - 教师名单 + + 教师名单 + - + @@ -108,7 +108,7 @@ - + @@ -125,4 +125,5 @@ + \ No newline at end of file diff --git a/pages/course/search.wxss b/pages/classQuery/jskb.wxss similarity index 79% rename from pages/course/search.wxss rename to pages/classQuery/jskb.wxss index 7448bab..f691c05 100644 --- a/pages/course/search.wxss +++ b/pages/classQuery/jskb.wxss @@ -1,4 +1,5 @@ -/* pages/course/search.wxss */ +/* pages/classQuery/jskb.wxss */ + .container { background: #f7f7f7; } @@ -14,7 +15,7 @@ height: 100px; opacity: 0.9; margin: 100rpx 0 30rpx; - background-image: url('https://upload-images.jianshu.io/upload_images/4697920-84d9dc09f1d008ad.png'); + background-image: url('https://z4a.net/images/2019/10/04/-148cb43dcd1154a73.png'); } .home .search-input { @@ -119,6 +120,10 @@ button::after { opacity: 0.8; } +/* ========================================================================== + header + ============================================================================ */ + .header { width: 100%; display: flex; @@ -138,6 +143,9 @@ button::after { display: none; } +/* search-input + ============================================================================ */ + .active .search-input { position: absolute; z-index: 100; @@ -220,6 +228,9 @@ button::after { opacity: 0.8; } +/* search-state + ============================================================================ */ + .search-state { flex: 1; display: flex; @@ -238,6 +249,10 @@ button::after { text-align: center; } +/* ========================================================================== + search-message + ============================================================================ */ + .search-message { display: flex; align-items: center; @@ -249,6 +264,10 @@ button::after { color: #aaa; } +/* ========================================================================== + main + ============================================================================ */ + .main { display: flex; width: 100%; @@ -257,6 +276,9 @@ button::after { margin-top: 85rpx; } +/* main-title + ============================================================================ */ + .main-title { flex: 1; margin: 35rpx 0 20rpx 25rpx; @@ -266,6 +288,9 @@ button::after { color: #999; } +/* main-list + ============================================================================ */ + .main-list { display: flex; flex: 1; @@ -283,6 +308,9 @@ button::after { font-size: 11pt; } +/* main-list > item + ============================================================================ */ + .item { display: flex; padding: 20rpx; @@ -326,6 +354,9 @@ button::after { color: #999; } +/* main-list > item > list-sign + ============================================================================ */ + .list-sign { display: flex; justify-content: center; @@ -344,6 +375,9 @@ button::after { transform: rotate(180deg); } +/* main-list > item > item-ul + ============================================================================ */ + .item-ul { display: flex; flex: 1; @@ -374,13 +408,15 @@ button::after { } .ul-li-kb { - background: url('https://upload-images.jianshu.io/upload_images/4697920-d983b3e897acc619.png') no-repeat; + /*background: url('/images/core/kb.png') no-repeat;*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background: url('https://we.cqu.pt/app/images/core/kb.png') no-repeat; background-size: 30rpx 30rpx; background-position: 0 50%; } .ul-li-ks { - background: url('https://upload-images.jianshu.io/upload_images/4697920-289fecabc0b70761.png') no-repeat; + /*background: url('/images/core/ks.png') no-repeat;*//*微信暂不支持静态bgimg文件,改用服务器url*/ + background: url('https://we.cqu.pt/app/images/core/ks.png') no-repeat; background-size: 30rpx 30rpx; background-position: 0 50%; } @@ -450,8 +486,8 @@ button::after { .box-close { position: absolute; right: 20rpx; - width: 55rpx; - height: 55rpx; + width: 35rpx; + height: 35rpx; padding: 15rpx; } @@ -478,4 +514,4 @@ button::after { .help-a text { word-break: break-all; -} \ No newline at end of file +} diff --git a/pages/classQuery/showJskb.js b/pages/classQuery/showJskb.js new file mode 100644 index 0000000..e24e85f --- /dev/null +++ b/pages/classQuery/showJskb.js @@ -0,0 +1,204 @@ +// pages/classQuery/showJskb.js +//获取应用实例 +var app = getApp(); +Page({ + data: { + uid: '', + pwd: '', + nickName: '', + remind: '加载中', + isLoading: true, + _days: ['一', '二', '三', '四', '五', '六', '日'], + activeClass: '', + activeClassItem: 0, + whichDayOfWeek: '', + pageType:'teacher', + scroll: { + left: 0 //判断今天是不周末,是的话滚一下 + }, + timeRow: [{ + l1: '第一小节', + l2: '第二小节', + t1: '8:00-8:45', + t2: '8:50-9:35' + }, + { + l1: '第三小节', + l2: '第四小节', + t1: '9:55-10:40', + t2: '10:45-11:30' + }, + { + l1: '第五小节', + l2: '第六小节', + t1: '13:10-13:55', + t2: '14:00-14:45' + }, + { + l1: '第七小节', + l2: '第八小节', + t1: '15:00-15:45', + t2: '15:50-16:35' + }, + { + l1: '第九小节', + l2: '第十小节', + t1: '16:50-17:35', + t2: '17:40-18:25' + }, + ], + classJson: '', + targetLessons: [], + targetX: 0, //target x轴top距离 + targetY: 0, //target y轴left距离 + targetDay: 0, //target day + targetWid: 0, //target wid + targetI: 0, //target 第几个active + targetLen: 0, //target 课程长度 + blur: false, + is_vacation: false, // 是否为假期 + }, + onLoad: function(options) { + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + var keyword = options.name; + var pageType = options.type; + console.log(options) + that.setData({ + uid: uid, + pwd: pwd, + pageType: pageType + }) + if (pageType == 'teacher') { + that.getTable(uid, pwd, keyword); + } + if (pageType == 'class') { + that.getClassTable(uid, pwd, keyword); + } + }, + bindGetUserInfo(e) { + console.log(e.detail.userInfo) + }, + getTable: function(uid, pwd, keyword) { + var that = this; + var classJsonArr = []; + wx.request({ + url: app.globalData.apiURL + '/v4/teacherTable/teacherTable.php', + // url: 'http://localhost/teacherTable.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + keyword: keyword + }, + success: function(res) { + console.log(res.data) + wx.setNavigationBarTitle({ + title: res.data[0].teacherName + '老师的课表' + }) + that.setData({ + classJson: res.data[0], + isLoading: false, + classJsonArr: classJsonArr + }) + } + }) + }, + getClassTable: function(uid, pwd, keyword) { + var that = this; + var classJsonArr = []; + wx.request({ + url: app.globalData.apiURL + '/v4/classTable/classCourseTable.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + keyword: keyword + }, + success: function(res) { + console.log(res.data) + wx.setNavigationBarTitle({ + title: res.data[0].className + '班的课表' + }) + that.setData({ + classJson: res.data[0], + isLoading: false, + classJsonArr: classJsonArr + }) + } + }) + }, + changeActiveItem: function(e) { + var that = this; + // console.log(e); + that.setData({ + activeClassItem: e.currentTarget.dataset.num, + }) + }, + onShow: function() { + var _this = this; + + }, + onReady: function() { + var that = this; + }, + showDetail: function(e) { + console.log(e) + // 点击课程卡片后执行 + var that = this; + that.setData({ + targetX: e.detail.x, + targetY: e.detail.y, + targetDay: 1, + targetWid: 2, + targetI: 1, + blur: true, + activeClass: e.currentTarget.dataset + }); + }, + goClassPlace: function(ep) { + console.log(ep.target.dataset.place); + var placeArr = ["1教", "2教", "3教", "4教", "5教", "6教", "7教", "8教", "9教", "10教", "11教", "12教", "理工馆", "社科馆"]; + var markerIdArr = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 5, 4]; + var result = placeArr.indexOf(ep.target.dataset.place.slice(0, -3)); + // console.log(result); + wx.navigateTo({ + url: '/pages/schoolNav/schoolNav?markerId=' + markerIdArr[result], + }) + }, + hideDetail: function() { + var that = this; + // 点击遮罩层时触发,取消主体部分的模糊,清空target + that.setData({ + blur: false, + targetLessons: [], + targetX: 0, + targetY: 0, + targetDay: 0, + targetWid: 0, + targetI: 0, + targetLen: 0, + activeClassItem: 0, + }); + }, + catchMoveDetail: function() { /*阻止滑动穿透*/ }, + /** + * 用户点击右上角分享 + */ + // onShareAppMessage: function(res) { + // var that = this; + // // console.log(res); + // return { + // title: that.data.nickName + '老师的教师课表', + // path: 'pages/classQuery/index?isShareFrom=true&uid=' + that.data.uid + '&pwd=' + that.data.pwd, + // } + // }, + +}); \ No newline at end of file diff --git a/pages/classQuery/showJskb.json b/pages/classQuery/showJskb.json new file mode 100644 index 0000000..acf110e --- /dev/null +++ b/pages/classQuery/showJskb.json @@ -0,0 +1,6 @@ +{ + "navigationBarBackgroundColor": "#73b4ef", + "navigationBarTitleText": "教师课表 - 贝壳小盒子", + "backgroundColor": "#73b4ef", + "enablePullDownRefresh": false +} \ No newline at end of file diff --git a/pages/classQuery/showJskb.wxml b/pages/classQuery/showJskb.wxml new file mode 100644 index 0000000..b475c98 --- /dev/null +++ b/pages/classQuery/showJskb.wxml @@ -0,0 +1,202 @@ + + + + + + + + + + + + {{dates[week-1][0].month}} + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 周{{item}} + + + 时间 + + + + + + + + + + + + + + + + + + + + {{value.length}}项课程同师异周 + + 点击展开查看 + + + + + + + {{value.teachPlace}} + + {{value.courseName}} + + + + + + + + + + + + {{item.l1}} + {{item.t1}} + {{item.l2}} + {{item.t2}} + + + + + + 第十一节课 + 19:10-19:55 + 第十二节课 + 20:00-20:45 + 第十三节课 + 20:50-21:35 + + + + + + + + + + + {{activeClass.place}} + + {{activeClass.coursename}} + + + + + + + + + + + + {{classJson.teacherName}}老师的课表 + + + {{classJson.className}}班的课表 + + + + 课程{{key+1}} + + + + + + + {{classJson.teacherName}}老师的课表 + + + {{classJson.className}}班的课表 + + + + + + + + + + {{activeClass.json[activeClassItem].courseName}} + + + + 课程 + + + {{activeClass.whichjie}} + + 教师: {{classJson.teacherName}} + + + 教师: {{activeClass.json[activeClassItem].teacher}} + + + 地点: {{activeClass.json[activeClassItem].place}}(📍前往) + + + 上课周: {{activeClass.json[activeClassItem].teachWeek}} + + + + + + + + + + {{activeClass.coursename}} + + + + 课程 + + + {{activeClass.whichjie}} + + 教师: {{classJson.teacherName}} + + + 教师: {{activeClass.teacher}} + + + 地点: {{activeClass.place}}(📍前往) + + + 上课周: {{activeClass.teachweek}} + + + + + + + + + \ No newline at end of file diff --git a/pages/classQuery/showJskb.wxss b/pages/classQuery/showJskb.wxss new file mode 100644 index 0000000..f99eb1a --- /dev/null +++ b/pages/classQuery/showJskb.wxss @@ -0,0 +1,803 @@ +/* pages/classQuery/showJskb.wxss */ +.container { + background-color: #fff; + padding-bottom: 0; + overflow: hidden; +} + +.navText { + color: #0069d9; +} + +.bdwz { + background-color: #7399ff; + color: #fff; +} + +/**.main-box**/ + +.main-box { + position: relative; + width: 100%; + height: 1328rpx; + display: flex; + flex-direction: row; + padding-bottom: 100rpx; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); +} + +.main-box-active { + padding-bottom: 500rpx; +} + +.blur-area { + overflow: hidden; +} + +.blur { + filter: blur(3px); +} + +/**.kb-num-ctn**/ + +.kb-num-ctn { + position: absolute; + top: 0; + left: 0; + z-index: 100; + font-size: 9pt; + flex-shrink: 0; + width: 35rpx; + display: flex; + flex-direction: column; + align-items: stretch; + background: #fff; + border-right: 1rpx solid #eee; + margin-bottom: 12rpx; + color: #777; + padding-bottom: 100rpx; +} + +.kb-num-ctn-inner { + z-index: 1; +} + +.kb-num-ctn-hide { + transform: translate3d(-35rpx, 0, 0); +} + +.kb-num-ctn view { + height: 100rpx; + line-height: 100rpx; + text-align: center; +} + +.kb-num-ctn .kb-timeline-tri { + position: absolute; + left: 0; + top: 50%; + margin-top: 58rpx; + width: 0; + height: 0; + line-height: 0; + border: 10rpx solid transparent; + border-left-color: #0069d9; + opacity: 0.6; +} + +.kb-num-ctn .kb-mon { + height: 60rpx; + font-size: 9pt; + line-height: 30rpx; + display: flex; + flex-direction: column; + align-content: center; + justify-content: center; + border-bottom: 1rpx solid #eee; +} + +.mg-t { + padding-top: 8rpx; +} + +.mg-8 { + margin-bottom: 8rpx; +} + +.mg-12 { + margin-bottom: 12rpx; +} + +/**.kb-ctn**/ + +.kb-ctn { + flex: 1; + width: 100%; + height: 1416rpx; + display: flex; + flex-direction: column; + align-items: stretch; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); +} + +.kb-title { + position: absolute; + top: 0; + left: 0; + display: flex; + width: 1055rpx; + height: 60rpx; + padding-left: 10rpx; + border-bottom: 1rpx solid #eee; + margin-left: 35rpx; + color: #777; +} + +.kb-date { + color: #909090; +} + +.kb-title-item { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; + text-align: center; + width: 120rpx; + margin-right: 10rpx; + font-size: 9pt; + line-height: 120%; +} +.kb-title-itemTime { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; + text-align: center; + width: 180rpx; + margin-left: 10rpx; + font-size: 9pt; + line-height: 120%; +} + +.kb-cards-ctn { + position: absolute; + top: 0; + left: 0; + flex: 1; + width: 1100rpx; + height: 1248rpx; + display: flex; + align-items: stretch; + padding: 8rpx 0 12rpx 10rpx; + margin-left: 35rpx; + margin-top: 60rpx; + padding-bottom: 100rpx; + transition: margin-bottom 0.15s cubic-bezier(0.19, 1, 0.22, 1); +} + +.kb-cards-column { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + width: 120rpx; + height: 100%; + background: transparent; + margin-right: 10rpx; +} + +.kb-cards-columnTime { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + width: 180rpx; + height: 100%; + background: #eee; + margin-left: 10rpx; +} + +.kb-bg { + position: absolute; + width: 120rpx; + top: -8rpx; + bottom: -12rpx; + background: -webkit-gradient(linear, left top, left bottom, from(#eff7ff), color-stop(0.5, #8cc4ff), to(#eff7ff)); + z-index: 1; + opacity: 0.6; + transition: all 0.1s; +} + +.kb-timeline { + display: none; + position: absolute; + left: 0; + right: 0; + top: 50%; + margin-top: -2rpx; + width: 120rpx; + height: 5rpx; + background: #0069d9; + z-index: 99; + opacity: 0.6; +} + +.kb-timeline::before, .kb-timeline::after { + content: ''; + position: absolute; + width: 5rpx; + height: 10rpx; + border-radius: 1rpx; + background: #0069d9; +} + +.kb-timeline::before { + left: -3rpx; + top: -2rpx; +} + +.kb-timeline::after { + right: -3rpx; + top: -2rpx; +} + +.kb-card { + position: relative; + z-index: 10; + width: 120rpx; + min-height: 200rpx; + border-radius: 5rpx; +} + +.kb-cardTime { + position: relative; + z-index: 10; + width: 180rpx; + min-height: 200rpx; + border-radius: 5rpx; +} + +.kb-card-content { + position: absolute; + z-index: 11; + background: #eee; + width: 120rpx; + min-height: 200rpx; + padding: 0 10rpx; + text-align: center; + box-sizing: border-box; + border-radius: 5rpx; + display: flex; + flex-flow: column nowrap; + overflow: hidden; + color: #fff; + box-shadow: 0 0 6rpx 2rpx rgba(255, 255, 255, 0.45); +} + +.kb-card-contentTime { + position: absolute; + z-index: 11; + /* background: #eee; */ + width: 180rpx; + min-height: 200rpx; + padding: 0 10rpx; + text-align: center; + box-sizing: border-box; + border-radius: 5rpx; + display: flex; + flex-flow: column nowrap; + overflow: hidden; + color: #000; + box-shadow: 0 0 6rpx 2rpx rgba(255, 255, 255, 0.45); +} + +.kb-card-place-num { + font-size: 13pt; + padding: 15rpx 0; +} + +.kb-card-place-words { + font-size: 10pt; + padding: 15rpx 0; + line-height: 120%; +} + +.kb-card-place-wordsTime { + font-size: 10pt; + padding: 15rpx 0; + line-height: 80%; +} + +.kb-card-place-wordsTime2 { + font-size: 10pt; + padding: 15rpx 0; + line-height: 25%; +} + +.kb-card-name { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +.kb-card-name-text { + font-size: 10pt; + padding-bottom: 5rpx; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + line-height: 130%; +} + +.k-sec::before { + content: ''; + position: absolute; + top: 6rpx; + right: 8rpx; + display: inline-block; + width: 12rpx; + height: 6rpx; + border-radius: 2rpx; + background: #fff; +} + +.green { + background: #7acfa6; +} + +.blue { + background: #73b4ef; +} + +.purple { + background: #9f8bea; +} + +.red { + background: #e286ab; +} + +.yellow { + background: #ffcb63; +} + +/* 遮罩层样式 */ + +.kb-detail { + position: absolute; + z-index: 998; + top: 0; + left: 0; + right: 0; + width: 910rpx; + height: 1248rpx; + padding: 68rpx 0 100rpx 45rpx; + background: rgba(166, 166, 166, 0.45); + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); +} + +.kb-detail-card-content { + position: absolute; + box-shadow: 0 0 50rpx #bbb; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); +} + +.kb-detail-card-content-active { + transform: scale(1.08, 1.08); +} + +.kb-detaile-card-ctn { + position: absolute; + z-index: 999; + width: 120rpx; +} + +/* 底部详情样式 */ + +.kb-info-ctn { + position: fixed; + z-index: 1000; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 500rpx; + display: flex; + flex-direction: column; + align-items: stretch; + border-top-left-radius: 15rpx; + border-top-right-radius: 15rpx; + background: #73b4ef; + font-size: 11pt; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); + transform: translate3d(0, 400rpx, 0); +} + +.kb-info-ctn-open { + transform: translate3d(0, 0, 0); +} + +.kb-info-title { + color: #fff; + height: 100rpx; + width: 100%; + display: flex; + align-items: center; +} + +.kb-term { + flex: 1; + text-align: center; +} + +.kb-choose-view-box { + display: flex; + margin: 0 20rpx 0 62rpx; + padding: 25rpx; +} + +.kb-choose-view { + position: relative; + display: flex; + flex-direction: column; + align-content: center; + justify-content: center; + width: 38rpx; + height: 38rpx; +} + +.kb-choose-view text { + font-size: 24rpx; + width: 28rpx; + height: 28rpx; + line-height: 28rpx; + text-align: center; + border: 1rpx solid #fff; + border-radius: 5rpx; + background: #73b4ef; + position: absolute; + z-index: 1; + bottom: 0; + right: 0; +} + +.kb-choose-view text.active { + z-index: 2; + top: 0; + left: 0; + bottom: auto; + right: auto; + color: #73b4ef; + background: #fff; +} + +.kb-info-week { + width: 150rpx; + padding: 20rpx 10rpx; + text-align: center; +} + +.kb-swipers { + flex: 1; + position: relative; + font-size: 11pt; + height: 100%; + margin: 0 50rpx; +} + +.kb-week-swiper { + width: 100%; + height: 100%; +} + +.kb-week-swiper-item { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + text-align: center; +} + +.kb-week-swiper-item text.active { + font-weight: bold; +} + +.kb-swiper-mask-left, .kb-swiper-mask-right { + position: absolute; + z-index: 999; + top: 0; + width: 50rpx; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.kb-swiper-mask-left { + left: 0; + background: -webkit-gradient(linear, left top, right top, from(#73b4ef), to(rgba(86, 165, 238, 0))); +} + +.kb-swiper-mask-right { + right: 0; + background: -webkit-gradient(linear, left top, right top, from(rgba(86, 165, 238, 0)), to(#73b4ef)); +} + +.kb-swiper-mask-left image, .kb-swiper-mask-right image { + width: 30rpx; + height: 30rpx; + opacity: 0.2; +} + +.kb-lesson-time { + font-size: 10pt; + flex: 1; + width: 250rpx; + text-align: left; + padding-left: 10rpx; +} + +.kb-info-card-close { + width: 30rpx; + height: 30rpx; + padding: 25rpx 35rpx; +} + +.kb-info-card-tabs { + display: flex; + flex-wrap: nowrap; + width: 100%; + height: 400rpx; + background: #73b4ef; + box-sizing: border-box; + padding-left: 20rpx; + overflow: hidden; + opacity: 0; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); + transform: translate3d(0, 400rpx, 0); +} + +.kb-info-ctn-open .kb-info-card-tabs { + opacity: 1; + transform: translate3d(0, 0, 0); +} + +.kb-info-card-swipers { + position: relative; + height: 0; + overflow: hidden; + opacity: 0; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); +} + +.kb-info-ctn-open .kb-info-card-swipers { + height: 400rpx; + opacity: 1; +} + +.kb-info-card-swipers swiper { + width: 100%; + height: 400rpx; +} + +.kb-info-swiper-mask-left, .kb-info-swiper-mask-right { + position: absolute; + z-index: 1; + top: 50%; + width: 30rpx; + height: 30rpx; + margin-top: -35rpx; + padding: 10rpx; + opacity: 0.2; +} + +.kb-info-swiper-mask-left { + left: -5rpx; +} + +.kb-info-swiper-mask-right { + right: -5rpx; +} + +.kb-info-swiper-mask-left image, .kb-info-swiper-mask-right image { + width: 100%; + height: 100%; +} + +.kb-info-card { + position: relative; + display: flex; + align-items: center; + justify-content: center; + background: #73b4ef; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); + box-sizing: border-box; + transform: translateZ(0); +} + +.kb-info-card-static { + flex-shrink: 0; + max-width: 100rpx; +} + +.kb-info-card-static .kb-info-card-content { + opacity: 0.88; +} + +.kb-info-card-active { + max-width: 750rpx; + flex: 1; +} + +.kb-info-card-shadow { + box-shadow: -10px 0 20px -10px rgba(100, 100, 100, 0.5); +} + +.kb-info-card-content { + width: 100%; + height: 400rpx; + display: flex; + flex-flow: column nowrap; + align-items: stretch; + color: #fff; + box-sizing: border-box; + padding: 0 10rpx; + transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1); +} + +.kb-info-card-swipers .kb-info-card-content { + padding: 0 40rpx 20rpx; +} + +.info-name { + display: flex; + align-items: center; + height: 100rpx; + width: 580rpx; + padding: 0 0 20rpx 20rpx; +} + +.info-name text { + font-size: 16pt; + line-height: 120%; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.info-bd { + flex: 1; + width: 100%; + display: flex; + align-items: center; + padding-bottom: 40rpx; +} + +.version-text { + font-size: 10pt; + line-height: 100%; + color: #fff; + border: 1px solid #fff; + padding: 5rpx 10rpx; + border-radius: 5rpx; + margin-left: 10rpx; + text-align: center; +} + +.info-type { + flex-shrink: 0; + display: flex; + flex-direction: column; + align-self: center; + justify-content: center; + margin: 20rpx; +} + +.info-type text { + display: inline-block; + width: 10pt; + height: 64rpx; + font-size: 10pt; + line-height: 32rpx; + text-align: center; + color: #fff; + padding: 8rpx; + margin: 6rpx 0; + border-radius: 8rpx; + background: #e78ab0; +} + +.info-list { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; + padding-left: 15rpx; +} + +.kb-info-card-active .info-list { + min-width: none; +} + +.info-item { + position: relative; + z-index: 2; + display: flex; + align-items: center; + flex-wrap: nowrap; + white-space: nowrap; + font-size: 10pt; + padding: 6rpx 0; +} + +.info-item-value { + flex-shrink: 0; + font-size: 12pt; +} + +.info-item-icon { + flex-shrink: 0; + width: 35rpx; + height: 35rpx; + margin-right: 10rpx; +} + +.info-text { + position: absolute; + z-index: 1; + top: 50%; + left: 35rpx; + margin-top: -50pt; + font-size: 100pt; + line-height: 100%; + font-weight: bold; + opacity: 0.15; +} + +/*重定义swiper-dots样式*/ + +page .wx-swiper-dots.wx-swiper-dots-horizontal { + margin-bottom: -5rpx; +} + +page .wx-swiper-dot { + color: rgba(255, 255, 255, 0.5); +} + +page .wx-swiper-dot-active { + color: #fff; +} + +/* 悬浮按钮的 */ + +.round-click { + height: 120rpx; + width: 120rpx; + background-color: rgb(115, 180, 240); + border-radius: 100%; + position: fixed; + bottom: 120rpx; + right: 25rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; +} + +.round-click text { + font-size: 32rpx; + max-width: 80rpx; + color: #fff; + text-align: center; +} diff --git a/pages/common/helpers/arrayTreeFilter.js b/pages/common/helpers/arrayTreeFilter.js new file mode 100644 index 0000000..557eef0 --- /dev/null +++ b/pages/common/helpers/arrayTreeFilter.js @@ -0,0 +1,23 @@ +/** + * https://github.com/afc163/array-tree-filter + */ +function arrayTreeFilter (data, filterFn, options) { + options = options || {} + options.childrenKeyName = options.childrenKeyName || 'children' + let children = data || [] + const result = [] + let level = 0 + do { + const foundItem = children.filter(function (item) { + return filterFn(item, level) + })[0] + if (!foundItem) { + break + } + result.push(foundItem) + children = foundItem[options.childrenKeyName] || [] + level += 1 + } while (children.length > 0) + return result +} +export default arrayTreeFilter diff --git a/pages/common/helpers/baseComponent.js b/pages/common/helpers/baseComponent.js new file mode 100644 index 0000000..66d7ab3 --- /dev/null +++ b/pages/common/helpers/baseComponent.js @@ -0,0 +1,56 @@ +import computedBehavior from './computedBehavior' +import relationsBehavior from './relationsBehavior' +import safeSetDataBehavior from './safeSetDataBehavior' +import funcBehavior from './funcBehavior' + +const baseComponent = (options = {}) => { + // add default externalClasses + options.externalClasses = [ + 'wux-class', + 'wux-hover-class', + ...(options.externalClasses = options.externalClasses || []), + ] + + // add default behaviors + options.behaviors = [ + relationsBehavior, + computedBehavior, + safeSetDataBehavior, + ...(options.behaviors = options.behaviors || []), + ] + + // use func + if (options.useFunc) { + options.behaviors = [...options.behaviors, funcBehavior] + delete options.useFunc + } + + // use field + if (options.useField) { + options.behaviors = [...options.behaviors, 'wx://form-field'] + delete options.useField + } + + // use export + if (options.useExport) { + options.behaviors = [...options.behaviors, 'wx://component-export'] + options.methods = { + export () { + return this + }, + ...options.methods, + } + delete options.useExport + } + + // add default options + options.options = { + multipleSlots: true, + addGlobalClass: true, + ...options.options, + } + + return Component(options) +} + +export default baseComponent diff --git a/pages/common/helpers/checkIPhoneX.js b/pages/common/helpers/checkIPhoneX.js new file mode 100644 index 0000000..1245521 --- /dev/null +++ b/pages/common/helpers/checkIPhoneX.js @@ -0,0 +1,30 @@ +/** + * 获取系统信息 + */ + +let systemInfo = null + +const getSystemInfo = (isForce) => { + if (!systemInfo || isForce) { + try { + systemInfo = wx.getSystemInfoSync() + } catch(e) { /* Ignore */ } + } + + return systemInfo +} + +// iPhoneX 竖屏安全区域 +export const safeAreaInset = { + top: 88, // StatusBar & NavBar + left: 0, + right: 0, + bottom: 34, // Home Indicator +} + +const IPHONEX_DEVICE_HEIGHT = 812 +const isIPhoneX = ({ model, platform, screenHeight }) => { + return /iPhone X/.test(model) && platform === 'ios' && screenHeight === IPHONEX_DEVICE_HEIGHT +} + +export const checkIPhoneX = (isForce) => isIPhoneX(getSystemInfo(isForce)) \ No newline at end of file diff --git a/pages/common/helpers/classNames.js b/pages/common/helpers/classNames.js new file mode 100644 index 0000000..51ed05b --- /dev/null +++ b/pages/common/helpers/classNames.js @@ -0,0 +1,52 @@ +/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/* global define */ + +(function() { + 'use strict'; + + var hasOwn = {}.hasOwnProperty; + + function classNames() { + var classes = []; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes.push(arg); + } else if (Array.isArray(arg) && arg.length) { + var inner = classNames.apply(null, arg); + if (inner) { + classes.push(inner); + } + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes.push(key); + } + } + } + } + + return classes.join(' '); + } + + if (typeof module !== 'undefined' && module.exports) { + classNames.default = classNames; + module.exports = classNames; + } else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + // register as 'classnames', consistent with npm package name + define('classnames', [], function() { + return classNames; + }); + } else { + window.classNames = classNames; + } +}()); \ No newline at end of file diff --git a/pages/common/helpers/colors.js b/pages/common/helpers/colors.js new file mode 100644 index 0000000..c0d5182 --- /dev/null +++ b/pages/common/helpers/colors.js @@ -0,0 +1,18 @@ +export const colors = { + 'light': '#ddd', + 'stable': '#b2b2b2', + 'positive': '#387ef5', + 'calm': '#11c1f3', + 'balanced': '#33cd5f', + 'energized': '#ffc900', + 'assertive': '#ef473a', + 'royal': '#886aea', + 'dark': '#444', +} + +export const isPresetColor = (color) => { + if (!color) { + return false + } + return colors[color] ? colors[color] : color +} diff --git a/pages/common/helpers/computed.js b/pages/common/helpers/computed.js new file mode 100644 index 0000000..333b109 --- /dev/null +++ b/pages/common/helpers/computed.js @@ -0,0 +1,141 @@ +/** + * weapp custom component extend behavior -- computed + * https://github.com/wechat-miniprogram/computed + */ + +import isEmpty from './isEmpty' +import shallowEqual from './shallowEqual' + +module.exports = Behavior({ + lifetimes: { + created() { + this._computedCache = {} + this._originalSetData = this.setData + this.setData = this._setData + this._doingSetData = false + } + }, + definitionFilter(defFields) { + const computed = defFields.computed || {} + const computedKeys = Object.keys(computed) + + // 计算 computed + const calcComputed = (scope) => { + const needUpdate = {} + const computedCache = scope._computedCache || scope.data + + for (let i = 0, len = computedKeys.length; i < len; i++) { + const key = computedKeys[i] + const getter = computed[key] + + if (typeof getter === 'function') { + const value = getter.call(scope) + + if (!shallowEqual(computedCache[key], value)) { + needUpdate[key] = value + computedCache[key] = value + } + } + } + + return needUpdate + } + + // 初始化 computed + const initComputed = () => { + defFields.data = defFields.data || {} + + // 先将 properties 里的字段写入到 data 中 + const data = defFields.data + const properties = defFields.properties + const hasOwnProperty = Object.prototype.hasOwnProperty + if (properties) { + // eslint-disable-next-line complexity + Object.keys(properties).forEach(key => { + const value = properties[key] + let oldObserver + + // eslint-disable-next-line max-len + if (value === null || value === Number || value === String || value === Boolean || value === Object || value === Array) { + properties[key] = { + type: value, + } + } else if (typeof value === 'object') { + if (hasOwnProperty.call(value, 'value')) { + // 处理值 + data[key] = value.value + } + + if (hasOwnProperty.call(value, 'observer') && typeof value.observer === 'function') { + oldObserver = value.observer + } + } + + // 追加 observer,用于监听变动 + properties[key].observer = function(...args) { + const originalSetData = this._originalSetData + + if (this._doingSetData) { + // eslint-disable-next-line no-console + console.warn('can\'t call setData in computed getter function!') + return + } + + this._doingSetData = true + + // 计算 computed + const needUpdate = calcComputed(this) + + // 做 computed 属性的 setData + if (!isEmpty(needUpdate)) { + originalSetData.call(this, needUpdate) + } + + this._doingSetData = false + + if (oldObserver) oldObserver.apply(this, args) + } + }) + } + + // 计算 computed + calcComputed(defFields, true) + } + + initComputed() + + defFields.methods = defFields.methods || {} + defFields.methods._setData = function(data, callback) { + const originalSetData = this._originalSetData + + if (this._doingSetData) { + // eslint-disable-next-line no-console + console.warn('can\'t call setData in computed getter function!') + return + } + + this._doingSetData = true + + // TODO 过滤掉 data 中的 computed 字段 + const dataKeys = Object.keys(data) + for (let i = 0, len = dataKeys.length; i < len; i++) { + const key = dataKeys[i] + + if (computed[key]) delete data[key] + } + + // 做 data 属性的 setData + originalSetData.call(this, data, callback) + + // 计算 computed + const needUpdate = calcComputed(this) + + // 做 computed 属性的 setData + if (!isEmpty(needUpdate)) { + originalSetData.call(this, needUpdate) + } + + this._doingSetData = false + } + } +}) \ No newline at end of file diff --git a/pages/common/helpers/computedBehavior.js b/pages/common/helpers/computedBehavior.js new file mode 100644 index 0000000..5348e08 --- /dev/null +++ b/pages/common/helpers/computedBehavior.js @@ -0,0 +1,145 @@ +/** + * weapp custom component extend behavior -- computed + * https://github.com/wechat-miniprogram/computed + */ + +import isEmpty from './isEmpty' +import shallowEqual from './shallowEqual' + +module.exports = Behavior({ + lifetimes: { + created () { + this._computedCache = {} + this._originalSetData = this.setData + this.setData = this._setData + this._doingSetData = false + }, + }, + definitionFilter (defFields) { + const computed = defFields.computed || {} + const computedKeys = Object.keys(computed) + + // 计算 computed + const calcComputed = (scope) => { + const needUpdate = {} + const computedCache = scope._computedCache || scope.data + + for (let i = 0, len = computedKeys.length; i < len; i++) { + const key = computedKeys[i] + const getter = computed[key] + + if (typeof getter === 'function') { + const value = getter.call(scope) + + if (!shallowEqual(computedCache[key], value)) { + needUpdate[key] = value + computedCache[key] = value + } + } + } + + return needUpdate + } + + // 初始化 computed + const initComputed = () => { + defFields.data = defFields.data || {} + + // 先将 properties 里的字段写入到 data 中 + const data = defFields.data + const properties = defFields.properties + const hasOwnProperty = Object.prototype.hasOwnProperty + if (properties) { + // eslint-disable-next-line complexity + Object.keys(properties).forEach((key) => { + const value = properties[key] + let oldObserver + + // eslint-disable-next-line max-len + if (value === null || value === Number || value === String || value === Boolean || value === Object || value === Array) { + properties[key] = { + type: value, + } + } else if (typeof value === 'object') { + if (hasOwnProperty.call(value, 'value')) { + // 处理值 + data[key] = value.value + } + + if (hasOwnProperty.call(value, 'observer')) { + if (typeof value.observer === 'function') { + oldObserver = value.observer + } else if (typeof value.observer === 'string') { + oldObserver = defFields.methods[value.observer] + } + } + } + + // 追加 observer,用于监听变动 + properties[key].observer = function (...args) { + const originalSetData = this._originalSetData + + if (this._doingSetData) { + // eslint-disable-next-line no-console + console.warn('can\'t call setData in computed getter function!') + return + } + + this._doingSetData = true + + // 计算 computed + const needUpdate = calcComputed(this) + + // 做 computed 属性的 setData + if (!isEmpty(needUpdate)) { + originalSetData.call(this, needUpdate) + } + + this._doingSetData = false + + if (oldObserver) oldObserver.apply(this, args) + } + }) + } + + // 计算 computed + calcComputed(defFields, true) + } + + initComputed() + + defFields.methods = defFields.methods || {} + defFields.methods._setData = function (data, callback) { + const originalSetData = this._originalSetData + + if (this._doingSetData) { + // eslint-disable-next-line no-console + console.warn('can\'t call setData in computed getter function!') + return + } + + this._doingSetData = true + + // TODO 过滤掉 data 中的 computed 字段 + const dataKeys = Object.keys(data) + for (let i = 0, len = dataKeys.length; i < len; i++) { + const key = dataKeys[i] + + if (computed[key]) delete data[key] + } + + // 做 data 属性的 setData + originalSetData.call(this, data, callback) + + // 计算 computed + const needUpdate = calcComputed(this) + + // 做 computed 属性的 setData + if (!isEmpty(needUpdate)) { + originalSetData.call(this, needUpdate) + } + + this._doingSetData = false + } + }, +}) diff --git a/pages/common/helpers/debounce.js b/pages/common/helpers/debounce.js new file mode 100644 index 0000000..2c7eec5 --- /dev/null +++ b/pages/common/helpers/debounce.js @@ -0,0 +1,43 @@ +export default function debounce(func, wait, immediate) { + let timeout + let args + let context + let timestamp + let result + + const later = function later() { + const last = +(new Date()) - timestamp + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last) + } else { + timeout = null + if (!immediate) { + result = func.apply(context, args) + if (!timeout) { + context = null + args = null + } + } + } + } + + return function debounced() { + context = this + args = arguments + timestamp = +(new Date()) + + const callNow = immediate && !timeout + if (!timeout) { + timeout = setTimeout(later, wait) + } + + if (callNow) { + result = func.apply(context, args) + context = null + args = null + } + + return result + } +} diff --git a/pages/common/helpers/funcBehavior.js b/pages/common/helpers/funcBehavior.js new file mode 100644 index 0000000..948075c --- /dev/null +++ b/pages/common/helpers/funcBehavior.js @@ -0,0 +1,97 @@ +/** + * 过滤对象的函数属性 + * @param {Object} opts + */ +const mergeOptionsToData = (opts = {}) => { + const options = Object.assign({}, opts) + + for (const key in options) { + if (options.hasOwnProperty(key) && typeof options[key] === 'function') { + delete options[key] + } + } + + return options +} + +/** + * Simple bind, faster than native + * + * @param {Function} fn + * @param {Object} ctx + * @return {Function} + */ +const bind = (fn, ctx) => { + return (...args) => { + return args.length ? fn.apply(ctx, args) : fn.call(ctx) + } +} + +/** + * Object assign + */ +const assign = (...args) => Object.assign({}, ...args) + +export default Behavior({ + definitionFilter(defFields) { + defFields.data = mergeOptionsToData(defFields.data) + defFields.data.in = false + defFields.data.visible = false + }, + methods: { + /** + * 过滤对象的函数属性 + * @param {Object} opts + */ + $$mergeOptionsToData: mergeOptionsToData, + /** + * 合并参数并绑定方法 + * + * @param {Object} opts 参数对象 + * @param {Object} fns 方法挂载的属性 + */ + $$mergeOptionsAndBindMethods (opts = {}, fns = this.fns) { + const options = Object.assign({}, opts) + + for (const key in options) { + if (options.hasOwnProperty(key) && typeof options[key] === 'function') { + fns[key] = bind(options[key], this) + delete options[key] + } + } + + return options + }, + /** + * Promise setData + * @param {Array} args 参数对象 + */ + $$setData (...args) { + const params = assign({}, ...args) + + return new Promise((resolve) => { + this.setData(params, resolve) + }) + }, + /** + * 延迟指定时间执行回调函数 + * @param {Function} callback 回调函数 + * @param {Number} timeout 延迟时间 + */ + $$requestAnimationFrame (callback = () => {}, timeout = 1000 / 60) { + return new Promise((resolve) => setTimeout(resolve, timeout)).then(callback) + }, + }, + /** + * 组件生命周期函数,在组件实例进入页面节点树时执行 + */ + created () { + this.fns = {} + }, + /** + * 组件生命周期函数,在组件实例被从页面节点树移除时执行 + */ + detached () { + this.fns = {} + }, +}) diff --git a/pages/common/helpers/gestures.js b/pages/common/helpers/gestures.js new file mode 100644 index 0000000..fbbcfe4 --- /dev/null +++ b/pages/common/helpers/gestures.js @@ -0,0 +1,45 @@ +/** + * 获取触摸点位置信息 + */ +export const getTouchPoints = (e, index = 0) => { + const { pageX: x, pageY: y } = e.touches[index] || e.changedTouches[index] + return { + x, + y, + } +} + +/** + * 获取触摸点个数 + */ +export const getPointsNumber = (e) => e.touches && e.touches.length || e.changedTouches && e.changedTouches.length + +/** + * 判断是否为同一点 + */ +export const isEqualPoints = (p1, p2) => p1.x === p2.x && p1.y === p2.y + +/** + * 判断是否为相近的两点 + */ +export const isNearbyPoints = (p1, p2, DOUBLE_TAP_RADIUS = 25) => { + const xMove = Math.abs(p1.x - p2.x) + const yMove = Math.abs(p1.y - p2.y) + return xMove < DOUBLE_TAP_RADIUS & yMove < DOUBLE_TAP_RADIUS +} + +/** + * 获取两点之间的距离 + */ +export const getPointsDistance = (p1, p2) => { + const xMove = Math.abs(p1.x - p2.x) + const yMove = Math.abs(p1.y - p2.y) + return Math.sqrt(xMove * xMove + yMove * yMove) +} + +/** + * 获取触摸移动方向 + */ +export const getSwipeDirection = (x1, x2, y1, y2) => { + return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down') +} diff --git a/pages/common/helpers/isEmpty.js b/pages/common/helpers/isEmpty.js new file mode 100644 index 0000000..4761810 --- /dev/null +++ b/pages/common/helpers/isEmpty.js @@ -0,0 +1,19 @@ +/** + * Checks if a value is empty. + */ +function isEmpty (value) { + if (Array.isArray(value)) { + return value.length === 0 + } else if (typeof value === 'object') { + if (value) { + for (const _ in value) { + return false + } + } + return true + } else { + return !value + } +} + +module.exports = isEmpty diff --git a/pages/common/helpers/mergeOptionsToData.js b/pages/common/helpers/mergeOptionsToData.js new file mode 100644 index 0000000..47f5acc --- /dev/null +++ b/pages/common/helpers/mergeOptionsToData.js @@ -0,0 +1,17 @@ +/** + * 过滤对象的函数属性 + * @param {Object} opts + */ +const mergeOptionsToData = (opts = {}) => { + const options = Object.assign({}, opts) + + for (const key in options) { + if (options.hasOwnProperty(key) && typeof options[key] === 'function') { + delete options[key] + } + } + + return options +} + +export default mergeOptionsToData diff --git a/pages/common/helpers/relationsBehavior.js b/pages/common/helpers/relationsBehavior.js new file mode 100644 index 0000000..66f3ac1 --- /dev/null +++ b/pages/common/helpers/relationsBehavior.js @@ -0,0 +1,53 @@ +import isEmpty from './isEmpty' +import debounce from './debounce' + +/** + * bind func to obj + */ +function bindFunc(obj, method, observer) { + const oldFn = obj[method] + obj[method] = function(target) { + if (observer) { + observer.call(this, target, { + [method]: true, + }) + } + if (oldFn) { + oldFn.call(this, target) + } + } +} + +// default methods +const methods = ['linked', 'linkChanged', 'unlinked'] + +// extra props +const extProps = ['observer'] + +module.exports = Behavior({ + lifetimes: { + created() { + this._debounce = null + }, + }, + definitionFilter(defFields) { + const { relations } = defFields + + if (!isEmpty(relations)) { + for (const key in relations) { + const relation = relations[key] + + // bind func + methods.forEach((method) => bindFunc(relation, method, relation.observer)) + + // delete extProps + extProps.forEach((prop) => delete relation[prop]) + } + } + + defFields.methods = defFields.methods || {} + defFields.methods.debounce = function(func, wait = 0, immediate = false) { + return (this._debounce = this._debounce || debounce(func.bind(this), wait, immediate)).call(this) + } + }, +}) diff --git a/pages/common/helpers/safeSetDataBehavior.js b/pages/common/helpers/safeSetDataBehavior.js new file mode 100644 index 0000000..e55febf --- /dev/null +++ b/pages/common/helpers/safeSetDataBehavior.js @@ -0,0 +1,57 @@ +module.exports = Behavior({ + lifetimes: { + created () { + this.nextCallback = null + }, + detached() { + this.cancelNextCallback() + }, + }, + methods: { + /** + * safeSetData + * @param {Object} nextData 数据对象 + * @param {Function} callback 回调函数 + */ + safeSetData(nextData, callback) { + this.pendingData = Object.assign({}, this.data, nextData) + callback = this.setNextCallback(callback) + + this.setData(nextData, () => { + this.pendingData = null + callback() + }) + }, + /** + * 设置下一回调函数 + * @param {Function} callback 回调函数 + */ + setNextCallback(callback) { + let active = true + + this.nextCallback = (event) => { + if (active) { + active = false + this.nextCallback = null + + callback.call(this, event) + } + } + + this.nextCallback.cancel = () => { + active = false + } + + return this.nextCallback + }, + /** + * 取消下一回调函数 + */ + cancelNextCallback() { + if (this.nextCallback !== null) { + this.nextCallback.cancel() + this.nextCallback = null + } + }, + }, +}) diff --git a/pages/common/helpers/shallowEqual.js b/pages/common/helpers/shallowEqual.js new file mode 100644 index 0000000..959db78 --- /dev/null +++ b/pages/common/helpers/shallowEqual.js @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @typechecks + * + */ + +/*eslint-disable no-self-compare */ + +'use strict'; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + // Added the nonzero y check to make Flow happy, but it is redundant + return x !== 0 || y !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } +} + +/** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ +function shallowEqual(objA, objB) { + if (is(objA, objB)) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + for (var i = 0; i < keysA.length; i++) { + if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { + return false; + } + } + + return true; +} + +module.exports = shallowEqual; \ No newline at end of file diff --git a/pages/common/helpers/styleToCssString.js b/pages/common/helpers/styleToCssString.js new file mode 100644 index 0000000..9b17c2a --- /dev/null +++ b/pages/common/helpers/styleToCssString.js @@ -0,0 +1,138 @@ +'use strict'; + +/** + * CSS properties which accept numbers but are not in units of "px". + */ +var isUnitlessNumber = { + boxFlex: true, + boxFlexGroup: true, + columnCount: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related properties + fillOpacity: true, + strokeDashoffset: true, + strokeOpacity: true, + strokeWidth: true +}; + +/** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ +function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); +} + +/** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ +var prefixes = ['Webkit', 'ms', 'Moz', 'O']; + +// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an +// infinite loop, because it iterates over the newly added props too. +Object.keys(isUnitlessNumber).forEach(function(prop) { + prefixes.forEach(function(prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); +}); + +var msPattern = /^ms-/; + +var _uppercasePattern = /([A-Z])/g; + +/** + * Hyphenates a camelcased string, for example: + * + * > hyphenate('backgroundColor') + * < "background-color" + * + * For CSS style names, use `hyphenateStyleName` instead which works properly + * with all vendor prefixes, including `ms`. + * + * @param {string} string + * @return {string} + */ +function hyphenate(string) { + return string.replace(_uppercasePattern, '-$1').toLowerCase(); +} + +/** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + * + * @param {string} string + * @return {string} + */ +function hyphenateStyleName(string) { + return hyphenate(string).replace(msPattern, '-ms-'); +} + +var isArray = Array.isArray; +var keys = Object.keys; + +var counter = 1; +// Follows syntax at https://developer.mozilla.org/en-US/docs/Web/CSS/content, +// including multiple space separated values. +var unquotedContentValueRegex = /^(normal|none|(\b(url\([^)]*\)|chapter_counter|attr\([^)]*\)|(no-)?(open|close)-quote|inherit)((\b\s*)|$|\s+))+)$/; + +function buildRule(key, value) { + if (!isUnitlessNumber[key] && typeof value === 'number') { + value = '' + value + 'px'; + } else if (key === 'content' && !unquotedContentValueRegex.test(value)) { + value = "'" + value.replace(/'/g, "\\'") + "'"; + } + + return hyphenateStyleName(key) + ': ' + value + '; '; +} + +function styleToCssString(rules) { + var result = '' + if (typeof rules === 'string') { + return rules + } + if (!rules || keys(rules).length === 0) { + return result; + } + var styleKeys = keys(rules); + for (var j = 0, l = styleKeys.length; j < l; j++) { + var styleKey = styleKeys[j]; + var value = rules[styleKey]; + + if (isArray(value)) { + for (var i = 0, len = value.length; i < len; i++) { + result += buildRule(styleKey, value[i]); + } + } else { + result += buildRule(styleKey, value); + } + } + return result; +} + +module.exports = styleToCssString; diff --git a/pages/common/icon/index.js b/pages/common/icon/index.js new file mode 100644 index 0000000..d950aed --- /dev/null +++ b/pages/common/icon/index.js @@ -0,0 +1,21 @@ +Component({ + externalClasses: ['wux-class'], + properties: { + type: { + type: String, + value: '', + }, + size: { + type: Number, + value: 32, + }, + color: { + type: String, + value: '', + }, + hidden: { + type: Boolean, + value: false + } + }, +}) \ No newline at end of file diff --git a/pages/common/icon/index.json b/pages/common/icon/index.json new file mode 100644 index 0000000..fba482a --- /dev/null +++ b/pages/common/icon/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/pages/common/icon/index.wxml b/pages/common/icon/index.wxml new file mode 100644 index 0000000..a0a629e --- /dev/null +++ b/pages/common/icon/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/common/icon/index.wxss b/pages/common/icon/index.wxss new file mode 100644 index 0000000..af78355 --- /dev/null +++ b/pages/common/icon/index.wxss @@ -0,0 +1,15 @@ +/*! + Ionicons, v4.3.0 + Github: http://ionicons.com/ + Convert to base64: https://transfonter.org/ +*//*! + Ionicons, v4.3.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:Ionicons;src:url(data:application/font-sfnt;charset=utf-8;base64,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AcAAAAEeAAABwP/+AYAAAAGgAAABoAAAASAAAAGAAAABwAAAAaAAAAGwAAABwAAAAYAAAAHA//sBIAAAAWAAAAGgAAABQAAAAYAAAAGAAAABwAAAAYAAAAGgAAAB2AAAAUAAAAGAAAABwAAAAaAAAAHAAAABoAAAAaAAAAGAAAABgAAAAaAAAAGgAAABgAAAAYAAAAGgAAABoAAAASoAAAGgAAAB4AAAAcAAAAHAAAAB4AAAAeAAAAHgAAAB4AAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAGAAAABgAAAAYAAAAHAAAAB4P/7AaAAAAHAAAABgAAAAaAAAAFQAAABgAAAAaAAAAHAAAABwAAAAcAAAAGgAAABQAAAAgAAAAFAAAABoAAAAWAAAAGAAAABgAAAAcAAAAHAAAABwAAAASAAAAGgAAABQAAAAYD/+wFAAAABQAAAAMAAAAGAAAABgAAAAcAAAAHAAAABoAAAAcAAAAFAAAABwAAAAcAAAAGAAAABgAAAAYAAAAHAAAABoAAAAYAAAAHA//4Bnv/+AaAAAAGAAAABoAAAAaAAAAGgAAABAAAAAaAAAAFAAAABgAAAAcD//wGgAAABoAAAADAAAAHAAAABoAAAAUAAAAIAAAABQAAAAYAAAAFgAAABwAAAAUAAAAGgAAABoAAAAWAAAAHAAAABwAAAAaAAAACoAAABgAAAAaAAAAGYAAABoAAAAcAAAAGAAAABmAAAAUAAAAEAAAABmgAAAcAAAAGAAAABwAAAAQAAAAGAAAABQAAAAWwAAAFgAAABYAAAAcAAAAGgAAABgAAAAcAAAAHAAAABoAAAAcAAAAHAAAABQAAAAaD/+QHAAAAB4AAAAYAAAAHAAAABIAAAAaAAAAHAAAABQAAAAYAAAAHAAAABQAAAAYAAAAIAAAABgAAAAcD/+gFAAAABwAAAAaAAAAGAAAABwAAAAaAAAAHAAAABoAAAAX8AAAGgAAABoAAAAaAAAAHAAAABpAAAAcAAAAFgAAABoAAAAUAAAAFAAAABgAAAAaAAAAGfAAABwAAAAcAAAAHAAAABwAAAAYAAAAGgAAABoAAAAcAAAAGAAAABoAAAAaD//QGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGcAAABoAAAAYAAAAGAAAABlAAAAZQAAAGUAAABYAAA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VlxWgleeWDhY/ll+WbRZ5FoIWkJarlsaW4xcDlxCXHhc4F1GXYpdrF4QXnRenl9yX6hf+GBEYJRgtGDIYP5hMmFQYZBh6mI6YnBimmLOYuRi+mMSYx5jNmNCY1pjZmN+Y4pjnmPGY+xkEmQ6ZE5kzGUCZTBlcmZGZn5m1mb+ZyRnRGeIaFxotGjaaTJpVGnwahhqLmpmarBq1mr6ayBrZGuOa7hsCmw0bIJssmzgbRhu2G8Eb0Zv1HAYcEJwhHC4cORxEnE6cWJxjnGqcbxx9nKGcqxyxnLwcxpzcnPWdAB0OnRkdIR01HUEdSx1WHVydhJ2OnZkdrJ27HcQd3x3qHf8eCB4PHiGeKJ4yHkgeXZ5oHnIeeZ6Bnoeelp6bnqgesZ7FntCe1R7gnvAfAB8/H0ofWZ9dn2cfeR+Dn4sfnx+ln72fx5/en/SgCqAjIC4gXKBwIIEglqCloK8gt6DMINgg4iDnIPSg/iEXoSghL6E0IT+hSaFnoXYhgCGLoZOhoqGxIcChz6Hloe4h96IDIhKiHqIqIjIiPyJNolQiZ6JyIoAihyKOorIiuyLBIswi0KLeIu6i+KMCow4jGSMuo0QjSyNjI3ujgCOhI7AjuqPBo8oj0qPho+uj9SP8pBMkGqQkJDAkRiRiJGWkayR0pH8kjSSWpKWktKS7JMKkzKTaJPQlAiUIpRKlGKUbpSOlKyUwpTwlQiVIJVilXSVsJYAljyWVpaClpKW+pcOl0aXZJeIl5yXsJgWmHSYmJi0mNyZEJkmmUKZdJm0mfqaFJpmmpaawJrqmySbTJtym56byJwEnCqcdpzCnRSdNJ1MnWSdup3+nhqeUJ5ynoKexJ70nwyfMJ9In5iftp/8oGignqDcoPqhGKE2oVShqKIco8ykSqSepOKlKKVspaCmJqZ4psqnGKdUp3qoUqiEqMqpKqlwqZap7KoQq7SsXqzurVCtlq3WrhCuXK6Crs6vXq+Sr8SwCLEasVSx5rIoslCygLLKsyKzOrOus/K0QrSOtO61KLVWtYi11rXutli2prbKt064FLhuuKC41rkMuSS5VLmaudq6Orp0uqC63Ltou4y74rwMvGi8zL1AvZS+AL44vpC/Kr9uv66/zsASwErAeMCqAAIAEQAAAJkBVQADAAcALrEBAC88sgcEAO0ysQYF3DyyAwIA7TIAsQMALzyyBQQA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cmdlIDIuMCA6IElvbmljb25zIDogMTQtNi0yMDE4AABJAG8AbgBpAGMAbwBuAHMAAElvbmljb25zAABWAGUAcgBzAGkAbwBuACAAMAAwADEALgAwADAAMAAgAABWZXJzaW9uIDAwMS4wMDAgAABJAG8AbgBpAGMAbwBuAHMAAElvbmljb25zAAACAAAAAAAA/8AAGQAAAAAAAAAAAAAAAAAAAAAAAAAAArsAAAABAAIBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kHdW5pRjEwMAd1bmlGMTAxB3VuaUYxMDIHdW5pRjEwMwd1bmlGMTA0B3VuaUYxMDUHdW5pRjEwNgd1bmlGMTA3B3VuaUYxMDgHdW5pRjEwOQd1bmlGMTBBB3VuaUYxMEIHdW5pRjEwQwd1bmlGMTBEB3VuaUYxMEUHdW5pRjEwRgd1bmlGMTEwB3VuaUYxMTEHdW5pRjExMgd1bmlGMTEzB3VuaUYxMTQHdW5pRjExNQd1bmlGMTE2B3VuaUYxMTcHdW5pRjExOAd1bmlGMTE5B3VuaUYxMUEHdW5pRjExQgd1bmlGMTFDB3VuaUYxMUQHdW5pRjExRQd1bmlGMTFGB3VuaUYxMjAHdW5pRjEyMQd1bmlGMTIyB3VuaUYxMjMHdW5pRjEyNAd1bmlGMTI1B3VuaUYxMjYHdW5pRjEyNwd1bmlGMTI4B3VuaUYxMjkHdW5pRjEyQQd1bmlGMTJCB3VuaUYxMkMHdW5pRjEyRAd1bmlGMTJFB3VuaUYxMkYHdW5pRjEzMAd1bmlGMTMxB3VuaUYxMzIHdW5pRjEzMwd1bmlGMTM0B3VuaUYxMzUHdW5pRjEzNgd1bmlGMTM3B3VuaUYxMzgHdW5pRjEzOQd1bmlGMTNBB3VuaUYxM0IHdW5pRjEzQwd1bmlGMTNEB3VuaUYxM0UHdW5pRjEzRgd1bmlGMTQwB3VuaUYxNDEHdW5pRjE0Mgd1bmlGMTQzB3VuaUYxNDQHdW5pRjE0NQd1bmlGMTQ2B3VuaUYxNDcHdW5pRjE0OAd1bmlGMTQ5B3VuaUYxNEEHdW5pRjE0Qgd1bmlGMTRDB3VuaUYxNEQHdW5pRjE0RQd1bmlGMTRGB3VuaUYxNTAHdW5pRjE1MQd1bmlGMTUyB3VuaUYxNTMHdW5pRjE1NAd1bmlGMTU1B3VuaUYxNTYHdW5pRjE1Nwd1bmlGMTU4B3VuaUYxNTkHdW5pRjE1QQd1bmlGMTVCB3VuaUYxNUMHdW5pRjE1RAd1bmlGMTVFB3VuaUYxNUYHdW5pRjE2MAd1bmlGMTYxB3VuaUYxNjIHdW5pRjE2Mwd1bmlGMTY0B3VuaUYxNjUHdW5pRjE2Ngd1bmlGMTY3B3VuaUYxNjgHdW5pRjE2OQd1bmlGMTZBB3VuaUYxNkIHdW5pRjE2Qwd1bmlGMTZEB3VuaUYxNkUHdW5pRjE2Rgd1bmlGMTcwB3VuaUYxNzEHdW5pRjE3Mgd1bmlGMTczB3VuaUYxNzQHdW5pRjE3NQd1bmlGMTc2B3VuaUYxNzcHdW5pRjE3OAd1bmlGMTc5B3VuaUYxN0EHdW5pRjE3Qgd1bmlGMTdDB3VuaUYxN0QHdW5pRjE3RQd1bmlGMTdGB3VuaUYxODAHdW5pRjE4MQd1bmlGMTgyB3VuaUYxODMHdW5pRjE4NAd1bmlGMTg1B3VuaUYxODYHdW5pRjE4Nwd1bmlGMTg4B3VuaUYxODkHdW5pRjE4QQd1bmlGMThCB3VuaUYxOEMHdW5pRjE4RAd1bmlGMThFB3VuaUYxOEYHdW5pRjE5MAd1bmlGMTkxB3VuaUYxOTIHdW5pRjE5Mwd1bmlGMTk0B3VuaUYxOTUHdW5pRjE5Ngd1bmlGMTk3B3VuaUYxOTgHdW5pRjE5OQd1bmlGMTlBB3VuaUYxOUIHdW5pRjE5Qwd1bmlGMTlEB3VuaUYxOUUHdW5pRjE5Rgd1bmlGMUEwB3VuaUYxQTEHdW5pRjFBMgd1bmlGMUEzB3VuaUYxQTQHdW5pRjFBNQd1bmlGMUE2B3VuaUYxQTcHdW5pRjFBOAd1bmlGMUE5B3VuaUYxQUEHdW5pRjFBQgd1bmlGMUFDB3VuaUYxQUUHdW5pRjFCMAd1bmlGMUIxB3VuaUYxQjIHdW5pRjFCNAd1bmlGMUI2B3VuaUYxQjgHdW5pRjFCOQd1bmlGMUJCB3VuaUYxQkQHdW5pRjFCRgd1bmlGMUMxB3VuaUYxQzMHdW5pRjFDNgd1bmlGMUM4B3VuaUYxQzkHdW5pRjFDQgd1bmlGMUQxB3VuaUYxRDMHdW5pRjFENQd1bmlGMUQ3B3VuaUYxRDkHdW5pRjFEQgd1bmlGMUREB3VuaUYxREYHdW5pRjFFMQd1bmlGMUUyB3VuaUYxRTMHdW5pRjFFNQd1bmlGMUU3B3VuaUYxRUIHdW5pRjFFRAd1bmlGMUVGB3VuaUYxRjEHdW5pRjFGMwd1bmlGMUY1B3VuaUYxRjYHdW5pRjFGNwd1bmlGMUY5B3VuaUYxRkEHdW5pRjFGQgd1bmlGMUZDB3VuaUYxRkQHdW5pRjFGRQd1bmlGMUZGB3VuaUYyMDEHdW5pRjIwMgd1bmlGMjAzB3VuaUYyMDUHdW5pRjIwNwd1bmlGMjA5B3VuaUYyMEMHdW5pRjIwRgd1bmlGMjExB3VuaUYyMTMHdW5pRjIxNQd1bmlGMjE3B3VuaUYyMTgHdW5pRjIxQQd1bmlGMjFDB3VuaUYyMUUHdW5pRjIxRgd1bmlGMjIxB3VuaUYyMjIHdW5pRjIyMwd1bmlGMjI1B3VuaUYyMjcHdW5pRjIyOAd1bmlGMjI5B3VuaUYyMkEHdW5pRjIyQgd1bmlGMjJEB3VuaUYyMkUHdW5pRjIyRgd1bmlGMjMwB3VuaUYyMzEHdW5pRjIzMgd1bmlGMjMzB3VuaUYyMzQHdW5pRjIzNQd1bmlGMjM2B3VuaUYyMzcHdW5pRjIzOAd1bmlGMjM5B3VuaUYyM0EHdW5pRjIzQgd1bmlGMjNDB3VuaUYyM0QHdW5pRjIzRQd1bmlGMjNGB3VuaUYyNDAHdW5pRjI0MQd1bmlGMjQyB3VuaUYyNDMHdW5pRjI0NAd1bmlGMjQ1B3VuaUYyNDYHdW5pRjI0Nwd1bmlGMjQ4B3VuaUYyNDkHdW5pRjI0QQd1bmlGMjRCB3VuaUYyNEMHdW5pRjI0RAd1bmlGMjRFB3VuaUYyNTAHdW5pRjI1Mgd1bmlGMjU0B3VuaUYyNTYHdW5pRjI1OAd1bmlGMjU5B3VuaUYyNUEHdW5pRjI1Qgd1bmlGMjVEB3VuaUYyNUYHdW5pRjI2MQd1bmlGMjYzB3VuaUYyNjQHdW5pRjI2Ngd1bmlGMjY4B3VuaUYyNjkHdW5pRjI2Qgd1bmlGMjZEB3VuaUYyNkYHdW5pRjI3MQd1bmlGMjcyB3VuaUYyNzMHdW5pRjI3NAd1bmlGMjc1B3VuaUYyNzYHdW5pRjI3Nwd1bmlGMjc4B3VuaUYyNzkHdW5pRjI3QQd1bmlGMjdCB3VuaUYyN0MHdW5pRjI3RAd1bmlGMjdFB3VuaUYyN0YHdW5pRjI4MAd1bmlGMjgxB3VuaUYyODIHdW5pRjI4Mwd1bmlGMjg0B3VuaUYyODUHdW5pRjI4Ngd1bmlGMjg3B3VuaUYyODgHdW5pRjI4OQd1bmlGMjhBB3VuaUYyOEIHdW5pRjI4Qwd1bmlGMjhEB3VuaUYyOEUHdW5pRjI4Rgd1bmlGMjkwB3VuaUYyOTEHdW5pRjI5Mgd1bmlGMjkzB3VuaUYyOTQHdW5pRjI5NQd1bmlGMjk2B3VuaUYyOTcHdW5pRjI5OAd1bmlGMjk5B3VuaUYyOUEHdW5pRjI5Qgd1bmlGMjlDB3VuaUYyOUQHdW5pRjI5RQd1bmlGMjlGB3VuaUYyQTAHdW5pRjJBMQd1bmlGMkEyB3VuaUYyQTMHdW5pRjJBNAd1bmlGMkE1B3VuaUYyQTYHdW5pRjJBNwd1bmlGMkE4B3VuaUYyQTkHdW5pRjJBQQd1bmlGMkFCB3VuaUYyQUMHdW5pRjJBRAd1bmlGMkFFB3VuaUYyQUYHdW5pRjJCMAd1bmlGMkIxB3VuaUYyQjIHdW5pRjJCMwd1bmlGMkI0B3VuaUYyQjUHdW5pRjJCNgd1bmlGMkI3B3VuaUYyQjgHdW5pRjJCOQd1bmlGMkJBB3VuaUYyQkIHdW5pRjJCQwd1bmlGMkJEB3VuaUYyQkUHdW5pRjJCRgd1bmlGMkMwB3VuaUYyQzIHdW5pRjJDMwd1bmlGMkM0B3VuaUYyQzUHdW5pRjJDNgd1bmlGMkM3B3VuaUYyQzgHdW5pRjJDOQd1bmlGMkNBB3VuaUYyQ0IHdW5pRjJDQwd1bmlGMkNEB3VuaUYyQ0UHdW5pRjJDRgd1bmlGMkQwB3VuaUYyRDEHdW5pRjJEMgd1bmlGMkQzB3VuaUYyRDQHdW5pRjJENQd1bmlGMkQ2B3VuaUYyRDcHdW5pRjJEOAd1bmlGMkQ5B3VuaUYyREEHdW5pRjJEQgd1bmlGMkRDB3VuaUYyREQHdW5pRjJERQd1bmlGMkRGB3VuaUYyRTAHdW5pRjJFMQd1bmlGMkUyB3VuaUYyRTMHdW5pRjJFNAd1bmlGMkU1B3VuaUYyRTYHdW5pRjJFNwd1bmlGMkU4B3VuaUYyRTkHdW5pRjJFQQd1bmlGMkVCB3VuaUYyRUMHdW5pRjJFRAd1bmlGMkVFB3VuaUYyRUYHdW5pRjJGMAd1bmlGMkYxB3VuaUYyRjIHdW5pRjJGMwd1bmlGMkY0B3VuaUYyRjUHdW5pRjJGNgd1bmlGMkY3B3VuaUYyRkEHdW5pRjJGQgd1bmlGMkZDB3VuaUYyRkQHdW5pRjJGRQd1bmlGMkZGB3VuaUYzMDAHdW5pRjMwMQd1bmlGMzAyB3VuaUYzMDMHdW5pRjMwNAd1bmlGMzA1B3VuaUYzMDYHdW5pRjMwOAd1bmlGMzA5B3VuaUYzMEEHdW5pRjMwQgd1bmlGMzBDB3VuaUYzMEQHdW5pRjMwRQd1bmlGMzBGB3VuaUYzMTAHdW5pRjMxMQd1bmlGMzEyB3VuaUYzMTUHdW5pRjMxNgd1bmlGMzE3B3VuaUYzMTgHdW5pRjMxOQd1bmlGMzFBB3VuaUYzMUIHdW5pRjMxQwd1bmlGMzFEB3VuaUYzMUUHdW5pRjMxRgd1bmlGMzIwB3VuaUYzMjEHdW5pRjMyMgd1bmlGMzIzB3VuaUYzMjQHdW5pRjMyNQd1bmlGMzI2B3VuaUYzMjcHdW5pRjMyOAd1bmlGMzI5B3VuaUYzMkEHdW5pRjMyQgd1bmlGMzJDB3VuaUYzMkQHdW5pRjMyRQd1bmlGMzJGB3VuaUYzMzAHdW5pRjMzMQd1bmlGMzMyB3VuaUYzMzMHdW5pRjMzNAd1bmlGMzM2B3VuaUYzMzcHdW5pRjMzOAd1bmlGMzM5B3VuaUYzM0EHdW5pRjMzQgd1bmlGMzNDB3VuaUYzM0QHdW5pRjMzRQd1bmlGMzNGB3VuaUYzNDAHdW5pRjM0MQd1bmlGMzQyB3VuaUYzNDMHdW5pRjM0NAd1bmlGMzQ1B3VuaUYzNDYHdW5pRjM0Nwd1bmlGMzQ4B3VuaUYzNDkHdW5pRjM0QQd1bmlGMzRCB3VuaUYzNEMHdW5pRjM0RAd1bmlGMzRFB3VuaUYzNEYHdW5pRjM1NAd1bmlGMzU2B3VuaUYzNTcHdW5pRjM1OAd1bmlGMzU5B3VuaUYzNUEHdW5pRjM1Qgd1bmlGMzVDB3VuaUYzNUQHdW5pRjM1RQd1bmlGMzVGB3VuaUYzNjAHdW5pRjM2MQd1bmlGMzYyB3VuaUYzNjMHdW5pRjM2NAd1bmlGMzY1B3VuaUYzNjYHdW5pRjM2Nwd1bmlGMzY4B3VuaUYzNjkHdW5pRjM2QQd1bmlGMzZCB3VuaUYzNkMHdW5pRjM2RAd1bmlGMzZFB3VuaUYzNkYHdW5pRjM3MAd1bmlGMzcxB3VuaUYzNzIHdW5pRjM3Mwd1bmlGMzc0B3VuaUYzNzUHdW5pRjM3Ngd1bmlGMzc3B3VuaUYzNzgHdW5pRjM3OQd1bmlGMzdBB3VuaUYzN0IHdW5pRjM3Qwd1bmlGMzdEB3VuaUYzN0UHdW5pRjM3Rgd1bmlGMzgwB3VuaUYzODEHdW5pRjM4Mgd1bmlGMzgzB3VuaUYzODQHdW5pRjM4NQd1bmlGMzg2B3VuaUYzODcHdW5pRjM4OAd1bmlGMzg5B3VuaUYzOEEHdW5pRjM4Qgd1bmlGMzhDB3VuaUYzOEQHdW5pRjM4RQd1bmlGMzhGB3VuaUYzOTAHdW5pRjM5MQd1bmlGMzkyB3VuaUYzOTMHdW5pRjM5NAd1bmlGMzk1B3VuaUYzOTYHdW5pRjM5Nwd1bmlGMzk4B3VuaUYzOTkHdW5pRjM5QQd1bmlGMzlCB3VuaUYzOUMHdW5pRjM5RAd1bmlGMzlFB3VuaUYzOUYHdW5pRjNBMQd1bmlGM0EyB3VuaUYzQTQHdW5pRjNBNQd1bmlGM0E2B3VuaUYzQTcHdW5pRjNBOAd1bmlGM0E5B3VuaUYzQUEHdW5pRjNDOAd1bmlGM0NBB3VuaUYzQ0UHdW5pRjNDRgd1bmlGM0QwB3VuaUYzRDEHdW5pRjNEOAd1bmlGM0RBB3VuaUYzREMHdW5pRjNERQd1bmlGM0UwB3VuaUYzRTQHdW5pRjNFOAd1bmlGM0VBB3VuaUYzRUUHdW5pRjNGMAd1bmlGM0YyB3VuaUYzRjQHdW5pRjNGNgd1bmlGM0Y4B3VuaUYzRkEHdW5pRjNGRgd1bmlGNDAzB3VuaUY0MDYHdW5pRjQwOAd1bmlGNDA5B3VuaUY0MEIHdW5pRjQwQwd1bmlGNDBFB3VuaUY0MTAHdW5pRjQxMgd1bmlGNDE0B3VuaUY0MTYHdW5pRjQxQQd1bmlGNDFDB3VuaUY0MUUHdW5pRjQyMAd1bmlGNDI1B3VuaUY0MjcHdW5pRjQyOQd1bmlGNDJCB3VuaUY0MkQHdW5pRjQyRgd1bmlGNDMxB3VuaUY0MzMHdW5pRjQzNQd1bmlGNDM3B3VuaUY0M0YHdW5pRjQ0Mwd1bmlGNDQ2B3VuaUY0NDgHdW5pRjQ0QQd1bmlGNDREB3VuaUY0NTAHdW5pRjQ1NAd1bmlGNDVDB3VuaUY0NUUHdW5pRjQ1Rgd1bmlGNDYxB3VuaUY0NjgHdW5pRjQ2Qgd1bmlGNDZDB3VuaUY0NkUHdW5pRjQ3MAd1bmlGNDcyB3VuaUY0NzgHdW5pRjQ3QQd1bmlGNDdDB3VuaUY0N0UHdW5pRjQ4Mgd1bmlGNDg0B3VuaUY0ODYHdW5pRjQ4OAd1bmlGNDhEB3VuaUY0OEYHdW5pRjQ5Mwd1bmlGNDk1B3VuaUY0OTcHdW5pRjQ5OQd1bmlGNDlDB3VuaUY0OUYHdW5pRjRBMQd1bmlGNEEzB3VuaUY0QTUHdW5pRjRBNwd1bmlGNEE5B3VuaUY0QjAHdW5pRjRCMQd1bmlGNEIyB3VuaUY0QjMHdW5pRjRCNQd1bmlGNEI3B3VuaUY0QkIHdW5pRjRCRAd1bmlGNEJGB3VuaUY0QzEHdW5pRjRDNQd1bmlGNEM3B3VuaUY0Q0QAAAAB//8AAgAAAAEAAAAA0ywqSAAAAADXSCMpAAAAANdIIyo=) format("truetype");font-weight:400;font-style:normal}.ion,.ion-ios-add-circle-outline:before,.ion-ios-add-circle:before,.ion-ios-add:before,.ion-ios-airplane:before,.ion-ios-alarm:before,.ion-ios-albums:before,.ion-ios-alert:before,.ion-ios-american-football:before,.ion-ios-analytics:before,.ion-ios-aperture:before,.ion-ios-apps:before,.ion-ios-appstore:before,.ion-ios-archive:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-dropdown-circle:before,.ion-ios-arrow-dropdown:before,.ion-ios-arrow-dropleft-circle:before,.ion-ios-arrow-dropleft:before,.ion-ios-arrow-dropright-circle:before,.ion-ios-arrow-dropright:before,.ion-ios-arrow-dropup-circle:before,.ion-ios-arrow-dropup:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-round-back:before,.ion-ios-arrow-round-down:before,.ion-ios-arrow-round-forward:before,.ion-ios-arrow-round-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-attach:before,.ion-ios-backspace:before,.ion-ios-barcode:before,.ion-ios-baseball:before,.ion-ios-basket:before,.ion-ios-basketball:before,.ion-ios-battery-charging:before,.ion-ios-battery-dead:before,.ion-ios-battery-full:before,.ion-ios-beaker:before,.ion-ios-bed:before,.ion-ios-beer:before,.ion-ios-bicycle:before,.ion-ios-bluetooth:before,.ion-ios-boat:before,.ion-ios-body:before,.ion-ios-bonfire:before,.ion-ios-book:before,.ion-ios-bookmark:before,.ion-ios-bookmarks:before,.ion-ios-bowtie:before,.ion-ios-briefcase:before,.ion-ios-browsers:before,.ion-ios-brush:before,.ion-ios-bug:before,.ion-ios-build:before,.ion-ios-bulb:before,.ion-ios-bus:before,.ion-ios-business:before,.ion-ios-cafe:before,.ion-ios-calculator:before,.ion-ios-calendar:before,.ion-ios-call:before,.ion-ios-camera:before,.ion-ios-car:before,.ion-ios-card:before,.ion-ios-cart:before,.ion-ios-cash:before,.ion-ios-cellular:before,.ion-ios-chatboxes:before,.ion-ios-chatbubbles:before,.ion-ios-checkbox-outline:before,.ion-ios-checkbox:before,.ion-ios-checkmark-circle-outline:before,.ion-ios-checkmark-circle:before,.ion-ios-checkmark:before,.ion-ios-clipboard:before,.ion-ios-clock:before,.ion-ios-close-circle-outline:before,.ion-ios-close-circle:before,.ion-ios-close:before,.ion-ios-cloud-circle:before,.ion-ios-cloud-done:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy:before,.ion-ios-code-download:before,.ion-ios-code-working:before,.ion-ios-code:before,.ion-ios-cog:before,.ion-ios-color-fill:before,.ion-ios-color-filter:before,.ion-ios-color-palette:before,.ion-ios-color-wand:before,.ion-ios-compass:before,.ion-ios-construct:before,.ion-ios-contact:before,.ion-ios-contacts:before,.ion-ios-contract:before,.ion-ios-contrast:before,.ion-ios-copy:before,.ion-ios-create:before,.ion-ios-crop:before,.ion-ios-cube:before,.ion-ios-cut:before,.ion-ios-desktop:before,.ion-ios-disc:before,.ion-ios-document:before,.ion-ios-done-all:before,.ion-ios-download:before,.ion-ios-easel:before,.ion-ios-egg:before,.ion-ios-exit:before,.ion-ios-expand:before,.ion-ios-eye-off:before,.ion-ios-eye:before,.ion-ios-fastforward:before,.ion-ios-female:before,.ion-ios-filing:before,.ion-ios-film:before,.ion-ios-finger-print:before,.ion-ios-fitness:before,.ion-ios-flag:before,.ion-ios-flame:before,.ion-ios-flash-off:before,.ion-ios-flash:before,.ion-ios-flashlight:before,.ion-ios-flask:before,.ion-ios-flower:before,.ion-ios-folder-open:before,.ion-ios-folder:before,.ion-ios-football:before,.ion-ios-funnel:before,.ion-ios-gift:before,.ion-ios-git-branch:before,.ion-ios-git-commit:before,.ion-ios-git-compare:before,.ion-ios-git-merge:before,.ion-ios-git-network:before,.ion-ios-git-pull-request:before,.ion-ios-glasses:before,.ion-ios-globe:before,.ion-ios-grid:before,.ion-ios-hammer:before,.ion-ios-hand:before,.ion-ios-happy:before,.ion-ios-headset:before,.ion-ios-heart-dislike:before,.ion-ios-heart-empty:before,.ion-ios-heart-half:before,.ion-ios-heart:before,.ion-ios-help-buoy:before,.ion-ios-help-circle-outline:before,.ion-ios-help-circle:before,.ion-ios-help:before,.ion-ios-home:before,.ion-ios-hourglass:before,.ion-ios-ice-cream:before,.ion-ios-image:before,.ion-ios-images:before,.ion-ios-infinite:before,.ion-ios-information-circle-outline:before,.ion-ios-information-circle:before,.ion-ios-information:before,.ion-ios-jet:before,.ion-ios-journal:before,.ion-ios-key:before,.ion-ios-keypad:before,.ion-ios-laptop:before,.ion-ios-leaf:before,.ion-ios-link:before,.ion-ios-list-box:before,.ion-ios-list:before,.ion-ios-locate:before,.ion-ios-lock:before,.ion-ios-log-in:before,.ion-ios-log-out:before,.ion-ios-magnet:before,.ion-ios-mail-open:before,.ion-ios-mail-unread:before,.ion-ios-mail:before,.ion-ios-male:before,.ion-ios-man:before,.ion-ios-map:before,.ion-ios-medal:before,.ion-ios-medical:before,.ion-ios-medkit:before,.ion-ios-megaphone:before,.ion-ios-menu:before,.ion-ios-mic-off:before,.ion-ios-mic:before,.ion-ios-microphone:before,.ion-ios-moon:before,.ion-ios-more:before,.ion-ios-move:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-notifications-off:before,.ion-ios-notifications-outline:before,.ion-ios-notifications:before,.ion-ios-nuclear:before,.ion-ios-nutrition:before,.ion-ios-open:before,.ion-ios-options:before,.ion-ios-outlet:before,.ion-ios-paper-plane:before,.ion-ios-paper:before,.ion-ios-partly-sunny:before,.ion-ios-pause:before,.ion-ios-paw:before,.ion-ios-people:before,.ion-ios-person-add:before,.ion-ios-person:before,.ion-ios-phone-landscape:before,.ion-ios-phone-portrait:before,.ion-ios-photos:before,.ion-ios-pie:before,.ion-ios-pin:before,.ion-ios-pint:before,.ion-ios-pizza:before,.ion-ios-planet:before,.ion-ios-play-circle:before,.ion-ios-play:before,.ion-ios-podium:before,.ion-ios-power:before,.ion-ios-pricetag:before,.ion-ios-pricetags:before,.ion-ios-print:before,.ion-ios-pulse:before,.ion-ios-qr-scanner:before,.ion-ios-quote:before,.ion-ios-radio-button-off:before,.ion-ios-radio-button-on:before,.ion-ios-radio:before,.ion-ios-rainy:before,.ion-ios-recording:before,.ion-ios-redo:before,.ion-ios-refresh-circle:before,.ion-ios-refresh:before,.ion-ios-remove-circle-outline:before,.ion-ios-remove-circle:before,.ion-ios-remove:before,.ion-ios-reorder:before,.ion-ios-repeat:before,.ion-ios-resize:before,.ion-ios-restaurant:before,.ion-ios-return-left:before,.ion-ios-return-right:before,.ion-ios-reverse-camera:before,.ion-ios-rewind:before,.ion-ios-ribbon:before,.ion-ios-rocket:before,.ion-ios-rose:before,.ion-ios-sad:before,.ion-ios-save:before,.ion-ios-school:before,.ion-ios-search:before,.ion-ios-send:before,.ion-ios-settings:before,.ion-ios-share-alt:before,.ion-ios-share:before,.ion-ios-shirt:before,.ion-ios-shuffle:before,.ion-ios-skip-backward:before,.ion-ios-skip-forward:before,.ion-ios-snow:before,.ion-ios-speedometer:before,.ion-ios-square-outline:before,.ion-ios-square:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stats:before,.ion-ios-stopwatch:before,.ion-ios-subway:before,.ion-ios-sunny:before,.ion-ios-swap:before,.ion-ios-switch:before,.ion-ios-sync:before,.ion-ios-tablet-landscape:before,.ion-ios-tablet-portrait:before,.ion-ios-tennisball:before,.ion-ios-text:before,.ion-ios-thermometer:before,.ion-ios-thumbs-down:before,.ion-ios-thumbs-up:before,.ion-ios-thunderstorm:before,.ion-ios-time:before,.ion-ios-timer:before,.ion-ios-today:before,.ion-ios-train:before,.ion-ios-transgender:before,.ion-ios-trash:before,.ion-ios-trending-down:before,.ion-ios-trending-up:before,.ion-ios-trophy:before,.ion-ios-tv:before,.ion-ios-umbrella:before,.ion-ios-undo:before,.ion-ios-unlock:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-volume-mute:before,.ion-ios-volume-off:before,.ion-ios-walk:before,.ion-ios-wallet:before,.ion-ios-warning:before,.ion-ios-watch:before,.ion-ios-water:before,.ion-ios-wifi:before,.ion-ios-wine:before,.ion-ios-woman:before,.ion-logo-android:before,.ion-logo-angular:before,.ion-logo-apple:before,.ion-logo-bitbucket:before,.ion-logo-bitcoin:before,.ion-logo-buffer:before,.ion-logo-chrome:before,.ion-logo-closed-captioning:before,.ion-logo-codepen:before,.ion-logo-css3:before,.ion-logo-designernews:before,.ion-logo-dribbble:before,.ion-logo-dropbox:before,.ion-logo-euro:before,.ion-logo-facebook:before,.ion-logo-flickr:before,.ion-logo-foursquare:before,.ion-logo-freebsd-devil:before,.ion-logo-game-controller-a:before,.ion-logo-game-controller-b:before,.ion-logo-github:before,.ion-logo-google:before,.ion-logo-googleplus:before,.ion-logo-hackernews:before,.ion-logo-html5:before,.ion-logo-instagram:before,.ion-logo-ionic:before,.ion-logo-ionitron:before,.ion-logo-javascript:before,.ion-logo-linkedin:before,.ion-logo-markdown:before,.ion-logo-model-s:before,.ion-logo-no-smoking:before,.ion-logo-nodejs:before,.ion-logo-npm:before,.ion-logo-octocat:before,.ion-logo-pinterest:before,.ion-logo-playstation:before,.ion-logo-polymer:before,.ion-logo-python:before,.ion-logo-reddit:before,.ion-logo-rss:before,.ion-logo-sass:before,.ion-logo-skype:before,.ion-logo-slack:before,.ion-logo-snapchat:before,.ion-logo-steam:before,.ion-logo-tumblr:before,.ion-logo-tux:before,.ion-logo-twitch:before,.ion-logo-twitter:before,.ion-logo-usd:before,.ion-logo-vimeo:before,.ion-logo-vk:before,.ion-logo-whatsapp:before,.ion-logo-windows:before,.ion-logo-wordpress:before,.ion-logo-xbox:before,.ion-logo-xing:before,.ion-logo-yahoo:before,.ion-logo-yen:before,.ion-logo-youtube:before,.ion-md-add-circle-outline:before,.ion-md-add-circle:before,.ion-md-add:before,.ion-md-airplane:before,.ion-md-alarm:before,.ion-md-albums:before,.ion-md-alert:before,.ion-md-american-football:before,.ion-md-analytics:before,.ion-md-aperture:before,.ion-md-apps:before,.ion-md-appstore:before,.ion-md-archive:before,.ion-md-arrow-back:before,.ion-md-arrow-down:before,.ion-md-arrow-dropdown-circle:before,.ion-md-arrow-dropdown:before,.ion-md-arrow-dropleft-circle:before,.ion-md-arrow-dropleft:before,.ion-md-arrow-dropright-circle:before,.ion-md-arrow-dropright:before,.ion-md-arrow-dropup-circle:before,.ion-md-arrow-dropup:before,.ion-md-arrow-forward:before,.ion-md-arrow-round-back:before,.ion-md-arrow-round-down:before,.ion-md-arrow-round-forward:before,.ion-md-arrow-round-up:before,.ion-md-arrow-up:before,.ion-md-at:before,.ion-md-attach:before,.ion-md-backspace:before,.ion-md-barcode:before,.ion-md-baseball:before,.ion-md-basket:before,.ion-md-basketball:before,.ion-md-battery-charging:before,.ion-md-battery-dead:before,.ion-md-battery-full:before,.ion-md-beaker:before,.ion-md-bed:before,.ion-md-beer:before,.ion-md-bicycle:before,.ion-md-bluetooth:before,.ion-md-boat:before,.ion-md-body:before,.ion-md-bonfire:before,.ion-md-book:before,.ion-md-bookmark:before,.ion-md-bookmarks:before,.ion-md-bowtie:before,.ion-md-briefcase:before,.ion-md-browsers:before,.ion-md-brush:before,.ion-md-bug:before,.ion-md-build:before,.ion-md-bulb:before,.ion-md-bus:before,.ion-md-business:before,.ion-md-cafe:before,.ion-md-calculator:before,.ion-md-calendar:before,.ion-md-call:before,.ion-md-camera:before,.ion-md-car:before,.ion-md-card:before,.ion-md-cart:before,.ion-md-cash:before,.ion-md-cellular:before,.ion-md-chatboxes:before,.ion-md-chatbubbles:before,.ion-md-checkbox-outline:before,.ion-md-checkbox:before,.ion-md-checkmark-circle-outline:before,.ion-md-checkmark-circle:before,.ion-md-checkmark:before,.ion-md-clipboard:before,.ion-md-clock:before,.ion-md-close-circle-outline:before,.ion-md-close-circle:before,.ion-md-close:before,.ion-md-cloud-circle:before,.ion-md-cloud-done:before,.ion-md-cloud-download:before,.ion-md-cloud-outline:before,.ion-md-cloud-upload:before,.ion-md-cloud:before,.ion-md-cloudy-night:before,.ion-md-cloudy:before,.ion-md-code-download:before,.ion-md-code-working:before,.ion-md-code:before,.ion-md-cog:before,.ion-md-color-fill:before,.ion-md-color-filter:before,.ion-md-color-palette:before,.ion-md-color-wand:before,.ion-md-compass:before,.ion-md-construct:before,.ion-md-contact:before,.ion-md-contacts:before,.ion-md-contract:before,.ion-md-contrast:before,.ion-md-copy:before,.ion-md-create:before,.ion-md-crop:before,.ion-md-cube:before,.ion-md-cut:before,.ion-md-desktop:before,.ion-md-disc:before,.ion-md-document:before,.ion-md-done-all:before,.ion-md-download:before,.ion-md-easel:before,.ion-md-egg:before,.ion-md-exit:before,.ion-md-expand:before,.ion-md-eye-off:before,.ion-md-eye:before,.ion-md-fastforward:before,.ion-md-female:before,.ion-md-filing:before,.ion-md-film:before,.ion-md-finger-print:before,.ion-md-fitness:before,.ion-md-flag:before,.ion-md-flame:before,.ion-md-flash-off:before,.ion-md-flash:before,.ion-md-flashlight:before,.ion-md-flask:before,.ion-md-flower:before,.ion-md-folder-open:before,.ion-md-folder:before,.ion-md-football:before,.ion-md-funnel:before,.ion-md-gift:before,.ion-md-git-branch:before,.ion-md-git-commit:before,.ion-md-git-compare:before,.ion-md-git-merge:before,.ion-md-git-network:before,.ion-md-git-pull-request:before,.ion-md-glasses:before,.ion-md-globe:before,.ion-md-grid:before,.ion-md-hammer:before,.ion-md-hand:before,.ion-md-happy:before,.ion-md-headset:before,.ion-md-heart-dislike:before,.ion-md-heart-empty:before,.ion-md-heart-half:before,.ion-md-heart:before,.ion-md-help-buoy:before,.ion-md-help-circle-outline:before,.ion-md-help-circle:before,.ion-md-help:before,.ion-md-home:before,.ion-md-hourglass:before,.ion-md-ice-cream:before,.ion-md-image:before,.ion-md-images:before,.ion-md-infinite:before,.ion-md-information-circle-outline:before,.ion-md-information-circle:before,.ion-md-information:before,.ion-md-jet:before,.ion-md-journal:before,.ion-md-key:before,.ion-md-keypad:before,.ion-md-laptop:before,.ion-md-leaf:before,.ion-md-link:before,.ion-md-list-box:before,.ion-md-list:before,.ion-md-locate:before,.ion-md-lock:before,.ion-md-log-in:before,.ion-md-log-out:before,.ion-md-magnet:before,.ion-md-mail-open:before,.ion-md-mail-unread:before,.ion-md-mail:before,.ion-md-male:before,.ion-md-man:before,.ion-md-map:before,.ion-md-medal:before,.ion-md-medical:before,.ion-md-medkit:before,.ion-md-megaphone:before,.ion-md-menu:before,.ion-md-mic-off:before,.ion-md-mic:before,.ion-md-microphone:before,.ion-md-moon:before,.ion-md-more:before,.ion-md-move:before,.ion-md-musical-note:before,.ion-md-musical-notes:before,.ion-md-navigate:before,.ion-md-notifications-off:before,.ion-md-notifications-outline:before,.ion-md-notifications:before,.ion-md-nuclear:before,.ion-md-nutrition:before,.ion-md-open:before,.ion-md-options:before,.ion-md-outlet:before,.ion-md-paper-plane:before,.ion-md-paper:before,.ion-md-partly-sunny:before,.ion-md-pause:before,.ion-md-paw:before,.ion-md-people:before,.ion-md-person-add:before,.ion-md-person:before,.ion-md-phone-landscape:before,.ion-md-phone-portrait:before,.ion-md-photos:before,.ion-md-pie:before,.ion-md-pin:before,.ion-md-pint:before,.ion-md-pizza:before,.ion-md-planet:before,.ion-md-play-circle:before,.ion-md-play:before,.ion-md-podium:before,.ion-md-power:before,.ion-md-pricetag:before,.ion-md-pricetags:before,.ion-md-print:before,.ion-md-pulse:before,.ion-md-qr-scanner:before,.ion-md-quote:before,.ion-md-radio-button-off:before,.ion-md-radio-button-on:before,.ion-md-radio:before,.ion-md-rainy:before,.ion-md-recording:before,.ion-md-redo:before,.ion-md-refresh-circle:before,.ion-md-refresh:before,.ion-md-remove-circle-outline:before,.ion-md-remove-circle:before,.ion-md-remove:before,.ion-md-reorder:before,.ion-md-repeat:before,.ion-md-resize:before,.ion-md-restaurant:before,.ion-md-return-left:before,.ion-md-return-right:before,.ion-md-reverse-camera:before,.ion-md-rewind:before,.ion-md-ribbon:before,.ion-md-rocket:before,.ion-md-rose:before,.ion-md-sad:before,.ion-md-save:before,.ion-md-school:before,.ion-md-search:before,.ion-md-send:before,.ion-md-settings:before,.ion-md-share-alt:before,.ion-md-share:before,.ion-md-shirt:before,.ion-md-shuffle:before,.ion-md-skip-backward:before,.ion-md-skip-forward:before,.ion-md-snow:before,.ion-md-speedometer:before,.ion-md-square-outline:before,.ion-md-square:before,.ion-md-star-half:before,.ion-md-star-outline:before,.ion-md-star:before,.ion-md-stats:before,.ion-md-stopwatch:before,.ion-md-subway:before,.ion-md-sunny:before,.ion-md-swap:before,.ion-md-switch:before,.ion-md-sync:before,.ion-md-tablet-landscape:before,.ion-md-tablet-portrait:before,.ion-md-tennisball:before,.ion-md-text:before,.ion-md-thermometer:before,.ion-md-thumbs-down:before,.ion-md-thumbs-up:before,.ion-md-thunderstorm:before,.ion-md-time:before,.ion-md-timer:before,.ion-md-today:before,.ion-md-train:before,.ion-md-transgender:before,.ion-md-trash:before,.ion-md-trending-down:before,.ion-md-trending-up:before,.ion-md-trophy:before,.ion-md-tv:before,.ion-md-umbrella:before,.ion-md-undo:before,.ion-md-unlock:before,.ion-md-videocam:before,.ion-md-volume-high:before,.ion-md-volume-low:before,.ion-md-volume-mute:before,.ion-md-volume-off:before,.ion-md-walk:before,.ion-md-wallet:before,.ion-md-warning:before,.ion-md-watch:before,.ion-md-water:before,.ion-md-wifi:before,.ion-md-wine:before,.ion-md-woman:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios-add:before{content:"\f102"}.ion-ios-add-circle:before{content:"\f101"}.ion-ios-add-circle-outline:before{content:"\f100"}.ion-ios-airplane:before{content:"\f137"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-alert:before{content:"\f104"}.ion-ios-american-football:before{content:"\f106"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-aperture:before{content:"\f108"}.ion-ios-apps:before{content:"\f10a"}.ion-ios-appstore:before{content:"\f10c"}.ion-ios-archive:before{content:"\f10e"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-dropdown:before{content:"\f110"}.ion-ios-arrow-dropdown-circle:before{content:"\f125"}.ion-ios-arrow-dropleft:before{content:"\f112"}.ion-ios-arrow-dropleft-circle:before{content:"\f129"}.ion-ios-arrow-dropright:before{content:"\f114"}.ion-ios-arrow-dropright-circle:before{content:"\f12b"}.ion-ios-arrow-dropup:before{content:"\f116"}.ion-ios-arrow-dropup-circle:before{content:"\f12d"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-round-back:before{content:"\f117"}.ion-ios-arrow-round-down:before{content:"\f118"}.ion-ios-arrow-round-forward:before{content:"\f119"}.ion-ios-arrow-round-up:before{content:"\f11a"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-attach:before{content:"\f11b"}.ion-ios-backspace:before{content:"\f11d"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-basket:before{content:"\f11f"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-battery-charging:before{content:"\f120"}.ion-ios-battery-dead:before{content:"\f121"}.ion-ios-battery-full:before{content:"\f122"}.ion-ios-beaker:before{content:"\f124"}.ion-ios-bed:before{content:"\f139"}.ion-ios-beer:before{content:"\f126"}.ion-ios-bicycle:before{content:"\f127"}.ion-ios-bluetooth:before{content:"\f128"}.ion-ios-boat:before{content:"\f12a"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-bonfire:before{content:"\f12c"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-bookmark:before{content:"\f12e"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bowtie:before{content:"\f130"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-brush:before{content:"\f132"}.ion-ios-bug:before{content:"\f134"}.ion-ios-build:before{content:"\f136"}.ion-ios-bulb:before{content:"\f138"}.ion-ios-bus:before{content:"\f13a"}.ion-ios-business:before{content:"\f1a3"}.ion-ios-cafe:before{content:"\f13c"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-call:before{content:"\f13e"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-car:before{content:"\f140"}.ion-ios-card:before{content:"\f142"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cash:before{content:"\f144"}.ion-ios-cellular:before{content:"\f13d"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatbubbles:before{content:"\f146"}.ion-ios-checkbox:before{content:"\f148"}.ion-ios-checkbox-outline:before{content:"\f147"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-circle:before{content:"\f14a"}.ion-ios-checkmark-circle-outline:before{content:"\f149"}.ion-ios-clipboard:before{content:"\f14c"}.ion-ios-clock:before{content:"\f403"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-circle:before{content:"\f14e"}.ion-ios-close-circle-outline:before{content:"\f14d"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-circle:before{content:"\f152"}.ion-ios-cloud-done:before{content:"\f154"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-code:before{content:"\f157"}.ion-ios-code-download:before{content:"\f155"}.ion-ios-code-working:before{content:"\f156"}.ion-ios-cog:before{content:"\f412"}.ion-ios-color-fill:before{content:"\f159"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-palette:before{content:"\f15b"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-compass:before{content:"\f15d"}.ion-ios-construct:before{content:"\f15f"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contacts:before{content:"\f161"}.ion-ios-contract:before{content:"\f162"}.ion-ios-contrast:before{content:"\f163"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-create:before{content:"\f165"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-cube:before{content:"\f168"}.ion-ios-cut:before{content:"\f16a"}.ion-ios-desktop:before{content:"\f16c"}.ion-ios-disc:before{content:"\f16e"}.ion-ios-document:before{content:"\f170"}.ion-ios-done-all:before{content:"\f171"}.ion-ios-download:before{content:"\f420"}.ion-ios-easel:before{content:"\f173"}.ion-ios-egg:before{content:"\f175"}.ion-ios-exit:before{content:"\f177"}.ion-ios-expand:before{content:"\f178"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-off:before{content:"\f17a"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-female:before{content:"\f17b"}.ion-ios-filing:before{content:"\f429"}.ion-ios-film:before{content:"\f42b"}.ion-ios-finger-print:before{content:"\f17c"}.ion-ios-fitness:before{content:"\f1ab"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flash:before{content:"\f17e"}.ion-ios-flash-off:before{content:"\f12f"}.ion-ios-flashlight:before{content:"\f141"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flower:before{content:"\f433"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-open:before{content:"\f180"}.ion-ios-football:before{content:"\f437"}.ion-ios-funnel:before{content:"\f182"}.ion-ios-gift:before{content:"\f191"}.ion-ios-git-branch:before{content:"\f183"}.ion-ios-git-commit:before{content:"\f184"}.ion-ios-git-compare:before{content:"\f185"}.ion-ios-git-merge:before{content:"\f186"}.ion-ios-git-network:before{content:"\f187"}.ion-ios-git-pull-request:before{content:"\f188"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-globe:before{content:"\f18a"}.ion-ios-grid:before{content:"\f18c"}.ion-ios-hammer:before{content:"\f18e"}.ion-ios-hand:before{content:"\f190"}.ion-ios-happy:before{content:"\f192"}.ion-ios-headset:before{content:"\f194"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-dislike:before{content:"\f13f"}.ion-ios-heart-empty:before{content:"\f19b"}.ion-ios-heart-half:before{content:"\f19d"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-buoy:before{content:"\f196"}.ion-ios-help-circle:before{content:"\f198"}.ion-ios-help-circle-outline:before{content:"\f197"}.ion-ios-home:before{content:"\f448"}.ion-ios-hourglass:before{content:"\f103"}.ion-ios-ice-cream:before{content:"\f19a"}.ion-ios-image:before{content:"\f19c"}.ion-ios-images:before{content:"\f19e"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-circle:before{content:"\f1a0"}.ion-ios-information-circle-outline:before{content:"\f19f"}.ion-ios-jet:before{content:"\f1a5"}.ion-ios-journal:before{content:"\f189"}.ion-ios-key:before{content:"\f1a7"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-laptop:before{content:"\f1a8"}.ion-ios-leaf:before{content:"\f1aa"}.ion-ios-link:before{content:"\f22a"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-box:before{content:"\f143"}.ion-ios-locate:before{content:"\f1ae"}.ion-ios-lock:before{content:"\f1b0"}.ion-ios-log-in:before{content:"\f1b1"}.ion-ios-log-out:before{content:"\f1b2"}.ion-ios-magnet:before{content:"\f1b4"}.ion-ios-mail:before{content:"\f1b8"}.ion-ios-mail-open:before{content:"\f1b6"}.ion-ios-mail-unread:before{content:"\f145"}.ion-ios-male:before{content:"\f1b9"}.ion-ios-man:before{content:"\f1bb"}.ion-ios-map:before{content:"\f1bd"}.ion-ios-medal:before{content:"\f1bf"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-megaphone:before{content:"\f1c1"}.ion-ios-menu:before{content:"\f1c3"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-microphone:before{content:"\f1c6"}.ion-ios-moon:before{content:"\f468"}.ion-ios-more:before{content:"\f1c8"}.ion-ios-move:before{content:"\f1cb"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-notifications:before{content:"\f1d3"}.ion-ios-notifications-off:before{content:"\f1d1"}.ion-ios-notifications-outline:before{content:"\f133"}.ion-ios-nuclear:before{content:"\f1d5"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-open:before{content:"\f1d7"}.ion-ios-options:before{content:"\f1d9"}.ion-ios-outlet:before{content:"\f1db"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-plane:before{content:"\f1dd"}.ion-ios-partly-sunny:before{content:"\f1df"}.ion-ios-pause:before{content:"\f478"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-people:before{content:"\f47c"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-add:before{content:"\f1e1"}.ion-ios-phone-landscape:before{content:"\f1e2"}.ion-ios-phone-portrait:before{content:"\f1e3"}.ion-ios-photos:before{content:"\f482"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pin:before{content:"\f1e5"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pizza:before{content:"\f1e7"}.ion-ios-planet:before{content:"\f1eb"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-circle:before{content:"\f113"}.ion-ios-podium:before{content:"\f1ed"}.ion-ios-power:before{content:"\f1ef"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-print:before{content:"\f1f1"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-qr-scanner:before{content:"\f1f3"}.ion-ios-quote:before{content:"\f1f5"}.ion-ios-radio:before{content:"\f1f9"}.ion-ios-radio-button-off:before{content:"\f1f6"}.ion-ios-radio-button-on:before{content:"\f1f7"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-recording:before{content:"\f497"}.ion-ios-redo:before{content:"\f499"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-circle:before{content:"\f135"}.ion-ios-remove:before{content:"\f1fc"}.ion-ios-remove-circle:before{content:"\f1fb"}.ion-ios-remove-circle-outline:before{content:"\f1fa"}.ion-ios-reorder:before{content:"\f1fd"}.ion-ios-repeat:before{content:"\f1fe"}.ion-ios-resize:before{content:"\f1ff"}.ion-ios-restaurant:before{content:"\f201"}.ion-ios-return-left:before{content:"\f202"}.ion-ios-return-right:before{content:"\f203"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-ribbon:before{content:"\f205"}.ion-ios-rocket:before{content:"\f14b"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-sad:before{content:"\f207"}.ion-ios-save:before{content:"\f1a6"}.ion-ios-school:before{content:"\f209"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-send:before{content:"\f20c"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-share:before{content:"\f211"}.ion-ios-share-alt:before{content:"\f20f"}.ion-ios-shirt:before{content:"\f213"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-skip-backward:before{content:"\f215"}.ion-ios-skip-forward:before{content:"\f217"}.ion-ios-snow:before{content:"\f218"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-square:before{content:"\f21a"}.ion-ios-square-outline:before{content:"\f15c"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stats:before{content:"\f21c"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-subway:before{content:"\f21e"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-swap:before{content:"\f21f"}.ion-ios-switch:before{content:"\f221"}.ion-ios-sync:before{content:"\f222"}.ion-ios-tablet-landscape:before{content:"\f223"}.ion-ios-tablet-portrait:before{content:"\f24e"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-text:before{content:"\f250"}.ion-ios-thermometer:before{content:"\f252"}.ion-ios-thumbs-down:before{content:"\f254"}.ion-ios-thumbs-up:before{content:"\f256"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-today:before{content:"\f14f"}.ion-ios-train:before{content:"\f258"}.ion-ios-transgender:before{content:"\f259"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trending-down:before{content:"\f25a"}.ion-ios-trending-up:before{content:"\f25b"}.ion-ios-trophy:before{content:"\f25d"}.ion-ios-tv:before{content:"\f115"}.ion-ios-umbrella:before{content:"\f25f"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-unlock:before{content:"\f261"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-volume-high:before{content:"\f11c"}.ion-ios-volume-low:before{content:"\f11e"}.ion-ios-volume-mute:before{content:"\f263"}.ion-ios-volume-off:before{content:"\f264"}.ion-ios-walk:before{content:"\f266"}.ion-ios-wallet:before{content:"\f18b"}.ion-ios-warning:before{content:"\f268"}.ion-ios-watch:before{content:"\f269"}.ion-ios-water:before{content:"\f26b"}.ion-ios-wifi:before{content:"\f26d"}.ion-ios-wine:before{content:"\f26f"}.ion-ios-woman:before{content:"\f271"}.ion-logo-android:before{content:"\f225"}.ion-logo-angular:before{content:"\f227"}.ion-logo-apple:before{content:"\f229"}.ion-logo-bitbucket:before{content:"\f193"}.ion-logo-bitcoin:before{content:"\f22b"}.ion-logo-buffer:before{content:"\f22d"}.ion-logo-chrome:before{content:"\f22f"}.ion-logo-closed-captioning:before{content:"\f105"}.ion-logo-codepen:before{content:"\f230"}.ion-logo-css3:before{content:"\f231"}.ion-logo-designernews:before{content:"\f232"}.ion-logo-dribbble:before{content:"\f233"}.ion-logo-dropbox:before{content:"\f234"}.ion-logo-euro:before{content:"\f235"}.ion-logo-facebook:before{content:"\f236"}.ion-logo-flickr:before{content:"\f107"}.ion-logo-foursquare:before{content:"\f237"}.ion-logo-freebsd-devil:before{content:"\f238"}.ion-logo-game-controller-a:before{content:"\f13b"}.ion-logo-game-controller-b:before{content:"\f181"}.ion-logo-github:before{content:"\f239"}.ion-logo-google:before{content:"\f23a"}.ion-logo-googleplus:before{content:"\f23b"}.ion-logo-hackernews:before{content:"\f23c"}.ion-logo-html5:before{content:"\f23d"}.ion-logo-instagram:before{content:"\f23e"}.ion-logo-ionic:before{content:"\f150"}.ion-logo-ionitron:before{content:"\f151"}.ion-logo-javascript:before{content:"\f23f"}.ion-logo-linkedin:before{content:"\f240"}.ion-logo-markdown:before{content:"\f241"}.ion-logo-model-s:before{content:"\f153"}.ion-logo-no-smoking:before{content:"\f109"}.ion-logo-nodejs:before{content:"\f242"}.ion-logo-npm:before{content:"\f195"}.ion-logo-octocat:before{content:"\f243"}.ion-logo-pinterest:before{content:"\f244"}.ion-logo-playstation:before{content:"\f245"}.ion-logo-polymer:before{content:"\f15e"}.ion-logo-python:before{content:"\f246"}.ion-logo-reddit:before{content:"\f247"}.ion-logo-rss:before{content:"\f248"}.ion-logo-sass:before{content:"\f249"}.ion-logo-skype:before{content:"\f24a"}.ion-logo-slack:before{content:"\f10b"}.ion-logo-snapchat:before{content:"\f24b"}.ion-logo-steam:before{content:"\f24c"}.ion-logo-tumblr:before{content:"\f24d"}.ion-logo-tux:before{content:"\f2ae"}.ion-logo-twitch:before{content:"\f2af"}.ion-logo-twitter:before{content:"\f2b0"}.ion-logo-usd:before{content:"\f2b1"}.ion-logo-vimeo:before{content:"\f2c4"}.ion-logo-vk:before{content:"\f10d"}.ion-logo-whatsapp:before{content:"\f2c5"}.ion-logo-windows:before{content:"\f32f"}.ion-logo-wordpress:before{content:"\f330"}.ion-logo-xbox:before{content:"\f34c"}.ion-logo-xing:before{content:"\f10f"}.ion-logo-yahoo:before{content:"\f34d"}.ion-logo-yen:before{content:"\f34e"}.ion-logo-youtube:before{content:"\f34f"}.ion-md-add:before{content:"\f273"}.ion-md-add-circle:before{content:"\f272"}.ion-md-add-circle-outline:before{content:"\f158"}.ion-md-airplane:before{content:"\f15a"}.ion-md-alarm:before{content:"\f274"}.ion-md-albums:before{content:"\f275"}.ion-md-alert:before{content:"\f276"}.ion-md-american-football:before{content:"\f277"}.ion-md-analytics:before{content:"\f278"}.ion-md-aperture:before{content:"\f279"}.ion-md-apps:before{content:"\f27a"}.ion-md-appstore:before{content:"\f27b"}.ion-md-archive:before{content:"\f27c"}.ion-md-arrow-back:before{content:"\f27d"}.ion-md-arrow-down:before{content:"\f27e"}.ion-md-arrow-dropdown:before{content:"\f280"}.ion-md-arrow-dropdown-circle:before{content:"\f27f"}.ion-md-arrow-dropleft:before{content:"\f282"}.ion-md-arrow-dropleft-circle:before{content:"\f281"}.ion-md-arrow-dropright:before{content:"\f284"}.ion-md-arrow-dropright-circle:before{content:"\f283"}.ion-md-arrow-dropup:before{content:"\f286"}.ion-md-arrow-dropup-circle:before{content:"\f285"}.ion-md-arrow-forward:before{content:"\f287"}.ion-md-arrow-round-back:before{content:"\f288"}.ion-md-arrow-round-down:before{content:"\f289"}.ion-md-arrow-round-forward:before{content:"\f28a"}.ion-md-arrow-round-up:before{content:"\f28b"}.ion-md-arrow-up:before{content:"\f28c"}.ion-md-at:before{content:"\f28d"}.ion-md-attach:before{content:"\f28e"}.ion-md-backspace:before{content:"\f28f"}.ion-md-barcode:before{content:"\f290"}.ion-md-baseball:before{content:"\f291"}.ion-md-basket:before{content:"\f292"}.ion-md-basketball:before{content:"\f293"}.ion-md-battery-charging:before{content:"\f294"}.ion-md-battery-dead:before{content:"\f295"}.ion-md-battery-full:before{content:"\f296"}.ion-md-beaker:before{content:"\f297"}.ion-md-bed:before{content:"\f160"}.ion-md-beer:before{content:"\f298"}.ion-md-bicycle:before{content:"\f299"}.ion-md-bluetooth:before{content:"\f29a"}.ion-md-boat:before{content:"\f29b"}.ion-md-body:before{content:"\f29c"}.ion-md-bonfire:before{content:"\f29d"}.ion-md-book:before{content:"\f29e"}.ion-md-bookmark:before{content:"\f29f"}.ion-md-bookmarks:before{content:"\f2a0"}.ion-md-bowtie:before{content:"\f2a1"}.ion-md-briefcase:before{content:"\f2a2"}.ion-md-browsers:before{content:"\f2a3"}.ion-md-brush:before{content:"\f2a4"}.ion-md-bug:before{content:"\f2a5"}.ion-md-build:before{content:"\f2a6"}.ion-md-bulb:before{content:"\f2a7"}.ion-md-bus:before{content:"\f2a8"}.ion-md-business:before{content:"\f1a4"}.ion-md-cafe:before{content:"\f2a9"}.ion-md-calculator:before{content:"\f2aa"}.ion-md-calendar:before{content:"\f2ab"}.ion-md-call:before{content:"\f2ac"}.ion-md-camera:before{content:"\f2ad"}.ion-md-car:before{content:"\f2b2"}.ion-md-card:before{content:"\f2b3"}.ion-md-cart:before{content:"\f2b4"}.ion-md-cash:before{content:"\f2b5"}.ion-md-cellular:before{content:"\f164"}.ion-md-chatboxes:before{content:"\f2b6"}.ion-md-chatbubbles:before{content:"\f2b7"}.ion-md-checkbox:before{content:"\f2b9"}.ion-md-checkbox-outline:before{content:"\f2b8"}.ion-md-checkmark:before{content:"\f2bc"}.ion-md-checkmark-circle:before{content:"\f2bb"}.ion-md-checkmark-circle-outline:before{content:"\f2ba"}.ion-md-clipboard:before{content:"\f2bd"}.ion-md-clock:before{content:"\f2be"}.ion-md-close:before{content:"\f2c0"}.ion-md-close-circle:before{content:"\f2bf"}.ion-md-close-circle-outline:before{content:"\f166"}.ion-md-cloud:before{content:"\f2c9"}.ion-md-cloud-circle:before{content:"\f2c2"}.ion-md-cloud-done:before{content:"\f2c3"}.ion-md-cloud-download:before{content:"\f2c6"}.ion-md-cloud-outline:before{content:"\f2c7"}.ion-md-cloud-upload:before{content:"\f2c8"}.ion-md-cloudy:before{content:"\f2cb"}.ion-md-cloudy-night:before{content:"\f2ca"}.ion-md-code:before{content:"\f2ce"}.ion-md-code-download:before{content:"\f2cc"}.ion-md-code-working:before{content:"\f2cd"}.ion-md-cog:before{content:"\f2cf"}.ion-md-color-fill:before{content:"\f2d0"}.ion-md-color-filter:before{content:"\f2d1"}.ion-md-color-palette:before{content:"\f2d2"}.ion-md-color-wand:before{content:"\f2d3"}.ion-md-compass:before{content:"\f2d4"}.ion-md-construct:before{content:"\f2d5"}.ion-md-contact:before{content:"\f2d6"}.ion-md-contacts:before{content:"\f2d7"}.ion-md-contract:before{content:"\f2d8"}.ion-md-contrast:before{content:"\f2d9"}.ion-md-copy:before{content:"\f2da"}.ion-md-create:before{content:"\f2db"}.ion-md-crop:before{content:"\f2dc"}.ion-md-cube:before{content:"\f2dd"}.ion-md-cut:before{content:"\f2de"}.ion-md-desktop:before{content:"\f2df"}.ion-md-disc:before{content:"\f2e0"}.ion-md-document:before{content:"\f2e1"}.ion-md-done-all:before{content:"\f2e2"}.ion-md-download:before{content:"\f2e3"}.ion-md-easel:before{content:"\f2e4"}.ion-md-egg:before{content:"\f2e5"}.ion-md-exit:before{content:"\f2e6"}.ion-md-expand:before{content:"\f2e7"}.ion-md-eye:before{content:"\f2e9"}.ion-md-eye-off:before{content:"\f2e8"}.ion-md-fastforward:before{content:"\f2ea"}.ion-md-female:before{content:"\f2eb"}.ion-md-filing:before{content:"\f2ec"}.ion-md-film:before{content:"\f2ed"}.ion-md-finger-print:before{content:"\f2ee"}.ion-md-fitness:before{content:"\f1ac"}.ion-md-flag:before{content:"\f2ef"}.ion-md-flame:before{content:"\f2f0"}.ion-md-flash:before{content:"\f2f1"}.ion-md-flash-off:before{content:"\f169"}.ion-md-flashlight:before{content:"\f16b"}.ion-md-flask:before{content:"\f2f2"}.ion-md-flower:before{content:"\f2f3"}.ion-md-folder:before{content:"\f2f5"}.ion-md-folder-open:before{content:"\f2f4"}.ion-md-football:before{content:"\f2f6"}.ion-md-funnel:before{content:"\f2f7"}.ion-md-gift:before{content:"\f199"}.ion-md-git-branch:before{content:"\f2fa"}.ion-md-git-commit:before{content:"\f2fb"}.ion-md-git-compare:before{content:"\f2fc"}.ion-md-git-merge:before{content:"\f2fd"}.ion-md-git-network:before{content:"\f2fe"}.ion-md-git-pull-request:before{content:"\f2ff"}.ion-md-glasses:before{content:"\f300"}.ion-md-globe:before{content:"\f301"}.ion-md-grid:before{content:"\f302"}.ion-md-hammer:before{content:"\f303"}.ion-md-hand:before{content:"\f304"}.ion-md-happy:before{content:"\f305"}.ion-md-headset:before{content:"\f306"}.ion-md-heart:before{content:"\f308"}.ion-md-heart-dislike:before{content:"\f167"}.ion-md-heart-empty:before{content:"\f1a1"}.ion-md-heart-half:before{content:"\f1a2"}.ion-md-help:before{content:"\f30b"}.ion-md-help-buoy:before{content:"\f309"}.ion-md-help-circle:before{content:"\f30a"}.ion-md-help-circle-outline:before{content:"\f16d"}.ion-md-home:before{content:"\f30c"}.ion-md-hourglass:before{content:"\f111"}.ion-md-ice-cream:before{content:"\f30d"}.ion-md-image:before{content:"\f30e"}.ion-md-images:before{content:"\f30f"}.ion-md-infinite:before{content:"\f310"}.ion-md-information:before{content:"\f312"}.ion-md-information-circle:before{content:"\f311"}.ion-md-information-circle-outline:before{content:"\f16f"}.ion-md-jet:before{content:"\f315"}.ion-md-journal:before{content:"\f18d"}.ion-md-key:before{content:"\f316"}.ion-md-keypad:before{content:"\f317"}.ion-md-laptop:before{content:"\f318"}.ion-md-leaf:before{content:"\f319"}.ion-md-link:before{content:"\f22e"}.ion-md-list:before{content:"\f31b"}.ion-md-list-box:before{content:"\f31a"}.ion-md-locate:before{content:"\f31c"}.ion-md-lock:before{content:"\f31d"}.ion-md-log-in:before{content:"\f31e"}.ion-md-log-out:before{content:"\f31f"}.ion-md-magnet:before{content:"\f320"}.ion-md-mail:before{content:"\f322"}.ion-md-mail-open:before{content:"\f321"}.ion-md-mail-unread:before{content:"\f172"}.ion-md-male:before{content:"\f323"}.ion-md-man:before{content:"\f324"}.ion-md-map:before{content:"\f325"}.ion-md-medal:before{content:"\f326"}.ion-md-medical:before{content:"\f327"}.ion-md-medkit:before{content:"\f328"}.ion-md-megaphone:before{content:"\f329"}.ion-md-menu:before{content:"\f32a"}.ion-md-mic:before{content:"\f32c"}.ion-md-mic-off:before{content:"\f32b"}.ion-md-microphone:before{content:"\f32d"}.ion-md-moon:before{content:"\f32e"}.ion-md-more:before{content:"\f1c9"}.ion-md-move:before{content:"\f331"}.ion-md-musical-note:before{content:"\f332"}.ion-md-musical-notes:before{content:"\f333"}.ion-md-navigate:before{content:"\f334"}.ion-md-notifications:before{content:"\f338"}.ion-md-notifications-off:before{content:"\f336"}.ion-md-notifications-outline:before{content:"\f337"}.ion-md-nuclear:before{content:"\f339"}.ion-md-nutrition:before{content:"\f33a"}.ion-md-open:before{content:"\f33b"}.ion-md-options:before{content:"\f33c"}.ion-md-outlet:before{content:"\f33d"}.ion-md-paper:before{content:"\f33f"}.ion-md-paper-plane:before{content:"\f33e"}.ion-md-partly-sunny:before{content:"\f340"}.ion-md-pause:before{content:"\f341"}.ion-md-paw:before{content:"\f342"}.ion-md-people:before{content:"\f343"}.ion-md-person:before{content:"\f345"}.ion-md-person-add:before{content:"\f344"}.ion-md-phone-landscape:before{content:"\f346"}.ion-md-phone-portrait:before{content:"\f347"}.ion-md-photos:before{content:"\f348"}.ion-md-pie:before{content:"\f349"}.ion-md-pin:before{content:"\f34a"}.ion-md-pint:before{content:"\f34b"}.ion-md-pizza:before{content:"\f354"}.ion-md-planet:before{content:"\f356"}.ion-md-play:before{content:"\f357"}.ion-md-play-circle:before{content:"\f174"}.ion-md-podium:before{content:"\f358"}.ion-md-power:before{content:"\f359"}.ion-md-pricetag:before{content:"\f35a"}.ion-md-pricetags:before{content:"\f35b"}.ion-md-print:before{content:"\f35c"}.ion-md-pulse:before{content:"\f35d"}.ion-md-qr-scanner:before{content:"\f35e"}.ion-md-quote:before{content:"\f35f"}.ion-md-radio:before{content:"\f362"}.ion-md-radio-button-off:before{content:"\f360"}.ion-md-radio-button-on:before{content:"\f361"}.ion-md-rainy:before{content:"\f363"}.ion-md-recording:before{content:"\f364"}.ion-md-redo:before{content:"\f365"}.ion-md-refresh:before{content:"\f366"}.ion-md-refresh-circle:before{content:"\f228"}.ion-md-remove:before{content:"\f368"}.ion-md-remove-circle:before{content:"\f367"}.ion-md-remove-circle-outline:before{content:"\f176"}.ion-md-reorder:before{content:"\f369"}.ion-md-repeat:before{content:"\f36a"}.ion-md-resize:before{content:"\f36b"}.ion-md-restaurant:before{content:"\f36c"}.ion-md-return-left:before{content:"\f36d"}.ion-md-return-right:before{content:"\f36e"}.ion-md-reverse-camera:before{content:"\f36f"}.ion-md-rewind:before{content:"\f370"}.ion-md-ribbon:before{content:"\f371"}.ion-md-rocket:before{content:"\f179"}.ion-md-rose:before{content:"\f372"}.ion-md-sad:before{content:"\f373"}.ion-md-save:before{content:"\f1a9"}.ion-md-school:before{content:"\f374"}.ion-md-search:before{content:"\f375"}.ion-md-send:before{content:"\f376"}.ion-md-settings:before{content:"\f377"}.ion-md-share:before{content:"\f379"}.ion-md-share-alt:before{content:"\f378"}.ion-md-shirt:before{content:"\f37a"}.ion-md-shuffle:before{content:"\f37b"}.ion-md-skip-backward:before{content:"\f37c"}.ion-md-skip-forward:before{content:"\f37d"}.ion-md-snow:before{content:"\f37e"}.ion-md-speedometer:before{content:"\f37f"}.ion-md-square:before{content:"\f381"}.ion-md-square-outline:before{content:"\f380"}.ion-md-star:before{content:"\f384"}.ion-md-star-half:before{content:"\f382"}.ion-md-star-outline:before{content:"\f383"}.ion-md-stats:before{content:"\f385"}.ion-md-stopwatch:before{content:"\f386"}.ion-md-subway:before{content:"\f387"}.ion-md-sunny:before{content:"\f388"}.ion-md-swap:before{content:"\f389"}.ion-md-switch:before{content:"\f38a"}.ion-md-sync:before{content:"\f38b"}.ion-md-tablet-landscape:before{content:"\f38c"}.ion-md-tablet-portrait:before{content:"\f38d"}.ion-md-tennisball:before{content:"\f38e"}.ion-md-text:before{content:"\f38f"}.ion-md-thermometer:before{content:"\f390"}.ion-md-thumbs-down:before{content:"\f391"}.ion-md-thumbs-up:before{content:"\f392"}.ion-md-thunderstorm:before{content:"\f393"}.ion-md-time:before{content:"\f394"}.ion-md-timer:before{content:"\f395"}.ion-md-today:before{content:"\f17d"}.ion-md-train:before{content:"\f396"}.ion-md-transgender:before{content:"\f397"}.ion-md-trash:before{content:"\f398"}.ion-md-trending-down:before{content:"\f399"}.ion-md-trending-up:before{content:"\f39a"}.ion-md-trophy:before{content:"\f39b"}.ion-md-tv:before{content:"\f17f"}.ion-md-umbrella:before{content:"\f39c"}.ion-md-undo:before{content:"\f39d"}.ion-md-unlock:before{content:"\f39e"}.ion-md-videocam:before{content:"\f39f"}.ion-md-volume-high:before{content:"\f123"}.ion-md-volume-low:before{content:"\f131"}.ion-md-volume-mute:before{content:"\f3a1"}.ion-md-volume-off:before{content:"\f3a2"}.ion-md-walk:before{content:"\f3a4"}.ion-md-wallet:before{content:"\f18f"}.ion-md-warning:before{content:"\f3a5"}.ion-md-watch:before{content:"\f3a6"}.ion-md-water:before{content:"\f3a7"}.ion-md-wifi:before{content:"\f3a8"}.ion-md-wine:before{content:"\f3a9"}.ion-md-woman:before{content:"\f3aa"} \ No newline at end of file diff --git a/pages/common/notice-bar/index.js b/pages/common/notice-bar/index.js new file mode 100644 index 0000000..f1c5f11 --- /dev/null +++ b/pages/common/notice-bar/index.js @@ -0,0 +1,156 @@ +import baseComponent from '../helpers/baseComponent' +import classNames from '../helpers/classNames' + +const notice = 'data:image/png;base64,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' +const close = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAEAYAAAD6+a2dAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAyFJREFUeNrt3D9oE1EcB/D3ri2JdSp1kEKlhHTRyVGkuHSQRIQsLaXo0KHkD3RSRMWpk+iikKR06KBIbaEExASHbkV0c1GXSmgKFoeWIkJtUrnn0t8NKeHSNO/u/fl+tpKD/N7v9+1dyLscYwAAAAAAAAAAAAAAYDIu+w0OH2TSo2/Gx9kiHxCLS0veGw+JCX4rk4l8K17dvF8uh92IsNSvZL6MPksmxQ5fFe+LRe+FWbHPZ2dmok+LC5vT6+uy3l9+AAayD+M3trfFDvvNfg4Pey98ZxfEu6MjUeEHYm9ysv9J/nl1rFSSXY8qDuZz92IbqRRPiH4+uLLCLrNdfruvzzsgyqpsrlY7xwsffsyNjMiqwwmtA8cLpgZQQ0KrJyC+g/cOZI9ErxCy65EeADrV03/8iQMsCULbgz/uk3OJPxZOLie7LukBoGu8c1eknHIqxT6yX+xfvX7iQEODQNd4fk1UnTvLy36Dp0tiZC+/UU1XKrLrk/4ZoFVD3Bd8XuTX1th1dpH1RiJ+DdHtM4Iu6ww8ALo1yPR1hRYAXRtm2jpCDwDRtYG61k2UCQDRpaG61OlHuQAQVRusal2dUjYARJWGq1JHtykfABLWAEwdPNEmACSogZg+eKJdAIisAdkyeKJtAEi3Bmbb4In2ASCdDrDnrTvd87nRsG3wxJgAkNPuunl/t7lJY8rgiXEBIG2fEVoxfPAkvBtCJKNtaPGJx9zXU1Mt70doZsngibEBIHSNZ/vsK0+4btj1qAaXgFYsORMYFwB8CDwdYy4Bnd56ZeutakT7MwC+CDobbQOAr4K7Q7sAYDOou7QJALaD5VA+AKoMQJU6uk3ZAKjacFXr6pRyAdClwbrU6UeZAOjaUF3rJqEHQPcG6r4O/DTM8nXhx6GWrzOwAOjSENvWLX0zyGvAK15yk6WSag2Qre0bU5o2neqDubHYQiIhuz7pAfAefmTpdiuhddE6/YLg7orzTqNQkF1XeNvBlgy+WdtBCOgZQdLRY+IOo9k/8XSt9ldkb8Zfbm0FdYpTHfWhuT/e4/UAAAAAAAAAAAAAAADO4D9cvzD+Ik3LBAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yOFQyMjo1MjoyMiswODowMMq1zi4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjhUMjI6NTI6MjIrMDg6MDC76HaSAAAASHRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl83NW1saHp1bGx3NS9jbG9zZS5zdmcxNhK3AAAAAElFTkSuQmCC' + +baseComponent({ + properties: { + prefixCls: { + type: String, + value: 'wux-notice-bar', + }, + icon: { + type: String, + value: notice, + }, + content: { + type: String, + value: '', + }, + mode: { + type: String, + value: '', + }, + action: { + type: String, + value: close, + }, + loop: { + type: Boolean, + value: false, + }, + leading: { + type: Number, + value: 500, + }, + trailing: { + type: Number, + value: 800, + }, + speed: { + type: Number, + value: 25, + }, + }, + data: { + animatedWidth: 0, + overflowWidth: 0, + visible: true, + }, + computed: { + classes() { + const { prefixCls } = this.data + const wrap = classNames(prefixCls) + const hd = `${prefixCls}__hd` + const icon = `${prefixCls}__icon` + const bd = `${prefixCls}__bd` + const container = `${prefixCls}__marquee-container` + const marquee = `${prefixCls}__marquee` + const ft = `${prefixCls}__ft` + const action = `${prefixCls}__action` + + return { + wrap, + hd, + icon, + bd, + container, + marquee, + ft, + action, + } + }, + }, + methods: { + clearMarqueeTimer() { + if (this.marqueeTimer) { + clearTimeout(this.marqueeTimer) + this.marqueeTimer = null + } + }, + startAnimation() { + this.clearMarqueeTimer() + const { overflowWidth, loop, leading, trailing, speed } = this.data + const isLeading = this.data.animatedWidth === 0 + const timeout = isLeading ? leading : speed + const animate = () => { + let animatedWidth = this.data.animatedWidth + 1 + const isRoundOver = animatedWidth > overflowWidth + + // 判断是否完成一次滚动 + if (isRoundOver) { + if (!loop) { + return false + } + // 重置初始位置 + animatedWidth = 0 + } + + // 判断是否等待一段时间后进行下一次滚动 + if (isRoundOver && trailing) { + setTimeout(() => { + this.setData({ + animatedWidth, + }) + + this.marqueeTimer = setTimeout(animate, speed) + }, trailing) + } else { + this.setData({ + animatedWidth, + }) + this.marqueeTimer = setTimeout(animate, speed) + } + } + + if (this.data.overflowWidth !== 0) { + this.marqueeTimer = setTimeout(animate, timeout) + } + }, + initAnimation() { + const { prefixCls } = this.data + const query = wx.createSelectorQuery().in(this) + query.select(`.${prefixCls}__marquee-container`).boundingClientRect() + query.select(`.${prefixCls}__marquee`).boundingClientRect() + query.exec((rects) => { + if (rects.filter((n) => !n).length) return + + const [container, text] = rects + const overflowWidth = text.width - container.width + + if (overflowWidth !== this.data.overflowWidth) { + this.setData({ overflowWidth }, this.startAnimation) + } + }) + }, + onAction() { + if (this.data.mode === 'closable') { + this.clearMarqueeTimer() + this.setData({ + visible: false + }) + } + this.triggerEvent('click') + }, + onClick() { + this.triggerEvent('click') + }, + }, + ready() { + this.initAnimation() + }, + detached() { + this.clearMarqueeTimer() + }, +}) diff --git a/pages/common/notice-bar/index.json b/pages/common/notice-bar/index.json new file mode 100644 index 0000000..fba482a --- /dev/null +++ b/pages/common/notice-bar/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/pages/common/notice-bar/index.wxml b/pages/common/notice-bar/index.wxml new file mode 100644 index 0000000..b3bff65 --- /dev/null +++ b/pages/common/notice-bar/index.wxml @@ -0,0 +1,22 @@ + + + + + + + + + + + {{ content }} + + + + + + + + + + + \ No newline at end of file diff --git a/pages/common/notice-bar/index.wxss b/pages/common/notice-bar/index.wxss new file mode 100644 index 0000000..ad1e981 --- /dev/null +++ b/pages/common/notice-bar/index.wxss @@ -0,0 +1,51 @@ +.wux-notice-bar { + background-color: #fefcec; + height: 72rpx; + overflow: hidden; + font-size: 28rpx; + line-height: 72rpx; + color: #f76a24; + display: -ms-flexbox; + display: flex; + padding: 0 20rpx +} +.wux-notice-bar__icon { + width: 30rpx; + height: 30rpx; + margin-right: 20rpx +} +.wux-notice-bar__action { + width: 30rpx; + height: 30rpx; + margin-left: 20rpx +} +.wux-notice-bar__hd { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center +} +.wux-notice-bar__bd { + -ms-flex: 1; + flex: 1; + width: 100%; + width: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} +.wux-notice-bar__marquee-container { + overflow: hidden +} +.wux-notice-bar__marquee { + position: relative; + transform: translate3d(0,0,0); + white-space: nowrap; + display: inline-block +} +.wux-notice-bar__ft { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center +} \ No newline at end of file diff --git a/pages/common/step/index.js b/pages/common/step/index.js new file mode 100644 index 0000000..194d888 --- /dev/null +++ b/pages/common/step/index.js @@ -0,0 +1,60 @@ +const defaultStatus = ['wait', 'process', 'finish', 'error'] +const defaultIcon = 'ios-checkmark' + +Component({ + externalClasses: ['wux-class'], + options: { + multipleSlots: true, + }, + relations: { + '../steps/index': { + type: 'parent', + }, + }, + properties: { + status: { + type: String, + value: '', + }, + title: { + type: String, + value: '', + }, + content: { + type: String, + value: '', + }, + icon: { + type: String, + value: '', + }, + }, + data: { + width: '100%', + length: 1, + index: 0, + current: 0, + direction: 'horizontal', + }, + methods: { + updateCurrent(opts = {}) { + const width = opts.direction === 'horizontal' ? 100 / opts.length + '%' : '100%' + const index = defaultStatus.indexOf(this.data.status) + const hasIcon = opts.index < opts.current || this.data.icon + const thumb = this.data.icon || defaultIcon + const suffix = index !== -1 ? defaultStatus[index] : opts.index < opts.current ? 'finish' : opts.index === opts.current ? 'process' : '' + const className = `wux-step--${suffix}` + const options = Object.assign({ + width, + className, + hasIcon, + thumb, + }, opts) + + this.setData(options) + }, + }, + attached() { + this.updateCurrent(this.data) + }, +}) \ No newline at end of file diff --git a/pages/common/step/index.json b/pages/common/step/index.json new file mode 100644 index 0000000..6505d1c --- /dev/null +++ b/pages/common/step/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "wux-icon": "../icon/index" + } +} \ No newline at end of file diff --git a/pages/common/step/index.wxml b/pages/common/step/index.wxml new file mode 100644 index 0000000..79f5c33 --- /dev/null +++ b/pages/common/step/index.wxml @@ -0,0 +1,23 @@ + + + {{ index + 1 }} + + + + + + + {{ title }} + + + + + + {{ content }} + + + + + + + \ No newline at end of file diff --git a/pages/common/step/index.wxss b/pages/common/step/index.wxss new file mode 100644 index 0000000..1a4f95e --- /dev/null +++ b/pages/common/step/index.wxss @@ -0,0 +1 @@ +.wux-step{font-size:0;position:relative;display:inline-block;box-sizing:border-box;padding:0 10rpx;vertical-align:top}.wux-step--vertical{padding-bottom:35rpx}.wux-step--vertical .wux-step__hd{float:left}.wux-step--vertical .wux-step__bd{overflow:hidden;display:block;margin-left:80rpx;margin-top:0;text-align:left;clear:inherit}.wux-step--vertical .wux-step__ft{position:absolute;left:38rpx;top:0;height:100%;width:2rpx;padding:60rpx 0 8rpx;margin-left:0}.wux-step--vertical .wux-step__ft:after{width:2rpx;height:100%}.wux-step__ft{position:absolute;left:50%;width:100%;top:24rpx;padding:0 48rpx;margin-left:6rpx;box-sizing:border-box}.wux-step__ft:after{content:"";display:inline-block;background:#ddd;height:2rpx;border-radius:2rpx;width:100%;transition:background .3s;position:relative;left:-4rpx}.wux-step__icon{box-sizing:border-box;font-size:24rpx;width:48rpx;height:100%;border-radius:50%;background:#fff;position:relative;z-index:2;margin:0 auto;border:#e9eaec solid 2rpx}.wux-step__thumb{width:100%;height:100%;display:inline-block;overflow:hidden}.wux-step--process .wux-step__icon{border:#387ef5 solid 2rpx;color:#fff;background:#387ef5}.wux-step--wait .wux-step__icon{border:#e9eaec solid 2rpx;color:#e9eaec}.wux-step--wait .wux-step__ft:after{background:#387ef5}.wux-step--finish .wux-step__icon{border:#387ef5 solid 2rpx;color:#387ef5}.wux-step--finish .wux-step__ft:after{background:#387ef5}.wux-step--error .wux-step__icon{border:#ef473a solid 2rpx;color:#ef473a}.wux-step--error .wux-step__ft:after{background:#ef473a}.wux-step__hd{width:auto;height:48rpx;line-height:48rpx;text-align:center;box-sizing:border-box}.wux-step__bd{margin-top:20rpx;text-align:center;clear:both}.wux-step__title{font-size:32rpx;color:#000}.wux-step__content{font-size:24rpx;margin-top:6rpx;color:#b2b2b2} \ No newline at end of file diff --git a/pages/common/steps/index.js b/pages/common/steps/index.js new file mode 100644 index 0000000..7d53b00 --- /dev/null +++ b/pages/common/steps/index.js @@ -0,0 +1,49 @@ +Component({ + externalClasses: ['wux-class'], + properties: { + current: { + type: Number, + value: 0, + observer: 'updateCurrent', + }, + // status: { + // type: String, + // value: '', + // }, + direction: { + type: String, + value: 'horizontal', + } + }, + relations: { + '../step/index': { + type: 'child', + linked() { + this.updateCurrent() + }, + linkChanged() { + this.updateCurrent() + }, + unlinked() { + this.updateCurrent() + }, + }, + }, + methods: { + updateCurrent() { + const elements = this.getRelationNodes('../step/index') + const { current, direction } = this.data + + if (elements.length > 0) { + elements.forEach((element, index) => { + element.updateCurrent({ + length: elements.length, + index, + current, + direction, + }) + }) + } + } + } +}) \ No newline at end of file diff --git a/pages/common/steps/index.json b/pages/common/steps/index.json new file mode 100644 index 0000000..fba482a --- /dev/null +++ b/pages/common/steps/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/pages/common/steps/index.wxml b/pages/common/steps/index.wxml new file mode 100644 index 0000000..0218423 --- /dev/null +++ b/pages/common/steps/index.wxml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/pages/common/steps/index.wxss b/pages/common/steps/index.wxss new file mode 100644 index 0000000..49cac11 --- /dev/null +++ b/pages/common/steps/index.wxss @@ -0,0 +1 @@ +.wux-steps{position:relative;width:100%} \ No newline at end of file diff --git a/pages/common/weui.wxss b/pages/common/weui.wxss new file mode 100644 index 0000000..094073c --- /dev/null +++ b/pages/common/weui.wxss @@ -0,0 +1,1043 @@ +/*! + * weui.js v1.1.0 (https://github.com/weui/weui-wxss) + * Copyright 2016, wechat ui team + * MIT license + */ +page { + line-height: 1.6; + font-family: -apple-system-font, "Helvetica Neue", sans-serif; +} +icon { + vertical-align: middle; +} +.weui-cells { + position: relative; + margin-top: 1.17647059em; + background-color: #FFFFFF; + line-height: 1.41176471; + font-size: 17px; +} +.weui-cells:before { + content: " "; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 1px; + border-top: 1rpx solid #D9D9D9; + color: #D9D9D9; +} +.weui-cells:after { + content: " "; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + border-bottom: 1rpx solid #D9D9D9; + color: #D9D9D9; +} +.weui-cells__title { + margin-top: .77em; + margin-bottom: .3em; + padding-left: 15px; + padding-right: 15px; + color: #999999; + font-size: 14px; +} +.weui-cells_after-title { + margin-top: 0; +} +.weui-cells__tips { + margin-top: .3em; + color: #999999; + padding-left: 15px; + padding-right: 15px; + font-size: 14px; +} +.weui-cell { + padding: 10px 15px; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.weui-cell:before { + content: " "; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 1px; + border-top: 1rpx solid #D9D9D9; + color: #D9D9D9; + left: 15px; +} +.weui-cell:first-child:before { + display: none; +} +.weui-cell_active { + background-color: #ECECEC; +} +.weui-cell_primary { + -webkit-box-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; +} +.weui-cell__bd { + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; +} +.weui-cell__ft { + text-align: right; + color: #999999; +} +.weui-cell_access { + color: inherit; +} +.weui-cell__ft_in-access { + padding-right: 13px; + position: relative; +} +.weui-cell__ft_in-access:after { + content: " "; + display: inline-block; + height: 6px; + width: 6px; + border-width: 2px 2px 0 0; + border-color: #C8C8CD; + border-style: solid; + -webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + position: relative; + top: -2px; + position: absolute; + top: 50%; + margin-top: -4px; + right: 2px; +} +.weui-cell_link { + color: #586C94; + font-size: 14px; +} +.weui-cell_link:active { + background-color: #ECECEC; +} +.weui-cell_link:first-child:before { + display: block; +} +.weui-icon-radio { + margin-left: 3.2px; + margin-right: 3.2px; +} +.weui-icon-checkbox_circle, +.weui-icon-checkbox_success { + margin-left: 4.6px; + margin-right: 4.6px; +} +.weui-check__label:active { + background-color: #ECECEC; +} +.weui-check { + position: absolute; + left: -9999px; +} +.weui-check__hd_in-checkbox { + padding-right: 0.35em; +} +.weui-cell__ft_in-radio { + padding-left: 0.35em; +} +.weui-cell_input { + padding-top: 0; + padding-bottom: 0; +} +.weui-label { + width: 105px; + word-wrap: break-word; + word-break: break-all; +} +.weui-input { + height: 2.58823529em; + min-height: 2.58823529em; + line-height: 2.58823529em; +} +.weui-toptips { + position: fixed; + -webkit-transform: translateZ(0); + transform: translateZ(0); + top: 0; + left: 0; + right: 0; + padding: 5px; + font-size: 14px; + text-align: center; + color: #FFFFFF; + z-index: 5000; + word-wrap: break-word; + word-break: break-all; +} +.weui-toptips_warn { + background-color: #E64340; +} +.weui-textarea { + display: block; + width: 100%; +} +.weui-textarea-counter { + color: #B2B2B2; + text-align: right; +} +.weui-textarea-counter_warn { + color: #E64340; +} +.weui-cell_warn { + color: #E64340; +} +.weui-form-preview { + position: relative; + background-color: #FFFFFF; +} +.weui-form-preview:before { + content: " "; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 1px; + border-top: 1rpx solid #D9D9D9; + color: #D9D9D9; +} +.weui-form-preview:after { + content: " "; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + border-bottom: 1rpx solid #D9D9D9; + color: #D9D9D9; +} +.weui-form-preview__value { + font-size: 14px; +} +.weui-form-preview__value_in-hd { + font-size: 26px; +} +.weui-form-preview__hd { + position: relative; + padding: 10px 15px; + text-align: right; + line-height: 2.5em; +} +.weui-form-preview__hd:after { + content: " "; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + border-bottom: 1rpx solid #D9D9D9; + color: #D9D9D9; + left: 15px; +} +.weui-form-preview__bd { + padding: 10px 15px; + font-size: .9em; + text-align: right; + color: #999999; + line-height: 2; +} +.weui-form-preview__ft { + position: relative; + line-height: 50px; + display: -webkit-box; + display: -webkit-flex; + display: flex; +} +.weui-form-preview__ft:after { + content: " "; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 1px; + border-top: 1rpx solid #D5D5D6; + color: #D5D5D6; +} +.weui-form-preview__item { + overflow: hidden; +} +.weui-form-preview__label { + float: left; + margin-right: 1em; + min-width: 4em; + color: #000; + text-align: justify; + text-align-last: justify; +} +.weui-form-preview__value { + color: #000; + display: block; + overflow: hidden; + word-break: normal; + word-wrap: break-word; +} +.weui-form-preview__btn { + position: relative; + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; + color: #3CC51F; + text-align: center; +} +.weui-form-preview__btn:after { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 1px; + bottom: 0; + border-left: 1rpx solid #D5D5D6; + color: #D5D5D6; +} +.weui-form-preview__btn:first-child:after { + display: none; +} +.weui-form-preview__btn_active { + background-color: #EEEEEE; +} +.weui-form-preview__btn_default { + color: #999999; +} +.weui-form-preview__btn_primary { + color: #0BB20C; +} +.weui-cell_select { + padding: 0; +} +.weui-select { + position: relative; + padding-left: 15px; + padding-right: 30px; + height: 2.58823529em; + min-height: 2.58823529em; + line-height: 2.58823529em; + border-right: 1rpx solid #D9D9D9; +} +.weui-select:before { + content: " "; + display: inline-block; + height: 6px; + width: 6px; + border-width: 2px 2px 0 0; + border-color: #C8C8CD; + border-style: solid; + -webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + position: relative; + top: -2px; + position: absolute; + top: 50%; + right: 15px; + margin-top: -4px; +} +.weui-select_in-select-after { + padding-left: 0; +} +.weui-cell__hd_in-select-after, +.weui-cell__bd_in-select-before { + padding-left: 15px; +} +.weui-cell_vcode { + padding-right: 0; +} +.weui-vcode-img { + margin-left: 5px; + height: 2.58823529em; + vertical-align: middle; +} +.weui-vcode-btn { + display: inline-block; + height: 2.58823529em; + margin-left: 5px; + padding: 0 0.6em 0 0.7em; + border-left: 1px solid #E5E5E5; + line-height: 2.58823529em; + vertical-align: middle; + font-size: 17px; + color: #3CC51F; + white-space: nowrap; +} +.weui-vcode-btn:active { + color: #52a341; +} +.weui-cell_switch { + padding-top: 6px; + padding-bottom: 6px; +} +.weui-uploader__hd { + display: -webkit-box; + display: -webkit-flex; + display: flex; + padding-bottom: 10px; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.weui-uploader__title { + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; +} +.weui-uploader__info { + color: #B2B2B2; +} +.weui-uploader__bd { + margin-bottom: -4px; + margin-right: -9px; + overflow: hidden; +} +.weui-uploader__file { + float: left; + margin-right: 9px; + margin-bottom: 9px; +} +.weui-uploader__img { + display: block; + width: 79px; + height: 79px; +} +.weui-uploader__file_status { + position: relative; +} +.weui-uploader__file_status:before { + content: " "; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.5); +} +.weui-uploader__file-content { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + color: #FFFFFF; +} +.weui-uploader__input-box { + float: left; + position: relative; + margin-right: 9px; + margin-bottom: 9px; + width: 77px; + height: 77px; + border: 1px solid #D9D9D9; +} +.weui-uploader__input-box:before, +.weui-uploader__input-box:after { + content: " "; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + background-color: #D9D9D9; +} +.weui-uploader__input-box:before { + width: 2px; + height: 39.5px; +} +.weui-uploader__input-box:after { + width: 39.5px; + height: 2px; +} +.weui-uploader__input-box:active { + border-color: #999999; +} +.weui-uploader__input-box:active:before, +.weui-uploader__input-box:active:after { + background-color: #999999; +} +.weui-uploader__input { + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; +} +.weui-article { + padding: 20px 15px; + font-size: 15px; +} +.weui-article__section { + margin-bottom: 1.5em; +} +.weui-article__h1 { + font-size: 18px; + font-weight: 400; + margin-bottom: .9em; +} +.weui-article__h2 { + font-size: 16px; + font-weight: 400; + margin-bottom: .34em; +} +.weui-article__h3 { + font-weight: 400; + font-size: 15px; + margin-bottom: .34em; +} +.weui-article__p { + margin: 0 0 .8em; +} +.weui-msg { + padding-top: 36px; + text-align: center; +} +.weui-msg__link { + display: inline; + color: #586C94; +} +.weui-msg__icon-area { + margin-bottom: 30px; +} +.weui-msg__text-area { + margin-bottom: 25px; + padding: 0 20px; +} +.weui-msg__title { + margin-bottom: 5px; + font-weight: 400; + font-size: 20px; +} +.weui-msg__desc { + font-size: 14px; + color: #999999; +} +.weui-msg__opr-area { + margin-bottom: 25px; +} +.weui-msg__extra-area { + margin-bottom: 15px; + font-size: 14px; + color: #999999; +} +@media screen and (min-height: 438px) { + .weui-msg__extra-area { + position: fixed; + left: 0; + bottom: 0; + width: 100%; + text-align: center; + } +} +.weui-flex { + display: -webkit-box; + display: -webkit-flex; + display: flex; +} +.weui-flex__item { + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; +} +.weui-btn { + margin-top: 15px; +} +.weui-btn:first-child { + margin-top: 0; +} +.weui-btn-area { + margin: 1.17647059em 15px 0.3em; +} +.weui-agree { + display: block; + padding: .5em 15px; + font-size: 13px; +} +.weui-agree__text { + color: #999999; +} +.weui-agree__link { + display: inline; + color: #586C94; +} +.weui-agree__checkbox { + position: absolute; + left: -9999px; +} +.weui-agree__checkbox-icon { + position: relative; + top: 2px; + display: inline-block; + border: 1px solid #D1D1D1; + background-color: #FFFFFF; + border-radius: 3px; + width: 11px; + height: 11px; +} +.weui-agree__checkbox-icon-check { + position: absolute; + top: 1px; + left: 1px; +} +.weui-footer { + color: #999999; + font-size: 14px; + text-align: center; +} +.weui-footer_fixed-bottom { + position: fixed; + bottom: .52em; + left: 0; + right: 0; +} +.weui-footer__links { + font-size: 0; +} +.weui-footer__link { + display: inline-block; + vertical-align: top; + margin: 0 .62em; + position: relative; + font-size: 14px; + color: #586C94; +} +.weui-footer__link:before { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 1px; + bottom: 0; + border-left: 1rpx solid #C7C7C7; + color: #C7C7C7; + left: -0.65em; + top: .36em; + bottom: .36em; +} +.weui-footer__link:first-child:before { + display: none; +} +.weui-footer__text { + padding: 0 .34em; + font-size: 12px; +} +.weui-grids { + border-top: 1rpx solid #D9D9D9; + border-left: 1rpx solid #D9D9D9; + overflow: hidden; +} +.weui-grid { + position: relative; + float: left; + padding: 20px 10px; + width: 33.33333333%; + box-sizing: border-box; + border-right: 1rpx solid #D9D9D9; + border-bottom: 1rpx solid #D9D9D9; +} +.weui-grid_active { + background-color: #ECECEC; +} +.weui-grid__icon { + display: block; + width: 28px; + height: 28px; + margin: 0 auto; +} +.weui-grid__label { + margin-top: 5px; + display: block; + text-align: center; + color: #000000; + font-size: 14px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.weui-loading { + margin: 0 5px; + width: 20px; + height: 20px; + display: inline-block; + vertical-align: middle; + -webkit-animation: weuiLoading 1s steps(12, end) infinite; + animation: weuiLoading 1s steps(12, end) infinite; + background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat; + background-size: 100%; +} +@-webkit-keyframes weuiLoading { + 0% { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } + 100% { + -webkit-transform: rotate3d(0, 0, 1, 360deg); + transform: rotate3d(0, 0, 1, 360deg); + } +} +@keyframes weuiLoading { + 0% { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } + 100% { + -webkit-transform: rotate3d(0, 0, 1, 360deg); + transform: rotate3d(0, 0, 1, 360deg); + } +} +.weui-badge { + display: inline-block; + padding: .15em .4em; + min-width: 8px; + border-radius: 18px; + background-color: #4caf50; + color: #FFFFFF; + line-height: 1.2; + text-align: center; + font-size: 12px; + vertical-align: middle; +} +.weui-badge_dot { + padding: .4em; + min-width: 0; +} +.weui-loadmore { + width: 65%; + margin: 1.5em auto; + line-height: 1.6em; + font-size: 14px; + text-align: center; +} +.weui-loadmore__tips { + display: inline-block; + vertical-align: middle; +} +.weui-loadmore_line { + border-top: 1px solid #E5E5E5; + margin-top: 2.4em; +} +.weui-loadmore__tips_in-line { + position: relative; + top: -0.9em; + padding: 0 .55em; + background-color: #FFFFFF; + color: #999999; +} +.weui-loadmore__tips_in-dot { + position: relative; + padding: 0 .16em; + width: 4px; + height: 1.6em; +} +.weui-loadmore__tips_in-dot:before { + content: " "; + position: absolute; + top: 50%; + left: 50%; + margin-top: -1px; + margin-left: -2px; + width: 4px; + height: 4px; + border-radius: 50%; + background-color: #E5E5E5; +} +.weui-panel { + background-color: #FFFFFF; + margin-top: 10px; + position: relative; + overflow: hidden; +} +.weui-panel:first-child { + margin-top: 0; +} +.weui-panel:before { + content: " "; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 1px; + border-top: 1rpx solid #E5E5E5; + color: #E5E5E5; +} +.weui-panel:after { + content: " "; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + border-bottom: 1rpx solid #E5E5E5; + color: #E5E5E5; +} +.weui-panel__hd { + padding: 14px 15px 10px; + color: #999999; + font-size: 13px; + position: relative; +} +.weui-panel__hd:after { + content: " "; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + border-bottom: 1rpx solid #E5E5E5; + color: #E5E5E5; + left: 15px; +} +.weui-media-box { + padding: 15px; + position: relative; +} +.weui-media-box:before { + content: " "; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 1px; + border-top: 1rpx solid #E5E5E5; + color: #E5E5E5; + left: 15px; +} +.weui-media-box:first-child:before { + display: none; +} +.weui-media-box__title { + font-weight: 400; + font-size: 17px; + width: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: normal; + word-wrap: break-word; + word-break: break-all; +} +.weui-media-box__desc { + color: #999999; + font-size: 13px; + line-height: 1.2; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.weui-media-box__info { + margin-top: 15px; + padding-bottom: 5px; + font-size: 13px; + color: #CECECE; + line-height: 1em; + list-style: none; + overflow: hidden; +} +.weui-media-box__info__meta { + float: left; + padding-right: 1em; +} +.weui-media-box__info__meta_extra { + padding-left: 1em; + border-left: 1px solid #CECECE; +} +.weui-media-box__title_in-text { + margin-bottom: 8px; +} +.weui-media-box_appmsg { + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.weui-media-box__thumb { + width: 100%; + height: 100%; + vertical-align: top; +} +.weui-media-box__hd_in-appmsg { + margin-right: .8em; + width: 60px; + height: 60px; + line-height: 60px; + text-align: center; +} +.weui-media-box__bd_in-appmsg { + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; + min-width: 0; +} +.weui-media-box_small-appmsg { + padding: 0; +} +.weui-cells_in-small-appmsg { + margin-top: 0; +} +.weui-cells_in-small-appmsg:before { + display: none; +} +.weui-progress { + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.weui-progress__bar { + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; +} +.weui-progress__opr { + margin-left: 15px; + font-size: 0; +} +.weui-navbar { + display: -webkit-box; + display: -webkit-flex; + display: flex; + position: absolute; + z-index: 500; + top: 0; + width: 100%; + border-bottom: 1rpx solid #CCCCCC; +} +.weui-navbar__item { + position: relative; + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; + padding: 13px 0; + text-align: center; + font-size: 0; +} +.weui-navbar__item.weui-bar__item_on { + color: #1AAD19; +} +.weui-navbar__slider { + position: absolute; + content: " "; + left: 0; + bottom: 0; + width: 6em; + height: 3px; + background-color: #1AAD19; + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.weui-navbar__title { + display: inline-block; + font-size: 15px; + max-width: 8em; + width: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: normal; +} +.weui-tab { + position: relative; + height: 100%; +} +.weui-tab__panel { + box-sizing: border-box; + height: 100%; + padding-top: 50px; + overflow: auto; + -webkit-overflow-scrolling: touch; +} +.weui-search-bar { + position: relative; + padding: 8px 10px; + display: -webkit-box; + display: -webkit-flex; + display: flex; + box-sizing: border-box; + background-color: #EFEFF4; + border-top: 1rpx solid #D7D6DC; + border-bottom: 1rpx solid #D7D6DC; +} +.weui-icon-search { + margin-right: 8px; + font-size: inherit; +} +.weui-icon-search_in-box { + position: absolute; + left: 10px; + top: 7px; +} +.weui-search-bar__text { + display: inline-block; + font-size: 14px; + vertical-align: middle; +} +.weui-search-bar__form { + position: relative; + -webkit-box-flex: 1; + -webkit-flex: auto; + flex: auto; + border-radius: 5px; + background: #FFFFFF; + border: 1rpx solid #E6E6EA; +} +.weui-search-bar__box { + position: relative; + padding-left: 30px; + padding-right: 30px; + width: 100%; + box-sizing: border-box; + z-index: 1; +} +.weui-search-bar__input { + height: 28px; + line-height: 28px; + font-size: 14px; +} +.weui-icon-clear { + position: absolute; + top: 0; + right: 0; + padding: 7px 8px; + font-size: 0; +} +.weui-search-bar__label { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + border-radius: 3px; + text-align: center; + color: #9B9B9B; + background: #FFFFFF; + line-height: 28px; +} +.weui-search-bar__cancel-btn { + margin-left: 10px; + line-height: 28px; + color: #09BB07; + white-space: nowrap; +} diff --git a/pages/course/content.js b/pages/course/content.js deleted file mode 100644 index 4e2e925..0000000 --- a/pages/course/content.js +++ /dev/null @@ -1,471 +0,0 @@ -// pages/course/content.js -const util = require("../../utils/util"); -//获取应用实例 -var app = getApp(); -const domain = app.globalData.domain; -Page({ - data: { - remind: '加载中', - _days: ['一','二','三','四','五','六','日'], - weekArray: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'], - _weeks : ['第一周','第二周','第三周','第四周','第五周','第六周','第七周','第八周','第九周','第十周','十一周','十二周','十三周','十四周','十五周','十六周','十七周','十八周','十九周','二十周'], - _time: [ //课程时间与指针位置的映射,{begin:课程开始,end:结束时间,top:指针距开始top格数} - { begin: '0:00', end: '7:59', beginTop: -4, endTop: -4 }, - { begin: '8:00', end: '9:35', beginTop: 0, endTop: 200 }, - { begin: '9:36', end: '9:54', beginTop: 204, endTop: 204 }, - { begin: '9:55', end: '11:30', beginTop: 208, endTop: 408 }, - { begin: '11:31', end: '13:09', beginTop: 414, endTop: 414 }, - { begin: '13:10', end: '14:45', beginTop: 420, endTop: 620 }, - { begin: '14:46', end: '14:59', beginTop: 624, endTop: 624 }, - { begin: '15:00', end: '16:35', beginTop: 628, endTop: 828 }, - { begin: '16:36', end: '16:49', beginTop: 834, endTop: 834 }, - { begin: '16:50', end: '18:25', beginTop: 840, endTop: 1040 }, - { begin: '18:26', end: '19:09', beginTop: 1044, endTop: 1044 }, - { begin: '19:10', end: '21:35', beginTop: 1048, endTop: 1248 }, - { begin: '21:36', end: '23:59', beginTop: 1254, endTop: 1254 }, - ], - timeRow: [ - { l1: '第一小节', l2: '第二小节', t1: '8:00-8:45', t2: '8:50-9:35' }, - { l1: '第三小节', l2: '第四小节', t1: '9:55-10:40', t2: '10:45-11:30' }, - { l1: '第五小节', l2: '第六小节', t1: '13:10-13:55', t2: '14:00-14:45' }, - { l1: '第七小节', l2: '第八小节', t1: '15:00-15:45', t2: '15:50-16:35' }, - { l1: '第九小节', l2: '第十小节', t1: '16:50-17:35', t2: '17:40-18:25' }, - ], - timelineTop: 0, - scroll: { - left: 0 - }, - targetLessons: [], - targetColor: 'green', - targetX: 0, //target x轴top距离 - targetY: 0, //target y轴left距离 - targetDay: 0, //target day - targetDayIndex: 0, - targetWid: 0, //target wid - targetI: 0, //target 第几个active - targetLen: 0, //target 课程长度 - blur: false, - today: '', //当前星期数 - toweek: 1, //当前周数 - week: '*', //视图周数('*'表示学期视图) - lessons : [], //课程data - title: '', - dates: [], //本周日期 - pageType: 'teacher', - is_vacation: false,// 是否为假期 - classColors: ['red', 'green', 'purple', 'yellow','orange','olive','cyan','blue','mauve'], - painting: {}, - shareImage: '' - }, - //分享 - // onShareAppMessage: function(){ - // var name = this.data.name || app._user.we.info.name, - // id = this.data.id || app._user.we.info.id; - // return { - // title: name + '的课表', - // desc: '贝壳小盒子 - 课表查询', - // path: '/pages/core/kb/kb?id='+id+'&name='+name - // }; - // }, - onLoad: function(options){ - // console.log('options',options) - const pageType = options.type; - const keyword = options.name; - const uid = app.globalData.edusysUserInfo.uid ? app.globalData.edusysUserInfo.uid : options.uid - const inital = this.inital(keyword, pageType); - if(inital){ - return - } - this.get_kb(keyword, pageType, uid); - }, - inital: function (keyword,pageType) { - const d = new Date(); - var today = d.getDay(); - today = this.data.weekArray[today]; - if(pageType == 'class'){ - wx.setNavigationBarTitle({ - title: keyword + '班级课表 - 贝壳小盒子', - }) - } - if(pageType == 'teacher'){ - wx.setNavigationBarTitle({ - title: keyword + '老师课表 - 贝壳小盒子', - }) - } - this.setData({ today: today, pageType: pageType }) - return false; - }, - onShow: function(){ - var _this = this; - // 计算timeline时针位置 - function parseMinute(dateStr){ return dateStr.split(':')[0]*60 + parseInt(dateStr.split(':')[1]); } - function compareDate(dateStr1,dateStr2){ - return parseMinute(dateStr1) <= parseMinute(dateStr2); - } - var nowTime = util.wecquFormatTime(new Date(),'h:m'); - _this.data._time.forEach(function(e,i){ - if(compareDate(e.begin,nowTime) && compareDate(nowTime,e.end)){ - _this.setData({ - timelineTop: Math.round(e.beginTop + (e.endTop-e.beginTop)*(parseMinute(nowTime) - parseMinute(e.begin))/100) - }); - }; - }); - //设置滚动至当前时间附近,如果周末为设置left为其最大值102 - var nowWeek = new Date().getDay(); - _this.setData({ - 'scroll.left': ((nowWeek===6||nowWeek===0) && !this.data.is_vacation) ? 102 : 0 - }); - }, - onReady: function(){ - // onReady - }, - scrollXHandle: function(e){ - // this.setData({ - // 'scroll.left': e.detail.scrollLeft - // }); - }, - showDetail: function(e){ - // 点击课程卡片后执行 - var _this = this; - var dataset = e.currentTarget.dataset; - var lessons = _this.data.lessons[dataset.day][dataset.wid]; - var targetI = 0; - // console.log(e) - if(!Array.isArray(lessons)){lessons = [lessons]} - if(Array.isArray(lessons)){ - lessons.map(function(e,i){ - if(lessons.length === 1){ - e.left = 0; - }else{ - //笼罩层卡片防止超出课表区域 - //周一~周四0~3:n lessons.length>=2*n+1时,设置left0为-n*128,否则设置为-60*(lessons.length-1); - //周日~周五6~4:n lessons.length>=2*(6-n)+1时,设置left0为-(7-n-lessons.length)*128,否则设置为-60*(lessons.length-1); - var left0 = -60*(lessons.length-1); - if(dataset.day <= 3 && lessons.length >= 2*dataset.day+1){ - left0 = -dataset.day*128; - }else if(dataset.day >= 4 && lessons.length >= 2*(6-dataset.day)+1){ - left0 = -(7-dataset.day-lessons.length)*128; - } - e.left = left0+128*i; - } - return e; - }); - } else { - lessons.left = 0; - } - targetI = 0; - lessons.target = false; - if(!lessons.length){ return false; } - var targetDayIndex = this.data.weekArray.indexOf(dataset.day) - 1; - var targetX = e.detail.x >= 80 ? e.detail.x : e.detail.x + 50; - _this.setData({ - targetX: targetX, - targetY: e.detail.y, - targetDay: dataset.day, - targetDayIndex: targetDayIndex, - targetWid: dataset.wid, - targetColor: dataset.color, - targetI: targetI, - targetLessons: lessons, - targetLen: lessons.length, - blur: true - }); - }, - hideDetail: function(){ - // 点击遮罩层时触发,取消主体部分的模糊,清空target - this.setData({ - blur: false, - targetLessons: [], - targetX: 0, - targetY: 0, - targetDay: 0, - targetWid: 0, - targetI: 0, - targetLen: 0 - }); - }, - infoCardTap: function(e){ - var dataset = e.currentTarget.dataset; - if(this.data.targetI == dataset.index){ return false; } - this.setData({ - targetI: dataset.index - }); - }, - infoCardChange: function(e){ - var current = e.detail.current; - if(this.data.targetI == current){ return false; } - this.setData({ - targetI: current - }); - }, - catchMoveDetail: function(){ /*阻止滑动穿透*/ }, - bindStartDetail: function(e){ - this.setData({ - startPoint: [e.touches[0].pageX, e.touches[0].pageY] - }); - }, - //滑动切换课程详情 - bindMoveDetail: function(e){ - var _this = this; - var curPoint = [e.changedTouches[0].pageX, e.changedTouches[0].pageY], - startPoint = _this.data.startPoint, i = 0; - if(curPoint[0] <= startPoint[0]){ - if(Math.abs(curPoint[0]-startPoint[0]) >= Math.abs(curPoint[1]-startPoint[1])){ - if(_this.data.targetI != _this.data.targetLen - 1) { - i = 1;//左滑 - } - } - }else{ - if(Math.abs(curPoint[0]-startPoint[0]) >= Math.abs(curPoint[1]-startPoint[1])){ - if(_this.data.targetI != 0) { - i = -1;//右滑 - } - } - } - if(!i){ return false; } - _this.setData({ - targetI: parseInt(_this.data.targetI) + i - }); - }, - //点击左右按钮切换swiper - swiperChangeBtn: function(e){ - var _this = this; - var dataset = e.currentTarget.dataset, i, data={}; - if(dataset.direction == 'left'){ i = -1; } - else if(dataset.direction == 'right'){ i = 1; } - data[dataset.target] = parseInt(_this.data[dataset.target]) + i; - _this.setData(data); - }, - get_kb: function (keyword, pageType, uid) { - var _this = this; - wx.request({ - url: `${domain}/edu/${pageType}/courseSchedule/content`, - data: {uid: uid, keyword: keyword}, - success: function(res){ - if(res.statusCode == 200){ - // console.log(res.data) - _this.setData({ title: res.data[0].title, lessons: res.data[0].class, remind: '' }) - } else { - _this.setData({remind: res.data.message}) - } - } - }) - }, - goClassPlace: function(e) { - const place = e.currentTarget.dataset.place; - // console.log(place); - var placeArr = ["1教", "2教", "3教", "4教", "5教", "6教", "7教", "8教", "9教", "10教", "11教", "12教", "理工馆", "社科馆"]; - var markerIdArr = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 5, 4]; - var result = placeArr.indexOf(place.slice(0, -3)); - if(result>=0){ - wx.navigateTo({ url: '../traffic/navi?markerId=' + markerIdArr[result]}) - } else { - wx.showToast({ title: '小盒子太笨了,不知道这个鬼地方在哪里' }) - } - }, - eventGetImage: function (event) { - var that = this; - // console.log(event) - wx.hideLoading() - const { tempFilePath, errMsg } = event.detail - if (errMsg === 'canvasdrawer:ok') { - this.setData({ shareImage: tempFilePath }) - wx.previewImage({ urls: [tempFilePath] }) - that.eventSave(); - } - }, - eventSave:function () { - wx.saveImageToPhotosAlbum({ - filePath: this.data.shareImage, - success(res) { - wx.showToast({ - title: '图片已存至相册,可发给好友或设为壁纸', - icon: 'none', - duration: 3000 - }) - } - }) - }, - drawToPic:function () { - var that = this; - if (that.data.shareImage != '') { - wx.previewImage({ - urls: [that.data.shareImage], - }) - wx.showToast({ - title: '图片已存至相册,可发给好友或设为壁纸', - icon: 'none', - duration: 3000 - }) - return - } - wx.showLoading({ - title: '绘制分享图片中', - mask: true - }) - const deviceInfo = wx.getSystemInfoSync(); - const screenWidth = deviceInfo.screenWidth; - const screenHeight = deviceInfo.screenHeight; - var topMargin = 10; - if (screenHeight / screenWidth >= 1.8) { - //检测是否为全面屏 - topMargin = 30; - } - var viewsArr = [{ - type: 'rect', - background: '#fff', - top: 0, - left: 0, - width: screenWidth, - height: screenHeight - }]; - //绘制星期 - const weekArr = ['周一', '周二', '周三', '周四', '周五']; - for (let i = 0; i < weekArr.length; i++) { - let rowTempArr = { - type: 'text', - content: weekArr[i], - fontSize: 16, - color: '#402D16', - textAlign: 'left', - top: topMargin, - left: 30 + (i * ((screenWidth - 30) / weekArr.length)), - bolder: true - }; - viewsArr.push(rowTempArr); - } - //绘制节数 - for (let i = 1; i <= 12; i++) { - let columnTempArr = { - type: 'text', - content: i, - fontSize: 16, - color: '#402D16', - textAlign: 'center', - top: (topMargin - 30) + (i * ((screenHeight - 30) / 12)), - left: 10, - bolder: true - }; - viewsArr.push(columnTempArr); - } - - const allCourseArr = that.data.lessons; - let j = 0; - for (let w in allCourseArr) { - if (j < 5) { - for (let i in allCourseArr[w]) { - try { - if (allCourseArr[w][i].courseName.length > 0) { - let classTempBgArr = { - type: 'rect', - background: '#7acfa6', - top: (topMargin + 30) + (2 * (i) * ((screenHeight - 30) / 12)), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length))), - width: ((screenWidth - 30) / weekArr.length) - 1, - height: (1 * ((screenHeight - 30) / 6)) - 1 - }; - viewsArr.push(classTempBgArr); - let courseName = allCourseArr[w][i].courseName.length > 9 ? allCourseArr[w][i].courseName.substr(0, 8) + '...' : allCourseArr[w][i].courseName; - let classTextTempArr = { - type: 'text', - content: allCourseArr[w][i].place + ' ' + courseName, - fontSize: 16, - color: '#fff', - textAlign: 'left', - top: (topMargin + 30) + (2 * (i) * ((screenHeight - 30) / 12) + 5), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length)) + 5), - breakWord: true, - MaxLineNumber: 7, - width: ((screenWidth - 30) / weekArr.length) - 20 - }; - viewsArr.push(classTextTempArr); - } - } catch (error) { - let classTempBgArr = { - type: 'rect', - background: '#7acfa6', - top: (topMargin + 30) + (2 * (i) * ((screenHeight - 30) / 12)), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length))), - width: ((screenWidth - 30) / weekArr.length) - 1, - height: (1 * ((screenHeight - 30) / 6)) - 1 - }; - viewsArr.push(classTempBgArr); - let longContent = ''; - for (let index = 0; index < allCourseArr[w][i].length; index++) { - const element = allCourseArr[w][i][index]; - let courseName = element.courseName.length > 7 ? element.courseName.substr(0,5)+'...':element.courseName; - longContent = longContent + element.place + courseName; - } - let classTextTempArr = { - type: 'text', - content: longContent, - fontSize: 16, - color: '#fff', - textAlign: 'left', - top: (topMargin + 30) + (2 * (i) * ((screenHeight - 30) / 12) + 5), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length)) + 5), - breakWord: true, - MaxLineNumber: 7, - width: ((screenWidth - 30) / weekArr.length) - 20 - }; - viewsArr.push(classTextTempArr); - } - } - j++; - } - } - - var canvasJson = { - width: screenWidth, - height: screenHeight, - views: viewsArr - }; - that.setData({ - painting: canvasJson - }) - }, - addCalendarNotice: function (e) { - - var d = new Date(); - var nowHours = d.getHours(); - nowHours = nowHours > 9 ? nowHours : '0' + nowHours; - var nowMinutes = d.getMinutes(); - nowMinutes = nowMinutes > 9 ? nowMinutes : '0' + nowMinutes; - const nowTimestamp = util.getCourseNoticeTimestamp(this.data.today, `${nowHours}:${nowMinutes}`); - const StartTimeArray = [ - {start: '8:00', end: '9:35'}, - {start: '9:55', end: '11:30'}, - {start: '13:10', end: '14:45'}, - {start: '15:00', end: '16:35'}, - {start: '16:50', end: '18:25'}, - {start: '19:10', end: '20:45'} - ]; - const targetWid = this.data.targetWid; - - const targetI = this.data.targetI; - const subacribeCourse = this.data.targetLessons[targetI]; - const courseName = subacribeCourse.courseName; - const startTimeStr = StartTimeArray[targetWid].start; - const endTimeStr = StartTimeArray[targetWid].end; - const place = subacribeCourse.place; - const teacher = this.data.title; - const teachWeek = subacribeCourse.teachWeek; - - var setNoticeStart = util.getCourseNoticeTimestamp(this.data.targetDay, startTimeStr); - var setNoticeEnd = util.getCourseNoticeTimestamp(this.data.targetDay, endTimeStr); - - setNoticeStart = setNoticeStart <= nowTimestamp ? parseInt(setNoticeStart) + 60*60*24*7 : setNoticeStart; - - const pageType = this.data.pageType == 'class' ? '班级' : '老师'; - - const description = `【贝壳小盒子】提醒你${teachWeek}您有一节${teacher}${pageType}的${courseName}课程,${startTimeStr}开始上课,到${endTimeStr}下课,记得按时去上课哦(#^.^#)`; - wx.addPhoneCalendar({ - title: courseName, - startTime: setNoticeStart, - description: description, - location: place, - endTime: setNoticeEnd, - alarmOffset: 60*10 - }); - } -}) \ No newline at end of file diff --git a/pages/course/content.json b/pages/course/content.json deleted file mode 100644 index 0023b1f..0000000 --- a/pages/course/content.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "navigationBarBackgroundColor": "#73b4ef", - "navigationBarTitleText": "教师课表 - 贝壳小盒子", - "backgroundColor": "#73b4ef", - "enablePullDownRefresh": false, - "navigationStyle": "default", - "usingComponents": { - "canvasdrawer": "/utils/canvasdrawer/canvasdrawer" - } -} \ No newline at end of file diff --git a/pages/course/content.wxml b/pages/course/content.wxml deleted file mode 100644 index 7fa7a30..0000000 --- a/pages/course/content.wxml +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - {{remind}} - - - - - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - - - 周{{item}} - - - 时间 - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - - - - - - - - - - - - - - - {{widItem.place}} - - {{widItem.courseName}} - - - - - {{widItem.length}}项课程 - - {{item.place}}-{{item.courseName}} - - - - - - - - - - - {{timeRowItem.l1}} - {{timeRowItem.t1}} - {{timeRowItem.l2}} - {{timeRowItem.t2}} - - - - - 第十一节课 - 19:10-19:55 - 第十二节课 - 20:00-20:45 - 第十三节课 - 20:50-21:35 - - - - - - - - - - - - - {{cards.place}} - - {{cards.courseName}} - - - - - - - - - - - - - {{title}}{{pageType=='teacher'?'老师':''}}- 课表 - - - 存图 - - - - - - - 星期{{_days[targetDayIndex]}} - - 日历提醒 - - - - - - - - - - - {{item.courseName}} - - - - 课程 - - - {{targetWid}} - - 教师:{{title}} - 班级:{{title}} - - - 地点:{{item.place}} - 导航前往 - - - - 上课周:{{item.teachWeek}} - - - - - - - - - - - - - - - - - - {{item.courseName}} - - - - 课程 - - - {{targetWid}} - - 教师:{{title}} - 班级:{{title}} - - - 地点:{{item.place}} - 导航前往 - - - 上课周:{{item.teachWeek}} - - - - - - - - - - - - - - - - - diff --git a/pages/course/content.wxss b/pages/course/content.wxss deleted file mode 100644 index 6124ecc..0000000 --- a/pages/course/content.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/course/content.wxss */ -@import "./my.wxss"; \ No newline at end of file diff --git a/pages/course/my.js b/pages/course/my.js deleted file mode 100644 index 2440e2c..0000000 --- a/pages/course/my.js +++ /dev/null @@ -1,576 +0,0 @@ -// pages/course/my.js -const util = require("../../utils/util"); -//获取应用实例 -var app = getApp(); -const domain = app.globalData.domain; -Page({ - data: { - remind: '加载中', - _days: ['一','二','三','四','五','六','日'], - weekArray: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'], - _weeks : ['第一周','第二周','第三周','第四周','第五周','第六周','第七周','第八周','第九周','第十周','十一周','十二周','十三周','十四周','十五周','十六周','十七周','十八周','十九周','二十周'], - _time: [ //课程时间与指针位置的映射,{begin:课程开始,end:结束时间,top:指针距开始top格数} - { begin: '0:00', end: '7:59', beginTop: -4, endTop: -4 }, - { begin: '8:00', end: '9:35', beginTop: 0, endTop: 200 }, - { begin: '9:36', end: '9:54', beginTop: 204, endTop: 204 }, - { begin: '9:55', end: '11:30', beginTop: 208, endTop: 408 }, - { begin: '11:31', end: '13:09', beginTop: 414, endTop: 414 }, - { begin: '13:10', end: '14:45', beginTop: 420, endTop: 620 }, - { begin: '14:46', end: '14:59', beginTop: 624, endTop: 624 }, - { begin: '15:00', end: '16:35', beginTop: 628, endTop: 828 }, - { begin: '16:36', end: '16:49', beginTop: 834, endTop: 834 }, - { begin: '16:50', end: '18:25', beginTop: 840, endTop: 1040 }, - { begin: '18:26', end: '19:09', beginTop: 1044, endTop: 1044 }, - { begin: '19:10', end: '21:35', beginTop: 1048, endTop: 1248 }, - { begin: '21:36', end: '23:59', beginTop: 1254, endTop: 1254 }, - ], - timeRow: [ - { l1: '第一小节', l2: '第二小节', t1: '8:00-8:45', t2: '8:50-9:35' }, - { l1: '第三小节', l2: '第四小节', t1: '9:55-10:40', t2: '10:45-11:30' }, - { l1: '第五小节', l2: '第六小节', t1: '13:10-13:55', t2: '14:00-14:45' }, - { l1: '第七小节', l2: '第八小节', t1: '15:00-15:45', t2: '15:50-16:35' }, - { l1: '第九小节', l2: '第十小节', t1: '16:50-17:35', t2: '17:40-18:25' }, - ], - timelineTop: 0, - scroll: { - left: 0 - }, - targetLessons: [], - targetColor: 'green', - targetX: 0, //target x轴top距离 - targetY: 0, //target y轴left距离 - targetDay: 0, //target day - targetDayIndex: 0, - targetWid: 0, //target wid - targetI: 0, //target 第几个active - targetLen: 0, //target 课程长度 - blur: false, - today: '', //当前星期数 - toweek: 1, //当前周数 - week: '*', //视图周数('*'表示学期视图) - lessons : [], //课程data - dates: [], //本周日期 - teacher: false, //是否为教师课表 - is_vacation: false,// 是否为假期 - myCourseJson: {}, - classColors: ['red', 'green', 'purple', 'yellow','orange','olive','cyan','blue','mauve'], - painting: {}, - shareImage: '', - isAndroid: false - }, - //分享 - // onShareAppMessage: function(){ - // var name = this.data.name || app._user.we.info.name, - // id = this.data.id || app._user.we.info.id; - // return { - // title: name + '的课表', - // desc: '贝壳小盒子 - 课表查询', - // path: '/pages/core/kb/kb?id='+id+'&name='+name - // }; - // }, - onLoad: function(options){ - var _this = this; - var inital = _this.inital(); - if(inital){ - return - } - if (!inital && _this.hasEdysysUserInfo()) { - _this.get_kb(); - } else { - _this.setData({remind: '请重新登录'}) - } - // Android 系统显示桌面组件按钮 - wx,wx.getSystemInfo({ - success: (result) => { - if (result.platform == 'android') { _this.setData({ isAndroid: true }) } - } - }) - }, - inital: function () { - const d = new Date(); - var today = d.getDay(); - today = this.data.weekArray[today]; - let courseCache = wx.getStorageSync('myCourse') || {} - let hasCourseCache = Object.keys(courseCache).length == 7 ? true : false; - let _this = this; - this.setData({ - today: today, - lessons: hasCourseCache ? courseCache : [], - remind: hasCourseCache ? '' : _this.data.remind - }) - return false; - }, - hasEdysysUserInfo: function () { - try { - var isTeacher = false; - let edusysUserInfo = wx.getStorageSync('edusysUserInfo') || {} - if(edusysUserInfo.name.length > 0){ - if(edusysUserInfo.uid.length<8){ - isTeacher = true; - } - app.globalData.edusysUserInfo = edusysUserInfo; - this.setData({edusysUserInfo: edusysUserInfo, teacher: isTeacher}); - return true; - } - return false; - } catch (error) { - return false; - } - }, - onShow: function(){ - var _this = this; - // 计算timeline时针位置 - function parseMinute(dateStr){ return dateStr.split(':')[0]*60 + parseInt(dateStr.split(':')[1]); } - function compareDate(dateStr1,dateStr2){ - return parseMinute(dateStr1) <= parseMinute(dateStr2); - } - var nowTime = util.wecquFormatTime(new Date(),'h:m'); - _this.data._time.forEach(function(e,i){ - if(compareDate(e.begin,nowTime) && compareDate(nowTime,e.end)){ - _this.setData({ - timelineTop: Math.round(e.beginTop + (e.endTop-e.beginTop)*(parseMinute(nowTime) - parseMinute(e.begin))/100) - }); - }; - }); - //设置滚动至当前时间附近,如果周末为设置left为其最大值102 - var nowWeek = new Date().getDay(); - _this.setData({ - 'scroll.left': ((nowWeek===6||nowWeek===0) && !this.data.is_vacation) ? 102 : 0 - }); - }, - onReady: function(){ - var _this = this; - }, - scrollXHandle: function(e){ - // this.setData({ - // 'scroll.left': e.detail.scrollLeft - // }); - }, - showDetail: function(e){ - // 点击课程卡片后执行 - var _this = this; - var dataset = e.currentTarget.dataset; - var lessons = _this.data.lessons[dataset.day][dataset.wid]; - var targetI = 0; - // console.log(e) - if(!Array.isArray(lessons)){lessons = [lessons]} - if(Array.isArray(lessons)){ - lessons.map(function(e,i){ - if(lessons.length === 1){ - e.left = 0; - }else{ - //笼罩层卡片防止超出课表区域 - //周一~周四0~3:n lessons.length>=2*n+1时,设置left0为-n*128,否则设置为-60*(lessons.length-1); - //周日~周五6~4:n lessons.length>=2*(6-n)+1时,设置left0为-(7-n-lessons.length)*128,否则设置为-60*(lessons.length-1); - var left0 = -60*(lessons.length-1); - if(dataset.day <= 3 && lessons.length >= 2*dataset.day+1){ - left0 = -dataset.day*128; - }else if(dataset.day >= 4 && lessons.length >= 2*(6-dataset.day)+1){ - left0 = -(7-dataset.day-lessons.length)*128; - } - e.left = left0+128*i; - } - return e; - }); - } else { - lessons.left = 0; - } - targetI = 0; - lessons.target = false; - if(!lessons.length){ return false; } - var targetDayIndex = this.data.weekArray.indexOf(dataset.day) - 1; - var targetX = e.detail.x >= 80 ? e.detail.x : e.detail.x + 120; - _this.setData({ - targetX: targetX, - targetY: e.detail.y, - targetDay: dataset.day, - targetDayIndex: targetDayIndex, - targetWid: dataset.wid, - targetColor: dataset.color, - targetI: targetI, - targetLessons: lessons, - targetLen: lessons.length, - blur: true - }); - }, - hideDetail: function(){ - // 点击遮罩层时触发,取消主体部分的模糊,清空target - this.setData({ - blur: false, - targetLessons: [], - targetX: 0, - targetY: 0, - targetDay: 0, - targetWid: 0, - targetI: 0, - targetLen: 0 - }); - }, - infoCardTap: function(e){ - var dataset = e.currentTarget.dataset; - if(this.data.targetI == dataset.index){ return false; } - this.setData({ - targetI: dataset.index - }); - }, - infoCardChange: function(e){ - var current = e.detail.current; - if(this.data.targetI == current){ return false; } - this.setData({ - targetI: current - }); - }, - catchMoveDetail: function(){ /*阻止滑动穿透*/ }, - bindStartDetail: function(e){ - this.setData({ - startPoint: [e.touches[0].pageX, e.touches[0].pageY] - }); - }, - //滑动切换课程详情 - bindMoveDetail: function(e){ - var _this = this; - var curPoint = [e.changedTouches[0].pageX, e.changedTouches[0].pageY], - startPoint = _this.data.startPoint, i = 0; - if(curPoint[0] <= startPoint[0]){ - if(Math.abs(curPoint[0]-startPoint[0]) >= Math.abs(curPoint[1]-startPoint[1])){ - if(_this.data.targetI != _this.data.targetLen - 1) { - i = 1;//左滑 - } - } - }else{ - if(Math.abs(curPoint[0]-startPoint[0]) >= Math.abs(curPoint[1]-startPoint[1])){ - if(_this.data.targetI != 0) { - i = -1;//右滑 - } - } - } - if(!i){ return false; } - _this.setData({ - targetI: parseInt(_this.data.targetI) + i - }); - }, - //点击左右按钮切换swiper - swiperChangeBtn: function(e){ - var _this = this; - var dataset = e.currentTarget.dataset, i, data={}; - if(dataset.direction == 'left'){ i = -1; } - else if(dataset.direction == 'right'){ i = 1; } - data[dataset.target] = parseInt(_this.data[dataset.target]) + i; - _this.setData(data); - }, - get_kb: function () { - var uid = app.globalData.edusysUserInfo.uid - var password = app.globalData.edusysUserInfo.password - var _this = this - wx.request({ - url: `${domain}/edu/course`, - data: { uid: uid, pwd: password, cookie: app.globalData.edusysUserInfo.cookie }, - method: 'POST', - timeout: app.globalData.requestTimeout, - success: function(res){ - if(res.statusCode == 200){ - // console.log(res.data) - wx.setStorage({ data: res.data.course, key: 'myCourse' }) - _this.setData({myCourseJson: res.data, lessons: res.data.course, remind: ''}) - wx.showToast({ title: '已自动更新最新课表', icon: 'none' }) - wx.vibrateShort({ type: 'medium' }) - } else { - _this.setData({remind: res.data.message}) - if (res.statusCode == 403) { - wx.clearStorageSync() - app.globalData.edusysUserInfo = {} - wx.navigateTo({ url: '../index/login' }) - } - } - } - }) - }, - goClassPlace: function(ep) { - // console.log(ep.target.dataset.place); - var placeArr = ["1教", "2教", "3教", "4教", "5教", "6教", "7教", "8教", "9教", "10教", "11教", "12教", "理工馆", "社科馆"]; - var markerIdArr = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 5, 4]; - var result = placeArr.indexOf(ep.currentTarget.dataset.place.slice(0, -3)); - if( result >= 0 ) { wx.navigateTo({ url: '../traffic/navi?markerId=' + markerIdArr[result]}) } - }, - eventGetImage: function (event) { - var that = this; - // console.log(event) - wx.hideLoading() - const { tempFilePath, errMsg } = event.detail - if (errMsg === 'canvasdrawer:ok') { - this.setData({ shareImage: tempFilePath }) - wx.previewImage({ urls: [tempFilePath] }) - that.eventSave(); - } - }, - eventSave:function () { - wx.saveImageToPhotosAlbum({ - filePath: this.data.shareImage, - success(res) { - wx.vibrateShort({ type: 'medium' }) - wx.showToast({ - title: '图片已存至相册,可发给好友或设为壁纸', - icon: 'none', - duration: 3000 - }) - } - }) - }, - drawToPic:function () { - var that = this; - if (that.data.shareImage != '') { - wx.previewImage({ - urls: [that.data.shareImage], - }) - wx.showToast({ - title: '图片已存至相册,可发给好友或设为壁纸', - icon: 'none', - duration: 3000 - }) - return - } - wx.showLoading({ - title: '绘制分享图片中', - mask: true - }) - const deviceInfo = wx.getSystemInfoSync(); - const screenWidth = deviceInfo.screenWidth; - const screenHeight = deviceInfo.screenHeight; - let topMargin = 10; - if (screenHeight / screenWidth >= 1.8) { - //检测是否为全面屏 - topMargin = 30; - } - var viewsArr = [{ - type: 'rect', - background: '#fff', - top: 0, - left: 0, - width: screenWidth, - height: screenHeight - }]; - //绘制星期 - const weekArr = ['周一', '周二', '周三', '周四', '周五']; - for (let i = 0; i < weekArr.length; i++) { - let rowTempArr = { - type: 'text', - content: weekArr[i], - fontSize: 16, - color: '#402D16', - textAlign: 'left', - top: topMargin, - left: 30 + (i * ((screenWidth - 30) / weekArr.length)), - bolder: true - }; - viewsArr.push(rowTempArr); - } - //绘制节数 - for (let i = 1; i <= 12; i++) { - let columnTempArr = { - type: 'text', - content: i, - fontSize: 16, - color: '#402D16', - textAlign: 'center', - top: (topMargin - 30) + (i * ((screenHeight - 30) / 12)), - left: 10, - bolder: true - }; - viewsArr.push(columnTempArr); - } - - const allCourseArr = that.data.lessons; - let j = 0; - for (let w in allCourseArr) { - if (j < 5) { - for (let i in allCourseArr[w]) { - try { - if (allCourseArr[w][i].courseName.length > 0) { - let classTempBgArr = { - type: 'rect', - background: '#7acfa6', - top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12)), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length))), - width: ((screenWidth - 30) / weekArr.length) - 1, - height: (1 * ((screenHeight - 30) / 6)) - 1 - }; - viewsArr.push(classTempBgArr); - let classTextTempArr = { - type: 'text', - content: allCourseArr[w][i].place + ' ' + allCourseArr[w][i].courseName, - fontSize: 16, - color: '#fff', - textAlign: 'left', - top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12) + 5), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length)) + 5), - breakWord: true, - MaxLineNumber: 7, - width: ((screenWidth - 30) / weekArr.length) - 20 - }; - viewsArr.push(classTextTempArr); - } - } catch (error) { - let classTempBgArr = { - type: 'rect', - background: '#7acfa6', - top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12)), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length))), - width: ((screenWidth - 30) / weekArr.length) - 1, - height: (1 * ((screenHeight - 30) / 6)) - 1 - }; - viewsArr.push(classTempBgArr); - let longContent = ''; - for (let index = 0; index < allCourseArr[w][i].length; index++) { - const element = allCourseArr[w][i][index]; - let courseName = element.courseName.length > 7 ? element.courseName.substr(0,5)+'...':element.courseName; - longContent = longContent + element.place + courseName; - } - let classTextTempArr = { - type: 'text', - content: longContent, - fontSize: 16, - color: '#fff', - textAlign: 'left', - top: (topMargin + 30) + (2 * (i - 1) * ((screenHeight - 30) / 12) + 5), - left: Number(30 + (j * ((screenWidth - 30) / weekArr.length)) + 5), - breakWord: true, - MaxLineNumber: 7, - width: ((screenWidth - 30) / weekArr.length) - 20 - }; - viewsArr.push(classTextTempArr); - } - } - j++; - } - } - var canvasJson = { - width: screenWidth, - height: screenHeight, - views: viewsArr - }; - that.setData({ - painting: canvasJson - }) - }, - addCalendarNotice: function (e) { - var d = new Date(); - var nowHours = d.getHours(); - nowHours = nowHours > 9 ? nowHours : '0' + nowHours; - var nowMinutes = d.getMinutes(); - nowMinutes = nowMinutes > 9 ? nowMinutes : '0' + nowMinutes; - const nowTimestamp = util.getCourseNoticeTimestamp(this.data.today, `${nowHours}:${nowMinutes}`); - - const targetI = this.data.targetI; - const subacribeCourse = this.data.targetLessons[targetI]; - const courseName = subacribeCourse.courseName; - const startTimeStr = subacribeCourse.startTime; - const endTimeStr = subacribeCourse.endTime == '你猜?' ? startTimeStr : subacribeCourse.endTime; - const place = subacribeCourse.place; - let teacher = subacribeCourse.teacher; - const teachWeek = subacribeCourse.teachWeek; - - var setNoticeStart = util.getCourseNoticeTimestamp(this.data.targetDay, startTimeStr); - var setNoticeEnd = util.getCourseNoticeTimestamp(this.data.targetDay, endTimeStr); - - setNoticeStart = setNoticeStart <= nowTimestamp ? parseInt(setNoticeStart) + 60*60*24*7 : setNoticeStart; - - teacher = this.data.teacher ? subacribeCourse.className : teacher; - let type = this.data.teacher ? '人' : '老师'; - - const description = `【贝壳小盒子】提醒你${teachWeek}您有一节${teacher}${type}的${courseName}课程,${startTimeStr}开始上课,到${endTimeStr}下课,记得按时去上课哦(#^.^#)`; - wx.addPhoneCalendar({ - title: courseName, - startTime: setNoticeStart, - description: description, - location: place, - endTime: setNoticeEnd, - alarmOffset: 60*10 - }); - }, - subscribleMessage: function (e) { - var tmplIds = this.data.teacher ? 'SgteUpl9O6g5Re6TY3FvaHQeZ0RA67cznhOEZ72B11E' : 'SgteUpl9O6g5Re6TY3FvaBQZgsJwU55WuTk0YisjHm8'; - var d = new Date(); - var nowHours = d.getHours(); - nowHours = nowHours > 9 ? nowHours : '0' + nowHours; - var nowMinutes = d.getMinutes(); - nowMinutes = nowMinutes > 9 ? nowMinutes : '0' + nowMinutes; - const nowTimestamp = util.getCourseNoticeTimestamp(this.data.today, `${nowHours}:${nowMinutes}`); - - const targetI = this.data.targetI; - const subacribeCourse = this.data.targetLessons[targetI]; - const courseName = subacribeCourse.courseName; - var startTimeStr = subacribeCourse.startTime; - const endTimeStr = subacribeCourse.endTime == '你猜?' ? startTimeStr : subacribeCourse.endTime; - const place = subacribeCourse.place; - let teacher = subacribeCourse.teacher; - const teachWeek = subacribeCourse.teachWeek; - teacher = this.data.teacher ? subacribeCourse.className : teacher; - let type = this.data.teacher ? '人' : '老师'; - var setNoticeStart = util.getCourseNoticeTimestamp(this.data.targetDay, startTimeStr); - setNoticeStart = setNoticeStart <= nowTimestamp ? parseInt(setNoticeStart) + 60*60*24*7 : setNoticeStart; - const description = `${teachWeek}按时上课`; - const openid = app.globalData.openid; - const isTeacher = this.data.teacher; - startTimeStr = util.formatDate(d) + ` ${startTimeStr}`; - - var _this = this; - wx.showModal({ - title: '注意', - content: '受微信小程序官方限制,每次订阅消息仅能下发一条消息提醒,因此只能每次订阅每节课程提醒', - showCancel: false, - success (res) { - wx.requestSubscribeMessage({ - tmplIds: [tmplIds], - success (res) { - if(res[tmplIds]=='accept'){ - _this.sendSubMessage(courseName, place,teacher,startTimeStr, description,setNoticeStart,openid,tmplIds,isTeacher,isTeacher); - } - } - }) - } - }) - }, - sendSubMessage: function (courseName, place,teacher,startTimeStr, description,setNoticeStart,openid,template_id,isTeacher) { - wx.request({ - url: `${app.globalData.domain}/wechat/course/subscrible`, - method: 'POST', - data: { - courseName: courseName, - place: place, - teacher: teacher, - startTime: startTimeStr, - description: description, - setNoticeStart: setNoticeStart, - openid: openid, - template_id: template_id, - isTeacher: isTeacher - }, - success: function(res){ - wx.showToast({ title: res.data.message, icon: 'success' }); - } - }) - }, - shellboxSchedule: function () { - wx.showModal({ - title: '贝壳课程表', - content: '贝壳小盒子现提供安卓桌面插件APP,安装贝壳课程表APP导入课表后可添加到手机桌面小部件', - showCancel: true, - cancelText: '没兴趣', - confirmText: '我试试', - success (res) { - if (res.confirm) { - wx.setClipboardData({ - data: 'https://gitee.com/airmole/shellbox-schedule-kotlin/attach_files/987384/download/shellbox_schedule_1_0_1.apk' - }) - wx.showToast({ - title: '已复制到粘贴版,请粘贴到浏览器下载', - icon: 'none', - duration: 2000 - }); - } else if (res.cancel) { - console.log('用户点击取消') - } - } - }) - } -}); \ No newline at end of file diff --git a/pages/course/my.wxml b/pages/course/my.wxml deleted file mode 100644 index b202315..0000000 --- a/pages/course/my.wxml +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - {{remind}} - - - - - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - - - 周{{item}} - - - 时间 - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - - - - - - - - - - - - - - - {{widItem.place}} - - {{widItem.courseName}} - - - - - {{widItem.length}}项课程 - - {{item.place}}-{{item.courseName}} - - - - - - - - - - - {{timeRowItem.l1}} - {{timeRowItem.t1}} - {{timeRowItem.l2}} - {{timeRowItem.t2}} - - - - - 第十一节课 - 19:10-19:55 - 第十二节课 - 20:00-20:45 - 第十三节课 - 20:50-21:35 - - - - - - - - - - - - - - - - {{cards.place}} - - {{cards.courseName}} - - - - - - - - - - - - - {{myCourseJson.schoolYear}}-{{myCourseJson.semester}}学期 第{{myCourseJson.teachWeek}}周 {{myCourseJson.dayOfWeek}} - - - 桌面组件 - 存图 - - - - - - - 星期{{_days[targetDayIndex==-1?6:targetDayIndex]}} - - 订阅消息 - 日历提醒 - - - - - - - - - - - {{item.courseName}} - - - - 课程 - - - {{targetWid}} - - 教师:{{item.teacher}} - 其他课程 - - - 地点:{{item.place}} - 导航前往 - - - 班级 | 人数:{{item.className}} - - - - 课程时间:{{item.startTime}}上课 | {{item.endTime}}下课 - - - - - 上课周:{{item.teachWeek}} 总学时:{{item.timeSum}} - - - - - - 注:O表示整体调课,P表示部分调课 - - - - - - - - - - - - - - - - - - {{item.courseName}} - - - - 课程 - - - {{targetWid}} - - 教师:{{item.teacher}} - 其他课程 - - - 地点:{{item.place}} - 导航前往 - - - 课程 | 人数:{{item.className}} - - - 课程时间:{{item.startTime}}上课 | {{item.endTime}}下课 - - - 上课周:{{item.teachWeek}} 总学时:{{item.timeSum}} - - - 注:O表示整体调课,P表示部分调课 - - - - - - - - - - - - - - - - - diff --git a/pages/course/search.js b/pages/course/search.js deleted file mode 100644 index f35acf4..0000000 --- a/pages/course/search.js +++ /dev/null @@ -1,139 +0,0 @@ -// pages/course/search.js -var app = getApp(); - -Page({ - data: { - header: { - defaultValue: '', - inputValue: '', - help_status: false, - help_class_status: false - }, - main: { - mainDisplay: true, // main 显示的变化标识 - list: [] - }, - pageType: 'teacher' - }, - bindClearSearchTap: function (e) { - this.setData({ 'main.mainDisplay': true, 'main.total': 0, 'header.inputValue': '' }); - }, - bindSearchInput: function (e) { - if (this.data.main.mainDisplay != false) { - this.setData({ - 'main.mainDisplay': !this.data.main.mainDisplay - }); - } - this.setData({ - 'header.inputValue': e.detail.value - }); - this.search(); - return e.detail.value; - }, - - bindSearchInputClass: function (e) { - if (this.data.main.mainDisplay != false) { - this.setData({ - 'main.mainDisplay': !this.data.main.mainDisplay - }); - } - this.setData({ - 'header.inputValue': e.detail.value - }); - this.searchClass(); - return e.detail.value; - }, - - // 点击搜索教师 - bindConfirmSearchTap: function () { - this.search(); - }, - // 点击搜索班级 - bindConfirmSearchTapClass: function () { - this.searchClass(); - }, - // 搜索教师 - search: function (key) { - if (this.data.header.inputValue.length < 1) { - wx.showToast({ title: '请输入教师名', image: '/images/info.png' }); - return; - } - var that = this; - var uid = app.globalData.edusysUserInfo.uid - wx.request({ - url: app.globalData.domain + '/edu/teacher/courseSchedule/index', - data: { uid: uid, keyword: that.data.header.inputValue }, - success: function (res) { - if (res.data.code == '500') { - wx.showToast({ title: '系统异常', image: '/images/info.png' }) - return - } - that.setData({ 'main.list': res.data }) - } - }) - - }, - // 搜索班级 - searchClass: function (key) { - if (this.data.header.inputValue.length < 1) { - wx.showToast({ title: '请输入班级名', image: '/images/info.png' }); - return; - } - var that = this; - var uid = app.globalData.edusysUserInfo.uid; - wx.request({ - url: app.globalData.domain + '/edu/class/courseSchedule/index', - data: { uid: uid, keyword: that.data.header.inputValue }, - success: function (res) { - if (res.data.code == '500') { - wx.showToast({ title: '教务异常不可查', image: '/images/info.png' }); - return; - } - that.setData({ 'main.list': res.data }) - } - }) - - }, - onLoad: function (options) { - var that = this; - if (options.type == 'class') { - wx.setNavigationBarTitle({ title: '班级课表查询' }); - that.setData({ pageType: 'class' }); - } else { - that.setData({ pageType: 'teacher' }); - } - - // 支持朋友圈分享 - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - - tapHelp: function (e) { - if (e.target.id == 'help') { - this.hideHelp(); - } - }, - showHelp: function (e) { - // console.log(e) - var that = this; - that.setData({ 'header.help_status': true }); - }, - showHelpClass: function (e) { - // console.log(e) - var that = this; - that.setData({ 'header.help_class_status': true }); - }, - hideHelp: function (e) { - this.setData({ 'header.help_status': false, 'header.help_class_status': false }); - }, - onShareAppMessage: function (res) { - var pageType = this.data.pageType; - var pageTypeText = pageType == 'teacher' ? '教师' : '班级'; - return { - title: `${pageTypeText}课表查询 - 贝壳小盒子`, - path: `pages/course/search?type=${pageType}`, - } - }, -}); diff --git a/pages/course/search.json b/pages/course/search.json deleted file mode 100644 index 340e245..0000000 --- a/pages/course/search.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "navigationBarBackgroundColor": "#9f8bea", - "navigationBarTitleText": "教师课表查询", - "backgroundColor": "#9f8bea", - "enablePullDownRefresh": false, - "navigationStyle": "default" -} \ No newline at end of file diff --git a/pages/course/stulist/content.js b/pages/course/stulist/content.js deleted file mode 100644 index 8c34a9e..0000000 --- a/pages/course/stulist/content.js +++ /dev/null @@ -1,38 +0,0 @@ -// pages/course/stulist/content.js -var app = getApp(); -Page({ - - /** - * 页面的初始数据 - */ - data: { - StatusBar: app.globalData.StatusBar, - CustomBar: app.globalData.CustomBar, - isLoading: true, - title: '', - code: '' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - // console.log(options) - let courseName = options.course; - let code = options.code; - this.setData({ title: courseName, code: code }); - this.getStulist(code); - }, - getStulist: function(code) { - var _this = this; - wx.request({ - url: `${app.globalData.domain}/edu/stulist/${code}`, - method: "GET", - timeout: app.globalData.requestTimeout, - success: function(res) { - wx.vibrateShort({ type: 'medium' }) - _this.setData({ students: res.data, isLoading: false }); - } - }) - } -}) \ No newline at end of file diff --git a/pages/course/stulist/content.json b/pages/course/stulist/content.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/course/stulist/content.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/course/stulist/content.wxml b/pages/course/stulist/content.wxml deleted file mode 100644 index b052758..0000000 --- a/pages/course/stulist/content.wxml +++ /dev/null @@ -1,36 +0,0 @@ - - - 课堂花名册 - - - - - - - - - - {{title}} - - - - Tips:老师老师,长按可选择复制文字内容哟(^U^) - - - - - - - - {{item.serialNo}}. {{item.studentName}} - - ({{item.gender}}) {{item.major}} {{item.className}} - - - {{item.studentID}} - - - - - - \ No newline at end of file diff --git a/pages/course/stulist/content.wxss b/pages/course/stulist/content.wxss deleted file mode 100644 index 27c0873..0000000 --- a/pages/course/stulist/content.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/course/stulist/content.wxss */ -@import "../../school/calendar.wxss"; - -page{ - background-color: var(--cyan); -} \ No newline at end of file diff --git a/pages/course/stulist/index.js b/pages/course/stulist/index.js deleted file mode 100644 index c4e8bf5..0000000 --- a/pages/course/stulist/index.js +++ /dev/null @@ -1,63 +0,0 @@ -// pages/course/stulist/index.js -var app = getApp(); -Page({ - - /** - * 页面的初始数据 - */ - data: { - StatusBar: app.globalData.StatusBar, - CustomBar: app.globalData.CustomBar, - isLoading: true, - courseIndex: [] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.getCourseIndex(); - }, - getCourseIndex: function () { - // console.log(app.globalData.edusysUserInfo) - var _this = this; - var uid = app.globalData.edusysUserInfo.uid; - var pwd = app.globalData.edusysUserInfo.password; - - wx.request({ - url: `${app.globalData.domain}/edu/profile`, - data: { uid: uid, pwd: pwd }, - timeout: 6000, - method: 'POST', - success: function(res){ - try { - if(res.data.name.length>1){ - res.data.password = pwd - wx.setStorage({ data: res.data, key: 'edusysUserInfo' }) - app.globalData.edusysUserInfo = res.data - _this.setData({ courseIndex: res.data.allCourses, isLoading: false }) - wx.vibrateShort({ type: 'medium' }) - } - } catch (error) { - console.log(error) - if(app.globalData.hasEdusysStorage){ - _this.setData({ courseIndex: app.globalData.edusysUserInfo.allCourse }) - } else { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - wx.clearStorage({ - success: (res) => { - app.globalData.edusysUserInfo = {}; - app.globalData.hasEdusysStorage = false; - wx.navigateTo({ url: '../../index/login' }); - }, - }) - } - } - } - }) - } -}) \ No newline at end of file diff --git a/pages/course/stulist/index.json b/pages/course/stulist/index.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/course/stulist/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/course/stulist/index.wxml b/pages/course/stulist/index.wxml deleted file mode 100644 index 2b8b4ea..0000000 --- a/pages/course/stulist/index.wxml +++ /dev/null @@ -1,31 +0,0 @@ - - - 花名册 - 贝壳小盒子 - - - - - - - - - - 上课学生花名册列表 - - - - 老师老师,您想看哪门课程的花名册? - - - - - - - {{item.courseName}} - {{item.className}} - - - - - - \ No newline at end of file diff --git a/pages/course/stulist/index.wxss b/pages/course/stulist/index.wxss deleted file mode 100644 index 4e63afc..0000000 --- a/pages/course/stulist/index.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/course/stulist/index.wxss */ -@import "../../school/calendar.wxss"; - -page{ - background-color: var(--cyan); -} \ No newline at end of file diff --git a/pages/electricity/electricityBind.js b/pages/electricity/electricityBind.js new file mode 100644 index 0000000..2aead25 --- /dev/null +++ b/pages/electricity/electricityBind.js @@ -0,0 +1,144 @@ +// pages/electricity/electricityBind.js +var app = getApp() +Page({ + /** + * 页面的初始数据 + */ + data: { + array: ["选择宿舍楼斋", "3斋", "4斋", "5斋", "6斋", "7斋", "9斋", "10斋", "11斋", "12斋", "13斋", "14斋", "15斋", "16斋", "18斋", "19斋", "20斋", "21斋", "22斋", "25斋", "26斋", "27斋", "28斋", "29斋", "30斋", "31斋", "32斋", "33斋", "34斋", "35斋", "36斋"], + zhaiArray: ["0", "3", "4", "5", "6", "7", "9", "10", "11", "12", "13", "14", "15", "16", "18", "19", "20", "21", "22", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"], + index: 0, + room: '', + eleJson: "", + room_focus: false, + angle: 0, + isBind: true + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + var building = wx.getStorageSync('building'); + var roomNo = wx.getStorageSync('roomNo'); + let that = this; + if (building != "" && roomNo != '') { + app.globalData.building = building; + app.globalData.roomNo = roomNo; + wx.redirectTo({ + url: './electricityFare?zhai=' + that.data.zhaiArray[building] + '&room=' + roomNo, + }) + } else { + that.setData({ + isBind: false + }); + } + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + bindPickerChange: function (e) { + this.setData({ + index: e.detail.value + }) + }, + inputFocus: function (e) { + var id = e.target.id, + newData = {}; + newData[id + '_focus'] = true; + this.setData(newData); + }, + roomInput: function (e) { + this.setData({ + 'room': e.detail.value + }); + if (e.detail.value.length >= 3) { + wx.hideKeyboard(); + } + }, + //提交表单 + formSubmit: function (e) { + // console.log('form发生了submit事件,携带数据为:' + this.data.zhaiArray[e.detail.value.building]); + // console.log('form发生了submit事件,携带数据为:' + e.detail.value.roomNo); + let that = this; + if (e.detail.value.building == 0) { + wx.showToast({ + title: '宿舍楼斋有误', + image: '/images/info.png', + icon: 'none', + duration: 1000 + }); + } else { + var regNum = new RegExp('[1-4][0-4][0-9]', 'g'); //判断用户输入的宿舍号是否大致合适 + var rsNum = regNum.exec(e.detail.value.roomNo); + if (!rsNum) { + wx.showToast({ + title: '寝室号输入有误', + image: '/images/info.png', + icon: 'none', + duration: 1000 + }); + } else { + //楼斋和寝室号码大致是对的 + wx.request({ + url: app.globalData.apiURL + '/electricityFare/eleQueryServicewith7day.php?zhai=' + that.data.zhaiArray[e.detail.value.building] + '&room=' + e.detail.value.roomNo, + success: function (res) { + that.setData({ + eleJson: res.data, + }) + console.log(res.data); + //查询出错 + if (res.data.Balance == '0.00' && res.data.LastRecharge == '0.00' && res.data.yesterdayAircon == '0.00' && res.data.yesterdaySocket == '0.00') { + wx.showToast({ + title: '该房间电费有误', + image: '/images/info.png', + icon: 'none', + duration: 5000 + }); + } else { + //设置本地Storage,维持登录态用 + wx.setStorageSync('building', that.data.zhaiArray[e.detail.value.building]); + wx.setStorageSync('roomNo', e.detail.value.roomNo); + wx.redirectTo({ + url: '/pages/electricity/electricityFare?zhai=' + that.data.zhaiArray[e.detail.value.building] + '&room=' + e.detail.value.roomNo + }) + } + } + }) + } + } + }, +}) \ No newline at end of file diff --git a/pages/index/login.json b/pages/electricity/electricityBind.json similarity index 60% rename from pages/index/login.json rename to pages/electricity/electricityBind.json index aae0242..7df7fc6 100644 --- a/pages/index/login.json +++ b/pages/electricity/electricityBind.json @@ -1,7 +1,6 @@ { - "navigationStyle": "default", - "navigationBarTitleText": "登录", - "navigationBarBackgroundColor": "#7acfa6", + "navigationBarTitleText": "绑定寝室 - 贝壳小盒子", "enablePullDownRefresh": false, + "navigationBarBackgroundColor": "#7acfa6", "disableScroll": true } \ No newline at end of file diff --git a/pages/electricity/electricityBind.wxml b/pages/electricity/electricityBind.wxml new file mode 100644 index 0000000..65d0071 --- /dev/null +++ b/pages/electricity/electricityBind.wxml @@ -0,0 +1,29 @@ + + + + + + + + + + + 完善信息 + + + 寝室楼栋 + + {{array[index]}} + + + + 寝室号 + + + + + + + + + \ No newline at end of file diff --git a/pages/elesys/bind.wxss b/pages/electricity/electricityBind.wxss similarity index 92% rename from pages/elesys/bind.wxss rename to pages/electricity/electricityBind.wxss index 8e0a111..8d5d67d 100644 --- a/pages/elesys/bind.wxss +++ b/pages/electricity/electricityBind.wxss @@ -1,5 +1,5 @@ -/* pages/elesys/bind.wxss */ -@import "../index/login.wxss"; +/* pages/electricity/electricityBind.wxss */ +@import '../index/index.wxss'; .container { height: auto; @@ -64,4 +64,4 @@ width: 11pt; height: 11pt; margin: 0 5rpx; -} \ No newline at end of file +} diff --git a/pages/electricity/electricityFare.js b/pages/electricity/electricityFare.js new file mode 100644 index 0000000..6a68aa9 --- /dev/null +++ b/pages/electricity/electricityFare.js @@ -0,0 +1,191 @@ +// pages/electricity/electricityFare.js +var wxCharts = require('../../utils/wxcharts.js'); +var util = require('../../utils/time.js'); +var app = getApp(); +var lineChart = null; +Page({ + /** + * 页面的初始数据 + */ + data: { + zhai: "", + room: "", + eleJson: '', + last7AC: [], + last7KT: [], + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + wx.showToast({ + title: "loading", + icon: "loading", + duration: 5000 + }) + var building = wx.getStorageSync('building'); + var roomNo = wx.getStorageSync('roomNo'); + if (building == "" || roomNo == '') { + wx.redirectTo({ + url: './electricityBind', + }) + } else { + // 调用函数时,传入new Date()参数,返回值是日期和时间 + var time = util.formatTime(new Date()); + // 再通过setData更改Page()里面的data,动态更新页面的数据 + this.setData({ + time: time + }); + var that = this + this.setData({ + zhai: building, + room: roomNo, + }); + wx.request({ + url: app.globalData.apiURL + '/electricityFare/eleQueryServicewith7day.php?zhai=' + building + '&room=' + roomNo, + success: function(res) { + console.log(res.data) + //账号密码错误以下功能实现跳转错误页面 + if (that.isLogin(res) === false) { + wx.redirectTo({ + url: '/pages/error/loginerror' + }) + } + that.setData({ + eleJson: res.data, + last7AC: res.data.last7dayACused, + last7KT: res.data.last7dayKTused + }) + wx.hideToast(); + that.charts(); + } + }) + } + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + return { + title: this.data.zhai + '斋' + this.data.room + '寝室' + '的用电信息', + path: 'pages/electricity/electricityFare?zhai=' + this.data.zhai + "&room=" + this.data.room + } + }, + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + //改房间 + changeRoom: function() { + app.globalData.building = ""; + app.globalData.roomNo = ""; + wx.setStorageSync('building', ''); + wx.setStorageSync('roomNo', ''); + wx.redirectTo({ + url: './electricityBind' + }) + }, + + //图表相关 + touchHandler: function(e) { + // console.log(lineChart.getCurrentDataIndex(e)); + lineChart.showToolTip(e, { + // background: '#7cb5ec', + format: function(item, category) { + return category + ' ' + item.name + ':' + item.data + } + }); + }, + charts: function(e) { + var windowWidth = 320; + try { + var res = wx.getSystemInfoSync(); + windowWidth = res.windowWidth * 0.80; + } catch (e) { + console.error('getSystemInfoSync failed!'); + } + var dfACdata = this.data.last7AC; + var dfKTdata = this.data.last7KT; + lineChart = new wxCharts({ + canvasId: 'lineCanvas', + type: 'line', + categories: ["6天前", "5天前", "4天前", "3天前", "前天", "昨天", "当前"], + animation: true, + background: '#faf9f7', + series: [{ + name: '插座用电', + data: dfACdata, + format: (val) => val + "度" + }, + { + name: '空调用电', + data: dfKTdata, + format: (val) => val + "度" + } + ], + xAxis: { + disableGrid: true + }, + yAxis: { + title: '最近用电曲线图', + format: (val) => val.toFixed(2), + min: 0 + }, + width: windowWidth, + height: 200, + dataLabel: false, + dataPointShape: true, + extra: { + lineStyle: 'curve' + } + }); + }, + + isLogin: function(res) { + if (res.data.Balance === "0.00" && + res.data.LastRecharge === "0.00" && + res.data.yesterdayAircon === "0.00" && + res.data.yesterdaySocket === "0.00") { + return false; + } + return true; + } +}) \ No newline at end of file diff --git a/pages/electricity/electricityFare.json b/pages/electricity/electricityFare.json new file mode 100644 index 0000000..620a830 --- /dev/null +++ b/pages/electricity/electricityFare.json @@ -0,0 +1,6 @@ +{ + "navigationBarBackgroundColor": "#ffcb63", + "navigationBarTitleText": "电费查询 - 贝壳小盒子", + "backgroundColor": "#ffcb63", + "enablePullDownRefresh": false +} \ No newline at end of file diff --git a/pages/elesys/index.wxml b/pages/electricity/electricityFare.wxml similarity index 52% rename from pages/elesys/index.wxml rename to pages/electricity/electricityFare.wxml index 13d49ba..1574422 100644 --- a/pages/elesys/index.wxml +++ b/pages/electricity/electricityFare.wxml @@ -1,13 +1,10 @@ - - - 电费查询 - - - + + + - {{building}}斋{{room}}寝室 - 修改寝室 + {{zhai}}斋{{room}}寝室 + 修改寝室 截至时间:{{time}} @@ -17,45 +14,42 @@ 剩余电量 - {{eleData.balance}}度 + {{eleJson.Balance}} 剩余补助电量 - {{eleData.subsidize}} + {{eleJson.Buzhu}} 上次充值电费 - {{eleData.lastRecharge}} + {{eleJson.LastRecharge}} 今日插座用电 - {{eleData.yesterday.eleSocket}} + {{eleJson.yesterdaySocket}} 今日空调/风扇用电 - {{eleData.yesterday.airConditer}} + {{eleJson.yesterdayAircon}} - + - + - - + + - + - - - \ No newline at end of file diff --git a/pages/elesys/index.wxss b/pages/electricity/electricityFare.wxss similarity index 99% rename from pages/elesys/index.wxss rename to pages/electricity/electricityFare.wxss index 070ad4e..27a48c2 100644 --- a/pages/elesys/index.wxss +++ b/pages/electricity/electricityFare.wxss @@ -1,4 +1,3 @@ -/* pages/elesys/index.wxss */ page { font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; font-size: 10pt; @@ -224,4 +223,4 @@ page { bottom: -2rpx; left: 0; right: 0; -} \ No newline at end of file +} diff --git a/pages/elesys/bind.js b/pages/elesys/bind.js deleted file mode 100644 index 409b9f9..0000000 --- a/pages/elesys/bind.js +++ /dev/null @@ -1,119 +0,0 @@ -// pages/elesys/bind.js -// 获取应用实例 -var app = getApp() -var domain = app.globalData.domain -Page({ - data: { - array: ["选择宿舍楼斋", "1斋", "2斋", "3斋", "4斋", "5斋", "6斋", "7斋", "9斋", "10斋", "11斋", "12斋", "13斋", "14斋", "15斋", "16斋", "17斋", "18斋", "19斋", "20斋", "21斋", "22斋", "23斋", "24斋", "25斋", "26斋", "27斋", "28斋", "29斋", "30斋", "31斋", "32斋", "33斋", "34斋", "35斋", "36斋", "37斋", "39斋", "40斋", "41斋", "42斋"], - zhaiArray: ["0", "1", "2", "3", "4", "5", "6", "7", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "39", "40", "41", "42"], - index: 0, - remind: '加载中', - building_focus: false, - room_focus: false, - room: '', - bgimg: 'https://upload-images.jianshu.io/upload_images/4697920-32f0ab8c6c36493e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - angle: 0 - }, - onLoad: function (){ - }, - onReady: function(){ - var _this = this; - try { - const elesysUserInfo = wx.getStorageSync('elesysUserInfo') || {} - if(elesysUserInfo.building.length > 0) { - wx.redirectTo({ url: `./index?building=${elesysUserInfo.building}&room=${elesysUserInfo.room}` }) - } - } catch (error) { - console.log('未绑定过寝室信息') - } - - setTimeout(function(){ _this.setData({ remind: '' }) }, 1000); - wx.onAccelerometerChange(function(res) { - var angle = -(res.x*30).toFixed(1); - if(angle > 14){ angle = 14 } - else if(angle<-14) { angle = -14 } - if(_this.data.angle !== angle){ - _this.setData({ angle: angle }) - } - }); - }, - bind: function() { - if (!this.vaildForm()) { - return - } - var _this = this; - _this.getData() - }, - getData: function () { - var _this = this - wx.showLoading({ title: 'loading...' }) - var building = this.data.zhaiArray[this.data.index] - var room = this.data.room - wx.request({ - url: `${domain}/elesys/`, - data: { building: building, room: room }, - timeout: app.globalData.requestTimeout, - method: 'GET', - success: function(res){ - wx.hideLoading() - try { - if (res.data.balance.length > 0) { - const elesysUserInfo = {building: building, room: room } - app.globalData.elesysUserInfo = elesysUserInfo - wx.setStorage({ data: elesysUserInfo, key: 'elesysUserInfo' }) - wx.redirectTo({ url: `./index?building=${building}&room=${room}` }) - } - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - }, - vaildForm: function () { - var building = this.data.zhaiArray[this.data.index] - var room = this.data.room - if (building == 0) { - wx.showToast({ - title: '宿舍楼斋有误', icon: 'none' }) - return - } - - var pattern = new RegExp('[1-9][0-4][0-9]', 'g'); //判断用户输入的宿舍号是否大致合适 - var matchReg = pattern.exec(room); - if (!matchReg) { - wx.showToast({ title: '寝室号输入有误', icon: 'none' }) - return - } - return true - }, - inputBlur: function(e){ - if(e.target.id == 'building'){ - this.setData({ - 'building_focus': false - }); - } else if(e.target.id == 'room'){ - this.setData({ - 'room_focus': false - }); - } - }, - bindPickerChange: function (e) { - this.setData({ - index: e.detail.value - }) - }, - inputFocus: function (e) { - var id = e.target.id, - newData = {}; - newData[id + '_focus'] = true; - this.setData(newData); - }, - roomInput: function (e) { - this.setData({ - 'room': e.detail.value - }); - if (e.detail.value.length >= 3) { - wx.hideKeyboard(); - } - }, -}); \ No newline at end of file diff --git a/pages/elesys/bind.wxml b/pages/elesys/bind.wxml deleted file mode 100644 index 673285a..0000000 --- a/pages/elesys/bind.wxml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/pages/elesys/index.js b/pages/elesys/index.js deleted file mode 100644 index cfcc6cd..0000000 --- a/pages/elesys/index.js +++ /dev/null @@ -1,129 +0,0 @@ -// pages/elesys/index.js -var app = getApp() -var util = require('../../utils/util') -var wxCharts = require('../../utils/wxcharts.js') -var lineChart = null -Page({ - /** - * 页面的初始数据 - */ - data: { - isLoading: true, - errorTips: false, - building: "", - room: "", - eleData: '', - isShowUnbind: false - }, - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function(options) { - wx.showLoading({ title: 'loading...' }) - - this.inital(options) - }, - inital: function (options) { - const building = options.building ? options.building : '' - const room = options.room ? options.room : '' - if (building == '' || room == '') { - wx.redirectTo({ url: './bind' }) - return - } - - var time = util.formatTime(new Date()) - this.setData({ time: time, building: building, room: room }) - this.needShowUnbindBtn() - this.getEleData(building, room) - }, - needShowUnbindBtn: function () { - const referer = wx.getLaunchOptionsSync() - const sceneCode = referer.scene - let isShowUnbind = true - if (sceneCode == 1007 || sceneCode == 1008) { - // 分享卡片进来的,不展示”修改寝室“按钮 - isShowUnbind = false - } - this.setData({ isShowUnbind: isShowUnbind }) - }, - // 获取电费数据 - getEleData: function(building, room) { - var _this = this - wx.request({ - url: `${app.globalData.domain}/elesys/`, - data:{ building: building, room: room }, - timeout: app.globalData.requestTimeout, - method: 'GET', - success: function(res){ - wx.hideLoading() - try { - if (res.data.balance.length > 0) { - _this.setData({ eleData: res.data, isLoading: false }) - _this.charts() - } - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - _this.setData({ errorTips: res.data.message, isLoading: false }) - } - }, - fail: function(error) { - console.log(error) - } - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function(res) { - const building = this.data.building - const room = this.data.room - return { - title: `${building}斋${room}寝室的用电信息`, - path: `pages/elesys/index?building=${building}&room=${room}` - } - }, - // 修改解绑寝室信息 - changeRoom: function() { - app.globalData.elesysUserInfo = '' - wx.removeStorageSync('elesysUserInfo') - wx.vibrateShort({ type: 'medium' }) - wx.redirectTo({ url: './bind' }) - }, - // 图表渲染相关 - touchHandler: function(e) { - lineChart.showToolTip(e, { - format: function(item, category) { - return category + ' ' + item.name + ':' + item.data - } - }); - }, - charts: function(e) { - var windowWidth = 320; - try { - var res = wx.getSystemInfoSync(); - windowWidth = res.windowWidth * 0.80; - } catch (e) { - console.error('getSystemInfoSync failed!'); - } - var dfACdata = this.data.eleData.recently.eleSocket - var dfKTdata = this.data.eleData.recently.airConditer - lineChart = new wxCharts({ - canvasId: 'lineCanvas', - type: 'line', - categories: ["6天前", "5天前", "4天前", "3天前", "前天", "昨天", "当前"], - animation: true, - background: '#faf9f7', - series: [ - { name: '插座用电', data: dfACdata, format: (val) => `${val}度` }, - { name: '空调用电', data: dfKTdata, format: (val) => `${val}度` } - ], - xAxis: { disableGrid: true }, - yAxis: { title: '最近用电曲线图', format: (val) => val.toFixed(2), min: 0 }, - width: windowWidth, - height: 200, - dataLabel: false, - dataPointShape: true, - extra: { lineStyle: 'curve' } - }) - } -}) \ No newline at end of file diff --git a/pages/elesys/index.json b/pages/elesys/index.json deleted file mode 100644 index 10ada01..0000000 --- a/pages/elesys/index.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/error/queryerror.js b/pages/error/queryerror.js new file mode 100644 index 0000000..62763a9 --- /dev/null +++ b/pages/error/queryerror.js @@ -0,0 +1,20 @@ +Page({ + data: { + ErrorTips: "好像出了点小问题" + }, + onLoad: function(eri) { + console.log(eri) + var that = this; + if (eri.ErrorTips) { + that.setData({ + ErrorTips: eri.ErrorTips, + }) + } + + }, + goBack: function() { + wx.navigateBack({ + delta: 2 + }) + }, +}) \ No newline at end of file diff --git a/pages/error/queryerror.json b/pages/error/queryerror.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/pages/error/queryerror.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/pages/error/queryerror.wxml b/pages/error/queryerror.wxml new file mode 100644 index 0000000..dc7a06d --- /dev/null +++ b/pages/error/queryerror.wxml @@ -0,0 +1,24 @@ + + + + + + + + {{ErrorTips}} + + + + + + + + Airmole. + + Copyright © 2020 贝壳小盒子(ShellBox) + + \ No newline at end of file diff --git a/pages/error/queryerror.wxss b/pages/error/queryerror.wxss new file mode 100644 index 0000000..fef64d6 --- /dev/null +++ b/pages/error/queryerror.wxss @@ -0,0 +1,70 @@ +@import "../common/weui.wxss"; +Page { + background-color: #7acfa6; +} + +icon { + margin-right: 13px; +} + +.page__bd { + padding-left: 40px; + padding-right: 40px; + text-align: left; +} + +.icon-box { + margin-bottom: 25px; + display: flex; + align-items: center; +} + +.icon-box__ctn { + flex-shrink: 100; +} + +.icon-box__title { + font-size: 20px; +} + +.icon-box__desc { + margin-top: 6px; + font-size: 12px; + color: #888; +} + +.icon_sp_area { + margin-top: 10px; + text-align: left; +} + +.remind-box { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.remind-img { + width: 250rpx; + height: 250rpx; + padding-bottom: 25rpx; +} + +.remind-text { + font-size: 12pt; + line-height: 150%; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 30rpx 30rpx 30rpx; +} diff --git a/pages/features/about.js b/pages/features/about.js new file mode 100644 index 0000000..5a668e8 --- /dev/null +++ b/pages/features/about.js @@ -0,0 +1,105 @@ +// pages/features/about.js +var app = getApp(); +Page({ + + /** + * 页面的初始数据 + */ + data: { + width: '100%', + height: '', + coder: [{ + avatar: 'https://z4a.net/images/2019/06/22/_20180513195821.th.jpg', + nickName: 'Airmole' + }, { + avatar: 'https://z4a.net/images/2019/07/24/_20190724200849.th.jpg', + nickName: '很奔放' + }, { + avatar: 'https://z4a.net/images/2019/06/22/hzj.th.jpg', + nickName: 'hzj' + }], + servicer: [{ + avatar: 'https://z4a.net/images/2019/06/22/_20180513195821.th.jpg', + nickName: 'Airmole' + }, { + avatar: 'https://z4a.net/images/2019/07/24/_20190724200849.th.jpg', + nickName: '很奔放' + }, { + avatar: 'https://z4a.net/images/2019/06/22/hzj.th.jpg', + nickName: 'hzj' + }, { + avatar: 'https://z4a.net/images/2019/06/22/zhx.th.jpg', + nickName: '淡然微笑' + }, { + avatar: 'https://z4a.net/images/2019/06/22/fwj.th.jpg', + nickName: '非晚' + }, { + avatar: 'https://z4a.net/images/2019/08/26/TIM20190826143957.th.jpg', + nickName: 'PastWind' + }], + otherApps: [{ + appid: 'wx183616af30e5723d', + icon: 'https://z4a.net/images/2019/10/17/basicprofile.th.png', + name: '贝壳班车订票' + }, { + appid: 'wx9551f8196258f706', + icon: 'https://z4a.net/images/2019/10/17/1f4934ff45c2510c249666a909acf02c.png', + name: '珠江小盒子' + }] + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + var that = this; + that.setData({ + width: wx.getSystemInfoSync().windowWidth * 0.9 + 'px', + height: wx.getSystemInfoSync().windowWidth * 0.9 * 0.5625 + 'px' + }) + wx.pageScrollTo({ + scrollTop: 1600, + duration: 4000, + }) + setTimeout(function() { + wx.pageScrollTo({ + scrollTop: 0, + duration: 300, + }) + }, 4000); + }, + copyID: function() { + wx.setClipboardData({ + data: 'wxf0ba93e3faff4eda' + }) + wx.showToast({ + title: '已复制到粘贴版', + duration: 1000 + }); + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function() { + + }, + showAppCode: function() { + wx.previewImage({ + current: 'https://z4a.net/images/2019/10/16/777b9dd8ed1f6f82e24795fbab8ddb1c.png', // 当前显示图片的http链接 + urls: ['https://z4a.net/images/2019/10/16/777b9dd8ed1f6f82e24795fbab8ddb1c.png'] // 需要预览的图片http链接列表 + }) + }, + goOtherApps: function(e) { + var appid = e.currentTarget.dataset.appid; + wx.navigateToMiniProgram({ + appId: appid, + success(res) { + // 打开成功 + } + }) + }, + checkUpdate:function(){ + app.appUpdate('userclick'); + } +}) \ No newline at end of file diff --git a/pages/features/about.json b/pages/features/about.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/pages/features/about.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/pages/features/about.wxml b/pages/features/about.wxml new file mode 100644 index 0000000..82a316f --- /dev/null +++ b/pages/features/about.wxml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + 贝壳小盒子 + 公测2.3.3 + + + 版本更新 + + + + + 简介 + 贝壳小盒子(ShellBox)是一款微信小程序,致力于帮助我们北京科技大学天津学院的师生更方便的查询教务、图书、用电等信息,以及浏览学院校历、拨打各系部电话,并提供校园内地理导航等功能。 + 贝壳小盒子目前还处于公测阶段,有一系列新的功能正在我们的开发计划中。“你想要的,都在这里!” + + 数据来源 + * 课表、成绩等数据来自教务处官网;\r\n* 图书相关信息来自图书馆官网以及豆瓣;\r\n* 校历、各系部联系电话来自于学院官方网站;\r\n* 用电数据、网费信息来自智慧校园\r\n* 四六级准考证信息来自教育部考试中心 + 开发贡献 + + + + + + {{item.nickName}} + + + 咨询客服 + + + + + + {{item.nickName}} + + + 关联贝壳小盒子 + 若您或者您的朋友在运营与本校相关的公众号(学生组织/社团/校园自媒体等),「贝壳小盒子」诚挚地欢迎您的公众号关联我们的小程序,并期待合作!\r\n + AppID:wxf0ba93e3faff4eda + 其他小程序 + + + + + + {{item.name}} + + + + + + + + + + + + + Airmole. + + 贝壳小盒子(ShellBox) + Copyright @ 2020 All Rights Reserved + + \ No newline at end of file diff --git a/pages/school/aboutus.wxss b/pages/features/about.wxss similarity index 57% rename from pages/school/aboutus.wxss rename to pages/features/about.wxss index ca22820..3c75290 100644 --- a/pages/school/aboutus.wxss +++ b/pages/features/about.wxss @@ -1,9 +1,11 @@ -/* pages/school/aboutus.wxss */ +/* pages/features/about.wxss */ + .page { background-color: #7acfa6; } .container { + background: #f4f4f4; padding: 0; font-size: 11pt; } @@ -160,6 +162,98 @@ padding-bottom: 15rpx; } -.avatar-border{ - border: 2px solid var(--wegreen); -} \ No newline at end of file +.footer { + display: flex; + flex-direction: column; + font-size: 9pt; + line-height: 150%; + text-align: center; + margin: 50rpx 0 15rpx; + color: #c2c2c2; +} + +.footer-beingshawn { + font-size: 10pt; + height: 10pt; + line-height: 10pt; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 8rpx; +} + +.footer-beingshawn image { + width: 10pt; + height: 10pt; + margin-right: 5rpx; +} + +.userinfo-avatar { + margin: 0 auto; + border-radius: 50rpx; + clip-path: circle(50% at center); + width: 110rpx; + height: 110rpx; + box-shadow: 5rpx 5rpx 15rpx #ccc; + justify-content: center; + align-items: center; + flex-direction: row; +} + +.coperatorName { + justify-content: center; + align-items: center; + flex-direction: row; +} + +.oneAvatar { + text-align: center; + float: left; + width: 110rpx; + height: 140rpx; + font-size: 26rpx; + margin-right: 5px; + margin-bottom: 15px; +} + +.oneApp { + text-align: center; + float: left; + width: 180rpx; + height: 140rpx; + font-size: 26rpx; + margin-right: 5px; + margin-bottom: 15px; + justify-content: center; + align-items: center; + flex-direction: row; +} + +.button-sp-area { + padding: 30rpx 35rpx; +} + +button[type="primary"][plain] { + color: #fff; + border: 1px solid #96deda; + background-image: linear-gradient(-45deg, #7acfa6 0%, #7acfa6 50%); + border-radius: 50px; +} + +.button-hover[type="primary"][plain] { + color: #fff; + border-color: #96deda; + opacity: 0.6; +} + +button[type="default"][plain] { + color: #fff; + border: 1px solid #fbc2eb; + background-image: linear-gradient(-45deg, #7acfa6 0%, #7acfa6 50%); +} + +.button-hover[type="default"][plain] { + color: #fff; + border-color: #fbc2eb; + opacity: 0.6; +} diff --git a/pages/features/features.js b/pages/features/features.js new file mode 100644 index 0000000..85657b4 --- /dev/null +++ b/pages/features/features.js @@ -0,0 +1,213 @@ +// pages/features/features.js +var app = getApp() +Page({ + /** + * 页面的初始数据 + */ + data: { + uid: '', + pwd: '', + cores: [ + [{ + id: 'grkb', + name: '个人课表', + url: '/pages/index/vcode?to=grkb&update=0', + needLogin: true + }, { + id: 'jskb', + name: '教师课表', + url: '/pages/classQuery/jskb?type=teacher', + needLogin: true + }, { + id: 'bjkb', + name: '班级课表', + url: '/pages/classQuery/jskb?type=class', + needLogin: true + }, + { + id: 'wfcx', + name: '网费查询', + url: '/pages/net/netBind', + needLogin: true + }, + { + id: 'xl', + name: '校历', + url: '/pages/calendar/calendar', + needLogin: false + }, + { + id: 'jyxx', + name: '我的借阅', + url: '/pages/opac/bind', + needLogin: false + }, + { + id: 'smcs', + name: '扫码查书', + url: '/pages/bookSearch/isbn/iputIsbn', + needLogin: false + }, + { + id: 'cjcx', + name: '成绩查询', + url: '/pages/index/vcode?to=score&update=0', + needLogin: true + }, + { + id: 'dfcx', + name: '电费查询', + url: '/pages/electricity/electricityBind', + needLogin: true + }, { + id: 'xycx', + name: '校园出行', + url: '/pages/Transport/Transport', + needLogin: false + } + ], + [{ + id: 'xydh', + name: '校园导航', + url: '/pages/schoolNav/schoolNav', + needLogin: false + }, { + id: 'tel', + name: '常用电话', + url: '/pages/tel/tel', + needLogin: false + }, { + id: 'gyhz', + name: '关于盒子', + url: '/pages/features/about', + needLogin: false + }] + ], + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + wx.showToast({ + title: "loading", + icon: "loading", + duration: 5000 + }) + if (uid != '' && pwd != '') { + that.setData({ + uid: uid, + pwd: pwd, + }); + // console.log(that.data.uid + '-' + that.data.pwd) + } + wx.hideToast() + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + var that = this; + that.onLoad(); + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + if (res.from === 'button') { + // 来自页面内转发按钮 + } + return { + title: '还没用过 “贝壳小盒子”😱还不快来试试?', + path: 'pages/features/features', + success: function(res) { + // 转发成功 + }, + fail: function(res) { + // 转发失败 + } + } + }, + //账户注销登录 + logout: function() { + try { + wx.clearStorageSync() + } catch (e) { + // Do something when catch error + } + app.globalData.uid = ""; + app.globalData.pwd = ""; + app.globalData.newpwd = ""; + wx.setStorageSync('uid', ''); + wx.setStorageSync('pwd', ''); + wx.setStorageSync('newpwd', ''); + wx.setStorageSync('netPassword', ''); + wx.setStorageSync('building', ''); + wx.setStorageSync('roomNo', ''); + wx.redirectTo({ + url: '/pages/index/index' + }) + }, + //未登录点击功能 + disabled_item: function(ds) { + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + console.log(ds.currentTarget.dataset); + let index = ds.currentTarget.dataset.id; + let sindex = ds.currentTarget.dataset.sindex; + + if (this.data.cores[0][sindex].needLogin == true && (uid == "" || pwd == "")) { + wx.showToast({ + icon: 'none', + title: '本功能需要登录', + }) + } else { + // console.log(this.data.cores) + wx.navigateTo({ + url: this.data.cores[index][sindex].url, + }) + } + + } + +}) \ No newline at end of file diff --git a/pages/features/features.json b/pages/features/features.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/pages/features/features.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/pages/features/features.wxml b/pages/features/features.wxml new file mode 100644 index 0000000..179784e --- /dev/null +++ b/pages/features/features.wxml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + {{uid}} + + 您还没有登录绑定🙄 + + + + + + + + + + + + + + + + + + + + + {{item.name}} + + + + + + + + + + + + + + + + 注销登录 + + + + \ No newline at end of file diff --git a/pages/features/features.wxss b/pages/features/features.wxss new file mode 100644 index 0000000..f1b778b --- /dev/null +++ b/pages/features/features.wxss @@ -0,0 +1,250 @@ +/* pages/features/features.wxss */ +@import "../common/weui.wxss"; + +.radius { + border-radius: 15px; + overflow: hidden; +} + +.userinfo-avatar { + border-radius: 50rpx; + clip-path: circle(50% at center); + width: 120rpx; + height: 120rpx; + box-shadow: 5rpx 5rpx 15rpx #ccc; +} + +.ads { + padding: 10rpx 15rpx 0rpx 15rpx; +} + +.GreenBG { + background-color: #7acfa6; +} + +button::after { + border: none; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 0 30rpx 30rpx; +} + +.shareIcon { + width: 26px; + height: 26px; + vertical-align: middle; +} + +button { + font-size: 14px; + widows: 137.8625px; + /* height: 74.200px; */ +} + +.swiper { + height: 400rpx; + width: 100%; +} + +.swiper image { + height: 100%; + width: 100%; +} + +.logout-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #e55c5c; + color: #fff; + text-align: center; + border-radius: 25px; + margin: 40rpx 3%; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #7acfa6; + color: #fff; + text-align: center; + border-radius: 25px; + margin: 40rpx 3%; +} + +/**功能导航**/ + +.main-core { + display: flex; + flex-flow: row wrap; + align-content: flex-start; + background: #fff; + border-bottom: 1rpx solid #e5e5e5; + padding: 15rpx 10rpx 10rpx; + min-height: 350rpx; + overflow: hidden; + border-radius: 15rpx; +} + +.main-core-item { + display: flex; + flex-flow: column wrap; + justify-content: center; + align-items: center; + box-sizing: border-box; + width: 20%; + height: 170rpx; +} + +.main-core-item.disabled { + color: #9c9c9c; +} + +.core-item-icon { + display: block; + width: 85rpx; + height: 85rpx; + margin: 15rpx auto; +} + +.core-item-name { + display: block; + margin: 5rpx; +} + +.main-swpier { + height: 390rpx; + margin: 0rpx 0rpx 10rpx 0rpx; + padding-top: 0rpx; +} + +.main-swpier .wx-swiper-dots.wx-swiper-dots-horizontal { + bottom: 0; + margin-bottom: -5rpx; +} + +.main-card { + padding-bottom: 300rpx; +} + +.main-card-item { + display: flex; + flex-direction: column; + background: #fff; + border-top: 1rpx solid #e5e5e5; + border-bottom: 1rpx solid #e5e5e5; + margin-bottom: 20rpx; + background-repeat: no-repeat; + background-size: 100% auto; + background-position: bottom center; + overflow: hidden; +} + +.card-item-hd { + display: flex; + align-items: center; + height: 75rpx; + border-bottom: 1rpx solid #e5e5e5; + margin-left: 30rpx; +} + +.card-item-name { + letter-spacing: 2px; +} + +.card-item-more { + flex: 1; + display: flex; + align-items: center; + justify-content: flex-end; + padding-right: 25rpx; +} + +.card-item-open { + width: 30rpx; + height: 30rpx; +} + +.card-item-bd { + padding: 20rpx 25rpx 30rpx 0; + margin-left: 30rpx; + display: flex; + flex-direction: column; +} + +.card-info-hd { + display: flex; + justify-content: space-between; +} + +.card-info-left { + display: flex; + flex-direction: column; +} + +.card-info-right { + display: flex; + color: #acacac; + flex-direction: column; +} + +.card-info-name { + font-size: 16pt; + line-height: 1.2; + letter-spacing: 1px; + color: #acacac; +} + +.card-info-number { + line-height: 175%; + text-indent: 1px; + color: #aaa; +} + +.main-ending { + display: none; + /*display: flex;*/ + align-items: center; + justify-content: center; + width: 100%; + margin-top: 75rpx; + overflow: hidden; +} + +.main-ending-text { + width: 72pt; + color: #ccc; + font-size: 8pt; + padding: 0 16rpx; + text-align: center; + white-space: nowrap; +} + +/* 客服钮的 */ + +.img-plus-style { + height: 100rpx; + width: 100rpx; + position: fixed; + top: 40rpx; + right: 25rpx; + opacity: 0.7; +} + +.zindex100 { + z-index: 100; +} + +.yc { + opacity: 0; +} diff --git a/pages/index/component/feecard.js b/pages/index/component/feecard.js deleted file mode 100644 index 3ade92e..0000000 --- a/pages/index/component/feecard.js +++ /dev/null @@ -1,85 +0,0 @@ -// pages/index/component/feecard.js -Component({ - options: { - styleIsolation: 'shared' - }, - /** - * 组件的属性列表 - */ - properties: { - isShow: { - type: Boolean, - value: false - }, - title: { - type: String, - value: '' - }, - titleRight: { - type: String, - value: '' - }, - bindedUrl: { - type: String, - value: '' - }, - unbindUrl: { - type: String, - value: '' - }, - bindedShow: { - type: Boolean, - value: false - }, - unbindShow: { - type: Boolean, - value: false - }, - bindedAccount: { - type: String, - value: '' - }, - timeText: { - type: String, - value: '' - }, - contentTextLeft: { - type: String, - value: '' - }, - contentTextRight: { - type: String, - value: '' - }, - contentValue: { - type: String, - value: '' - }, - unbindTips: { - type: String, - value: '' - }, - unbindButton: { - type: String, - value: '' - }, - unbindTipsShowImage: { - type: Boolean, - value: true - }, - }, - - /** - * 组件的初始数据 - */ - data: { - - }, - - /** - * 组件的方法列表 - */ - methods: { - - } -}) diff --git a/pages/index/component/feecard.json b/pages/index/component/feecard.json deleted file mode 100644 index e00c0f3..0000000 --- a/pages/index/component/feecard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "tips": "./tips" - } -} \ No newline at end of file diff --git a/pages/index/component/feecard.wxml b/pages/index/component/feecard.wxml deleted file mode 100644 index b9b3b91..0000000 --- a/pages/index/component/feecard.wxml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - {{title}} - - {{titleRight}} - - - - - {{bindedAccount}} - {{timeText}} - - - - {{contentTextLeft}} - {{contentValue}} - {{contentTextRight}} - - - - - - - - - - - \ No newline at end of file diff --git a/pages/index/component/feecard.wxss b/pages/index/component/feecard.wxss deleted file mode 100644 index f42a402..0000000 --- a/pages/index/component/feecard.wxss +++ /dev/null @@ -1,15 +0,0 @@ -/* pages/index/component/feecard.wxss */ -/* @import "../../../colorui/main.wxss"; -@import "../../../colorui/icon.wxss"; */ - -.df-value { - color: #ffbf92; - font-size: 46pt; - font-weight: bold; - padding: 0 15rpx; -} - -.df-text { - color: #acacac; - font-size: 13pt; -} diff --git a/pages/index/component/imagemodal.js b/pages/index/component/imagemodal.js deleted file mode 100644 index 3282e15..0000000 --- a/pages/index/component/imagemodal.js +++ /dev/null @@ -1,51 +0,0 @@ - -// pages/index/component/tips.js -Component({ - options: { - styleIsolation: 'shared' - }, - /** - * 组件的属性列表 - */ - properties: { - hideBtnText: { - type: String, - value: '好的' - }, - image: { - type: String, - value: '' - }, - height: { - type: Number, - value: 550 - }, - width: { - type: Number, - value: 375 - }, - showModal: { - type: Boolean, - value: false - } - }, - - /** - * 组件的初始数据 - */ - data: { - - }, - - /** - * 组件的方法列表 - */ - methods: { - _hideModal: function() { - this.setData({ showModal: false }) - }, - _previewImage:function (e) { - wx.previewImage({ urls: e.currentTarget.dataset.allurl, current: e.currentTarget.dataset.url }) - }, - } -}) diff --git a/pages/index/component/imagemodal.json b/pages/index/component/imagemodal.json deleted file mode 100644 index 32640e0..0000000 --- a/pages/index/component/imagemodal.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "component": true -} \ No newline at end of file diff --git a/pages/index/component/imagemodal.wxml b/pages/index/component/imagemodal.wxml deleted file mode 100644 index d9ed65c..0000000 --- a/pages/index/component/imagemodal.wxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - {{hideBtnText}} - - - \ No newline at end of file diff --git a/pages/index/component/imagemodal.wxss b/pages/index/component/imagemodal.wxss deleted file mode 100644 index 009b34d..0000000 --- a/pages/index/component/imagemodal.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/index/component/tips.wxss */ \ No newline at end of file diff --git a/pages/index/component/privacyPopup/privacyPopup.js b/pages/index/component/privacyPopup/privacyPopup.js deleted file mode 100644 index 84c60e4..0000000 --- a/pages/index/component/privacyPopup/privacyPopup.js +++ /dev/null @@ -1,64 +0,0 @@ -// pages/index/component/privacyPopup/privacyPopup.js -Component({ - options: { - styleIsolation: 'shared' - }, - /** - * 组件的属性列表 - */ - properties: { - - }, - - /** - * 组件的初始数据 - */ - data: { - innerShow: false, - contractName: '《用户隐私保护指引》' - }, - lifetimes: { - attached: function () { - if (wx.getPrivacySetting) { - wx.getPrivacySetting({ - success: res => { - console.log("是否需要授权:", res.needAuthorization, "隐私协议的名称为:", res.privacyContractName) - this.setData({ contractName: res.privacyContractName }) - if (res.needAuthorization) { - this.popUp() - } else { - this.triggerEvent("agree") - } - }, - fail: () => { }, - complete: () => { }, - }) - } else { - // 低版本基础库不支持 wx.getPrivacySetting 接口,隐私接口可以直接调用 - this.triggerEvent("agree") - } - }, - }, - /** - * 组件的方法列表 - */ - methods: { - handleDisagree(e) { - this.triggerEvent("disagree") - this.disPopUp() - }, - handleAgree(e) { - this.triggerEvent("agree") - this.disPopUp() - }, - popUp() { - this.setData({ innerShow: true }) - }, - disPopUp() { - this.setData({ innerShow: false }) - }, - openPrivacyContract() { - wx.openPrivacyContract() - } - } -}) diff --git a/pages/index/component/privacyPopup/privacyPopup.json b/pages/index/component/privacyPopup/privacyPopup.json deleted file mode 100644 index e8cfaaf..0000000 --- a/pages/index/component/privacyPopup/privacyPopup.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "component": true, - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/index/component/privacyPopup/privacyPopup.wxml b/pages/index/component/privacyPopup/privacyPopup.wxml deleted file mode 100644 index 25ce22f..0000000 --- a/pages/index/component/privacyPopup/privacyPopup.wxml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 用户隐私保护提示 - - - - - 首先,感谢您使用微信小程序《贝壳小盒子》,应微信团队官方《关于小程序隐私保护指引设置的公告》要求,在您使用本小程序之前请您务必授权同意本小程序相关的 - {{contractName}} - 当您点击同意并开始时用产品服务时,即表示你已理解并同息该条款内容,该条款将对您产生法律约束力。如您拒绝,将无法正常使用本小程序部分功能,包括不限于:正常显示微信头像昵称,保存成绩分享图,添加上课日程到手机,参与运动榜单排行等功能。 - - - - - - - - \ No newline at end of file diff --git a/pages/index/component/tips.js b/pages/index/component/tips.js deleted file mode 100644 index 1b4d946..0000000 --- a/pages/index/component/tips.js +++ /dev/null @@ -1,33 +0,0 @@ -// pages/index/component/tips.js -Component({ - options: { - styleIsolation: 'isolated' - }, - /** - * 组件的属性列表 - */ - properties: { - tipsText: { - type: String, - value: '温馨提示' - }, - showImage: { - type: Boolean, - value: true - } - }, - - /** - * 组件的初始数据 - */ - data: { - - }, - - /** - * 组件的方法列表 - */ - methods: { - - } -}) diff --git a/pages/index/component/tips.json b/pages/index/component/tips.json deleted file mode 100644 index 32640e0..0000000 --- a/pages/index/component/tips.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "component": true -} \ No newline at end of file diff --git a/pages/index/component/tips.wxml b/pages/index/component/tips.wxml deleted file mode 100644 index add713e..0000000 --- a/pages/index/component/tips.wxml +++ /dev/null @@ -1,5 +0,0 @@ - - - - {{tipsText}} - \ No newline at end of file diff --git a/pages/index/component/tips.wxss b/pages/index/component/tips.wxss deleted file mode 100644 index a073e8c..0000000 --- a/pages/index/component/tips.wxss +++ /dev/null @@ -1,18 +0,0 @@ -/* pages/index/component/tips.wxss */ - -.remind-box { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} -.remind-img { - width: 250rpx; - height: 250rpx; - padding-bottom: 25rpx; -} - -.cu-form-group .title { - min-width: calc(4em + 30rpx); -} diff --git a/pages/index/feature.js b/pages/index/feature.js deleted file mode 100644 index 3cc6ab4..0000000 --- a/pages/index/feature.js +++ /dev/null @@ -1,445 +0,0 @@ -const app = getApp(); -Page({ - data: { - StatusBar: app.globalData.StatusBar, - CustomBar: app.globalData.CustomBar, - hasEdusysStorage: false, - edusysUserInfo: {}, - userInfo: {}, - isTeacher: false, - clickAvatarCount: 1, - backgroundImage: 'https://upload-images.jianshu.io/upload_images/4697920-48dab9eddafb6ce3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - defaultAvatar: app.globalData.defaultGrayAvatar, - canShake: false, - iconList: [ - { - title: '课表成绩', - fold: false, - items: [{ - id: 'myCourse', - icon: 'wodekebiao', - teacher: true, - student: true, - name: '我的课表', - url: '../course/my', - login: true, - }, { - id: 'stulist', - icon: 'gongrenhuamingce', - teacher: true, - student: false, - name: '花名册', - url: '../course/stulist/index', - login: true, - }, { - id: 'teacherCourse', - icon: 'jiaoshikebiao', - teacher: true, - student: true, - name: '教师课表', - url: '../course/search?type=teacher', - login: true, - }, { - id: 'classCourse', - icon: 'banjikebiao', - teacher: true, - student: true, - name: '班级课表', - url: '../course/search?type=class', - login: true, - }, { - id: 'score', - icon: 'chengji', - teacher: false, - student: true, - name: '成绩查询', - url: '../score/score', - login: true, - }, { - id: 'cet', - icon: 'CET', - teacher: true, - student: true, - name: '查四六级', - url: 'packageResultQuery/pages/cet_his/CET_Result_His_Portal', - login: false, - }] - }, - { - title: '费用查询', - fold: false, - items: [{ - id: 'elesys', - icon: 'dianfei', - teacher: true, - student: true, - name: '寝室用电', - url: '../elesys/bind', - login: false, - }, { - id: 'card', - icon: 'card', - teacher: false, - student: true, - name: '一卡通余额', - url: '../school/card/bind', - login: true, - }, { - id: 'netfare', - icon: 'wangluo', - teacher: true, - student: true, - name: '网费查询', - url: '../netsys/bind', - login: true, - }, { - id: 'finance', - icon: 'finance', - teacher: false, - student: true, - name: '学费查询', - url: '../school/finance/bind', - login: true, - }] - }, - { - title: '图书馆', - fold: true, - items: [{ - id: 'booksearch', - icon: 'booksearch', - teacher: true, - student: true, - name: '图书检索', - url: './../books/search', - login: false, - }, { - id: 'mybooks', - icon: 'tushuguan', - teacher: true, - student: true, - name: '我的借阅', - url: './../books/bind', - login: true, - }, { - id: 'scanBookCode', - icon: 'dushuma', - teacher: true, - student: true, - name: '扫码查书', - url: '', - login: false, - }, { - id: 'hotBook', - icon: 'bangdan', - teacher: true, - student: true, - name: '热门图书', - url: '../books/hot/index', - login: false, - }, { - id: 'movie', - icon: 'movie', - teacher: true, - student: true, - name: '音像放映', - url: '../school/movie', - login: false, - }, { - // id: 'recommendBook', - // icon: 'tuijian', - // teacher: true, - // student: true, - // name: '图书荐购', - // url: '../books/recommend/index', - // login: false, - // }, { - id: 'overdue', - icon: 'qiankuanjiesuan', - teacher: true, - student: true, - name: '超期催还', - url: '../books/overdue/index', - login: false, - }] - }, - { - title: '校园生活', - fold: false, - items: [{ - id: 'calendar', - icon: 'xiaoli', - teacher: true, - student: true, - name: '校历', - url: '../school/calendar', - login: false, - }, { - id: 'schoolTrans', - icon: 'daba', - teacher: true, - student: true, - name: '校园出行', - url: '../traffic/bus', - login: false, - }, { - id: 'teacherBus', - icon: 'daba', - teacher: true, - student: false, - name: '班车订票', - url: '', - login: true, - }, { - // id: 'lost', - // icon: 'lost', - // teacher: true, - // student: true, - // name: '失物招领', - // url: '../school/lost/index', - // login: false, - // }, { - id: 'map', - icon: 'tubiao_ditu', - teacher: true, - student: true, - name: '校园导航', - url: '../traffic/navi', - login: false, - }, { - id: 'steps', - icon: 'runsteps', - teacher: true, - student: true, - name: '运动排行', - url: '../school/run/index', - login: false, - }, { - id: 'tel', - icon: 'tel', - teacher: true, - student: true, - name: '常用电话', - url: '../school/tel', - login: false, - }, { - id: 'certificate', - icon: 'zhengjian', - teacher: true, - student: true, - name: '考证助手', - url: '../school/cert', - login: false, - }, { - id: 'websites', - icon: 'diqiu', - teacher: true, - student: true, - name: '校园站点', - url: '../school/web', - login: false, - }, { - id: 'xiaoai', - icon: 'xiaoai', - teacher: true, - student: true, - name: '小爱课表', - url: '../school/xiaoai', - login: false, - }, { - id: 'about', - icon: 'plane', - teacher: true, - student: true, - name: '关于盒子', - url: '../school/aboutus', - login: false, - }] - } - ], - }, - onLoad: function () { - this.inital() - this.getBackgroundImage() - }, - onShow: function () { - this.inital() - var _this = this - // 手机摇一摇随机更换背景壁纸 - this.setData({ canShake: true }) - wx.onAccelerometerChange(function (e) { - if (!_this.data.canShake) { - return - } - // console.log(e) - if (e.x * e.y > 0.58) { - wx.vibrateShort({ type: 'heavy' }) - _this.getBackgroundImage() - } - }) - }, - inital: function () { - var edusysUserInfo = wx.getStorageSync('edusysUserInfo') || {} - var userInfo = wx.getStorageSync('userInfo') || {} - var iconList = this.data.iconList - - try { - if (edusysUserInfo.uid && edusysUserInfo.uid.length > 0 && edusysUserInfo.password.length > 0) { - var features = [] - var isTeacher = false; - if (edusysUserInfo.uid.length < 8) { - isTeacher = true - } - // 按老师学生身份筛选过滤功能菜单 - for (let index = 0; index < iconList.length; index++) { - const board = iconList[index]; - features.push({ title: board.title, fold: board.fold, items: [] }) - for (let idx = 0; idx < board.items.length; idx++) { - const element = board.items[idx]; - // 非正式线上环境不启用 - if (app.globalData.env != 'release') { - if (element.id == 'steps' || element.id == 'lost') continue - } - if (isTeacher && !element.teacher) continue - if (element.teacher && element.student) { - features[index].items.push(element) - continue - } - if ((!isTeacher && element.student) || (isTeacher && element.teacher)) { - features[index].items.push(element) - } - } - } - - this.setData({ - iconList: features, - hasEdusysStorage: true, - isTeacher: isTeacher, - edusysUserInfo: edusysUserInfo, - userInfo: userInfo - }) - } - } catch (error) { - console.log(error) - this.setData({ - iconList: iconList, - hasEdusysStorage: false, - edusysUserInfo: {}, - userInfo: userInfo - }) - } - // 允许分享到朋友圈 - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - getBackgroundImage: function () { - var _this = this - wx.request({ - url: `${app.globalData.domain}/background`, - timeout: app.globalData.requestTimeout, - method: 'GET', - success: function (res) { - try { - if (res.statusCode == 200) { - _this.setData({ backgroundImage: res.data.background }) - } - } catch (error) { - console.log('获取背景图出错', error) - } - } - }) - }, - goToPage: function (e) { - const id = e.currentTarget.id; - let url = e.currentTarget.dataset.url; - const needLogin = e.currentTarget.dataset.login; - const hasEdusysStorage = this.data.hasEdusysStorage; - // console.log('target:', hasEdusysStorage); - - if (id == 'cet') { - wx.navigateToMiniProgram({ appId: 'wxa56afc785454c86b', path: url }) - return - } - - if (id == 'scanBookCode') { - this.scanBookCode(); - return - } - - if (id == 'teacherBus') { - wx.navigateToMiniProgram({ appId: 'wx183616af30e5723d' }); - return - } - - if (id == 'card') url = `${url}?uid=${this.data.edusysUserInfo.uid}` - - if (needLogin && !hasEdusysStorage) { - wx.showToast({ title: '不登录,这个功能没法用哟~', icon: 'none' }) - return - } - - wx.navigateTo({ url: url }); - }, - goLogin: function (e) { - wx.navigateTo({ - url: './login', - }) - }, - scanBookCode: function () { - wx.scanCode({ - success: (res) => { - if (res.errMsg !== 'scanCode:ok') { - wx.showToast({ title: res.errMsg, icon: 'none' }) - return; - } - if (res.scanType !== 'EAN_13') { - wx.showToast({ title: '这不是图书ISBN码', icon: 'none' }) - return; - } - wx.navigateTo({ url: `../books/detail?code=${res.result}&codeType=isbn` }) - } - }) - }, - foldChanged (e) { - const index = e.currentTarget.dataset.index - let iconList = this.data.iconList - iconList[index].fold = !iconList[index].fold - this.setData({ iconList: iconList }) - }, - showBgImage: function () { - const background = this.data.backgroundImage - wx.previewImage({ - urls: [background], - }) - }, - logout: function (e) { - var anmiaton = e.currentTarget.dataset.class - var _this = this - _this.setData({ animation: anmiaton }) - setTimeout(function () { - wx.clearStorage({ - success: (res) => { - _this.setData({ animation: '' }); - app.globalData.edusysUserInfo = {} - app.globalData.hasEdusysStorage = false - wx.vibrateShort({ type: 'medium' }) - wx.navigateTo({ url: './login' }) - }, - }) - }, 1000); - }, - onShareAppMessage: function (res) { - return { - title: '贝壳小盒子', - path: 'pages/index/feature', - } - }, - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - this.setData({ canShake: false }) - } -}) \ No newline at end of file diff --git a/pages/index/feature.json b/pages/index/feature.json deleted file mode 100644 index c173bc3..0000000 --- a/pages/index/feature.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "imagemodal": "./component/imagemodal" - } -} \ No newline at end of file diff --git a/pages/index/feature.wxml b/pages/index/feature.wxml deleted file mode 100644 index 1c8e671..0000000 --- a/pages/index/feature.wxml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - {{ userInfo.nickname ? (userInfo.nickname + ' | ') : '点击授权昵称头像' }} {{ edusysUserInfo.uid}} - - - - - - 您尚未登录 - - - - - - - - - {{value.title}} - - - - - - - - - {{item.name}} - - - - - - {{item.name}} - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/index/feature.wxss b/pages/index/feature.wxss deleted file mode 100644 index ac8a29a..0000000 --- a/pages/index/feature.wxss +++ /dev/null @@ -1,81 +0,0 @@ -/* pages/index/feature.wxss */ -@import "../../app.wxss"; -@import "../../colorui/animation.wxss"; - -.UCenter-bg { - background-size: cover; - height: 500rpx; - display: flex; - justify-content: center; - padding-top: 20rpx; - overflow: hidden; - position: relative; - flex-direction: column; - align-items: center; - color: #fff; - font-weight: 300; - text-shadow: 0 0 3px rgba(0, 0, 0, 0.3); -} - -.UCenter-bg text { - opacity: 0.8; -} - -.UCenter-bg image { - width: 200rpx; - height: 200rpx; -} - -.UCenter-bg .gif-wave{ - position: absolute; - width: 100%; - bottom: 0; - left: 0; - z-index: 99; - mix-blend-mode: screen; - height: 100rpx; -} - -map,.mapBox{ - left: 0; - z-index: 99; - mix-blend-mode: screen; - height: 100rpx; -} - -map,.mapBox{ - width: 750rpx; - height: 300rpx; -} - -.userinfo-avatar { - border-radius: 50rpx; - clip-path: circle(50% at center); - width: 180rpx; - height: 180rpx; - box-shadow: 5rpx 5rpx 15rpx #ccc; -} - -.replay-board { - width: 32px; - height: 28px; - margin-top: -2px; -} - -.replay-board-title { - margin-top: -22px; -} - -.nickname { - padding: 10rpx; - background-color: rgba(243, 243, 243, 0.438); - border-radius: 25rpx; - color: black; - font-weight: 350; -} - -.feature-titles { - min-height: 40rpx; - align-items: flex-start; - padding-bottom: 10rpx; -} \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js index a078a02..5ccabc1 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -1,307 +1,279 @@ -//index.js -//获取应用实例 var app = getApp() -var timeUtil = require('../../utils/util.js') Page({ data: { - weekArray: ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"], - searchType: '02', - radioItems: [ - { name: '书名', value: '02', checked: true }, - { name: '作者', value: '03' }, - { name: '主题', value: '04' }, - { name: '出版社', value: '09' } - ], - praise: '', - canShake: false, - keyword: '', + uid: '', + pwd: '', + jsonContent: {}, + jsonStr: "", + help_status: false, + reset_status: false, + userid_focus: false, + passwd_focus: false, + vcode_focus: false, + resetUid_focus: false, + idCardNO_focus: false, + angle: 0, + PreInfo: {}, isLoading: true, - hasLogin: false, - isTeacher: false, - edusysUserInfo: {}, - hasCourseCache: false, - todayCourseCard: false, - lessons: [], - nextCourseArray: [], - calendar: '', - elesysData: false, - hasBindElesys: true, - netsysData: false, - hasBindNetsys: false }, - onLoad: function () { - this.inital(); - this.getCalendar() - this.getPraise() + onLoad: function() { + var that = this; + var uid = app.globalData.uid; + var pwd = app.globalData.newpwd; + this.getVcode(); + if (this.checkHasLogin()) {} else { + this.onReady(); + } }, - onShow: function () { - this.inital() - var _this = this - // 手机摇一摇随机更换夸夸语录 - this.setData({ canShake: true }) - wx.onAccelerometerChange(function (e) { - if (!_this.data.canShake) { - return - } - // console.log(e) - if (e.x * e.y > 0.58 ) { - wx.vibrateShort({ type: 'heavy' }) - _this.getPraise() + checkHasLogin: function() { + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + if (uid != '' && pwd != '') { + return true; + } else { + return false; + } + }, + copyResetURL:function(){ + wx.setClipboardData({ + data: 'http://61.181.145.1:88/jsxsd/view/findpwd/enteraccount.jsp', + success(res) { + wx.showToast({ + title: '内容已复制,请粘贴到浏览器访问', + icon:'none' + }) } }) }, - inital: function () { - // console.log(app.globalData) - var hasLogin = false; - var isTeacher = false; - var todayCourseCard = false; - var edusysUserInfo = app.globalData.edusysUserInfo; - var hasCourseCache = false; - var todayCourses = []; - var nextCourseArray = []; - var myCourse = wx.getStorageSync('myCourse') || {} - var isGraduateStu = false - if (myCourse != '' && Object.keys(myCourse).length > 0) { - hasCourseCache = true - } - - if (app.globalData.hasEdusysStorage === true) { - hasLogin = true; + submitInfo: function(e) { + wx.showToast({ + title: "登录中...", + icon: "loading", + duration: 10000 + }) + var that = this; + var uid = e.detail.value.uid; + var pwd = e.detail.value.pwd; + var vcode = e.detail.value.vcode; + if ((uid.length == 0 || pwd.length == 0) || vcode.length != 4) { + wx.showToast({ + title: '输入有误', + image: '/images/info.png', + icon: 'none', + duration: 1000 + }); } else { - try { - if (edusysUserInfo.uid.length > 0) { - app.globalData.hasEdusysStorage = true - hasLogin = true - if (edusysUserInfo.uid.indexOf('17') >= 0) { - isGraduateStu = true + wx.request({ + url: app.globalData.apiURL + '/v4/profile.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + cookie: that.data.PreInfo.cookie, + vcode: vcode + }, + success: function(res) { + that.setData({ + jsonStr: res.data, + }) + // console.log(res.data) + wx.hideToast() + // console.log(res.data); + //账号密码错误以下功能实现密码错误Toast + if (res.data.code == 401) { + wx.showToast({ + title: '账号密码有误', + image: '/images/info.png', + duration: 3000 + }); + that.getVcode(); + } else if (res.data.code == 402) { + wx.showToast({ + title: '验证码错误', + image: '/images/info.png', + duration: 3000 + }); + that.getVcode(); + } else if (res.data.name != "") { + app.globalData.uid = uid; + app.globalData.newpwd = pwd; + //设置本地Storage,维持登录态用 + wx.setStorageSync('uid', uid); + wx.setStorageSync('newpwd', pwd); + wx.navigateTo({ + url: '/pages/welcome/welcome?uid=' + uid + '&name=' + res.data.name + '&classroom=' + res.data.classroom, + }) + } else { + wx.showToast({ + title: '暂时无法登录', + icon: 'none', + duration: 3000 + }); } } - } catch (error) { - hasLogin = false; - } + }) } - - try { - isTeacher = edusysUserInfo.uid.length < 8 ? true : false - } catch (error) { - isTeacher = false - } - - if (hasCourseCache) { - var date = new Date(); - var dayOfWeek = date.getDay(); - const weekArray = this.data.weekArray; - var todayCourse = myCourse[weekArray[dayOfWeek]]; - - for (let i in todayCourse) { - if (todayCourse[i].length > 1) { - for (let j in todayCourse[i]) { - todayCourses.push(todayCourse[i][j]); - } - } else { - todayCourses.push(todayCourse[i]); - } - } - let nowMintues = date.getMinutes(); - if (nowMintues < 10) { - nowMintues = "0" + nowMintues; - } - var nowTime = date.getHours() + ':' + nowMintues; - for (let i = 0; i < todayCourses.length; i++) { - if (todayCourses[i]['courseName'] != '') { - if (timeUtil.CompareDate(nowTime, todayCourses[i]['startTime'])) { - nextCourseArray = todayCourses[i]; - break; - } - } - } - if (nextCourseArray.length == 0) { - todayCourseCard = true; - } + }, + tapHelp: function(e) { + if (e.target.id == 'help') { + this.hideHelp(); } - + }, + showHelp: function(e) { this.setData({ - isTeacher: isTeacher, - edusysUserInfo: edusysUserInfo, - hasLogin: hasLogin, - hasCourseCache: hasCourseCache, - lessons: hasCourseCache ? myCourse : [], - nextCourseArray: nextCourseArray, - todayCourses: todayCourses, - todayCourseCard: todayCourseCard, - isLoading: false, - isGraduateStu: isGraduateStu - }) - - // 是否有绑定电费信息?查询电费 - this.getElesysInfo() - // 是否有绑定校园网信息?查询网费余额 - this.getNetsysInfo() - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) + 'help_status': true + }); }, - getPraise: function() { - var _this = this - wx.request({ - url: `${app.globalData.domain}/praise`, - timeout: app.globalData.requestTimeout, - method: 'GET', - success: function(res){ - try { - if (res.statusCode == 200) { - _this.setData({ praise: res.data.praise }) - } - } catch (error) { - console.log('获取夸夸语录', error) - } - } - }) + hideHelp: function(e) { + this.setData({ + 'help_status': false + }); }, - getElesysInfo: function () { - try { - let elesysUserInfo = wx.getStorageSync('elesysUserInfo') || {} - app.globalData.elesysUserInfo = elesysUserInfo.building.length > 0 ? elesysUserInfo : '' - this.getEleData(elesysUserInfo.building, elesysUserInfo.room) - } catch (error) { - this.setData({ elesysData: false, hasBindElesys: false }) + UidInput: function(e) { + if (e.detail.value.length >= 9) { + wx.hideKeyboard(); } }, - getNetsysInfo: function () { - try { - let netsysUserInfo = wx.getStorageSync('netsysUserInfo') || {} - app.globalData.netsysUserInfo = netsysUserInfo.netid.length > 0 ? netsysUserInfo : '' - this.getNetData(netsysUserInfo.netid, netsysUserInfo.password, 'account') - } catch (error) { - this.setData({ netsysData: false, hasBindNetsys: false }) + inputFocus: function(e) { + if (e.target.id == 'userid') { + this.setData({ + 'userid_focus': true + }); + } else if (e.target.id == 'passwd') { + this.setData({ + 'passwd_focus': true + }); + } else if (e.target.id == 'vcode') { + this.setData({ + 'vcode_focus': true + }); + } else if (e.target.id == 'resetUid') { + this.setData({ + 'resetUid_focus': true + }); + } else if (e.target.id == 'idCardNO') { + this.setData({ + 'idCardNO_focus': true + }); } }, - getNetData: function (netid = '', password = '', getDataBy = 'account') { - var _this = this - const postdata = { uid: app.globalData.edusysUserInfo.uid, userid: netid, password: password } - - wx.request({ - url: `${app.globalData.domain}/netsys/profile`, - data: postdata, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function(res){ - try { - if (res.data.welcome.length > 1) { - res.data.timeText = timeUtil.formatDateTime(new Date(), true) - res.data.netid = netid - _this.setData({ netsysData: res.data ,hasBindNetsys: true }) - app.globalData.netsysUserInfo = res.data - } - } catch (error) { - _this.setData({ hasBindNetsys: true, netsysData: false }) - } + inputBlur: function(e) { + if (e.target.id == 'userid') { + this.setData({ + 'userid_focus': false + }); + } else if (e.target.id == 'passwd') { + this.setData({ + 'passwd_focus': false + }); + } else if (e.target.id == 'vcode') { + this.setData({ + 'vcode_focus': false + }); + } else if (e.target.id == 'resetUid') { + this.setData({ + 'resetUid_focus': false + }); + } else if (e.target.id == 'idCardNO') { + this.setData({ + 'idCardNO_focus': false + }); + } + }, + onReady: function() { + var that = this; + setTimeout(function() { + that.setData({ + isLoading: false + }); + }, 1000); + wx.onAccelerometerChange(function(res) { + var angle = -(res.x * 30).toFixed(1); + if (angle > 14) { + angle = 14; + } else if (angle < -14) { + angle = -14; } - }) + if (that.data.angle !== angle) { + that.setData({ + angle: angle + }); + } + }); }, - // 获取电费数据 - getEleData: function(building, room) { - var _this = this + getVcode: function() { + var that = this; wx.request({ - url: `${app.globalData.domain}/elesys/`, - data:{ building: building, room: room }, - timeout: app.globalData.requestTimeout, - method: 'GET', - success: function(res){ - try { - if (res.data.balance.length > 0) { - res.data.building = building - res.data.room = room - res.data.time = timeUtil.formatDateTime(new Date(), true) - _this.setData({ hasBindElesys: true, elesysData: res.data }) - } - } catch (error) { - _this.setData({ hasBindElesys: true, elesysData: false }) + url: app.globalData.apiURL + '/v2/getCookie.php', + success: function(res) { + // console.log(res.data); + that.setData({ + PreInfo: res.data, + }) + if (res.data.code == 500) { + wx.showToast({ + title: '教务系统异常', + icon: 'none', + duration: 5000 + }); } } - }) - }, - showTodayCourseCard: function () { - this.setData({ todayCourseCard: true }) - }, - hideTodayCourseCard: function () { - this.setData({ todayCourseCard: false }) - }, - goLogin: function () { - wx.navigateTo({ url: '../index/login' }) - }, - radioChange: function (e) { - this.setData({ searchType: e.detail.value }) - var radioItems = this.data.radioItems; - for (var i = 0, len = radioItems.length; i < len; ++i) { - radioItems[i].checked = radioItems[i].value == e.detail.value; - } - this.setData({ - radioItems: radioItems, }); }, - keywordInput: function (e) { + resetPassword: function() { this.setData({ - keyword: e.detail.value - }); - }, - searchBook: function () { - const searchType = this.data.searchType; - const keyword = this.data.keyword; - // console.log(searchType, keyword); - if(keyword.length == 0){ - wx.showToast({ title: '请输入检索关键字', icon: 'none' }); - return; - } - wx.showLoading({ title: '在找了在找了...' }); - wx.request({ - url: `${app.globalData.domain}/book/search`, - data: {type: searchType, keyword: keyword}, - method: 'GET', - success: function (res) { - wx.hideLoading() - if (res.data.total == '图书馆系统无响应') { - wx.showToast({ title: '图书馆OPAC系统无响应', icon: 'none' }) - } else if (res.data.total == 0) { - wx.showToast({ title: '图书馆暂无此书', icon: 'none' }) - } else { - wx.navigateTo({ url: `../books/index?type=${searchType}&keyword=${keyword}` }) - } - } + help_status: false, + reset_status: true, }) }, - getCalendar: function () { - var _this = this - wx.request({ - url: `${app.globalData.domain}/edu/calendar`, - timeout: app.globalData.requestTimeout, - success: function (res) { - _this.setData({ calendar: res.data }) - wx.vibrateShort({ type: 'medium' }) - } + hideReset: function() { + this.setData({ + help_status: false, + reset_status: false, }) }, - onShareAppMessage: function (res) { - return { - title: '贝壳小盒子', - path: 'pages/index/index', + resetPasswordForm: function(e) { + var that = this; + if (e.detail.value.resetUid.length < 8 || e.detail.value.idCardNO.length < 15) { + wx.showToast({ + title: '输入有误', + icon: 'none', + image: '/images/info.png' + }) + } else { + wx.request({ + url: app.globalData.apiURL + '/v4/reset.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: e.detail.value.resetUid, + idcard: e.detail.value.idCardNO + }, + success: function(res) { + // console.log(res.data); + if (res.data.code == '200' && res.data.desc == '密码已重置为身份证号的后六位') { + wx.showToast({ + icon:'none', + title: '密码已重置为身份证号的后六位', + duration: 5000, + }) + that.setData({ + reset_status: false, + }) + } else { + wx.showToast({ + image: '/images/info.png', + title: res.data.desc, + duration: 5000 + }) + } + } + }) } - }, - goToBookSearchPage: function () { - wx.navigateTo({ url: '../books/search' }) - }, - agree(e){ - console.log("用户同意隐私授权, 接下来可以调用隐私协议中声明的隐私接口") - }, - disagree(e){ - console.log("用户拒绝隐私授权, 未同意过的隐私协议中的接口将不能调用") - }, - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - this.setData({ canShake: false }) - }, -}) + } +}) \ No newline at end of file diff --git a/pages/index/index.json b/pages/index/index.json index 64cb623..0d612b7 100644 --- a/pages/index/index.json +++ b/pages/index/index.json @@ -1,8 +1,7 @@ { - "usingComponents": { - "tips": "./component/tips", - "feecard": "./component/feecard", - "imagemodal": "./component/imagemodal", - "privacy": "./component/privacyPopup/privacyPopup" - } + "navigationBarBackgroundColor": "#7acfa6", + "backgroundColor": "#7acfa6", + "navigationBarTitleText": "绑定学号 - 贝壳小盒子", + "enablePullDownRefresh": false, + "disableScroll": true } \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml index db5e24f..0663c9b 100644 --- a/pages/index/index.wxml +++ b/pages/index/index.wxml @@ -1,181 +1,95 @@ - - 贝壳小盒子 - - - - - - - - - 馆藏图书检索 + + + - - - - - - - - - - {{item.name}} - - - - - - - - - - {{calendar.teachWeek}} 周 {{calendar.dayOfWeek}} - {{praise}} - - - - - {{calendar.month}}月{{calendar.day}}日 {{calendar.dayOfWeek}} - {{praise}} - - - - - - - - - - - - - - - 下节课 - - - - - {{nextCourseArray.courseName}} - {{nextCourseArray.teachWeek}} {{nextCourseArray.startTime}}上课 ~ {{nextCourseArray.endTime}}下课 - - - {{nextCourseArray.place}} - - - - 展示全天课表👇 + + + + + + + + - - 朕知道了,赶紧收起来吧😂 + + - - - - - - - - - 今日课程 - - - - - - - - {{item.courseName}} - {{item.teachWeek}} {{item.startTime}}上课 ~ {{item.endTime}}下课 - - - {{item.place}} - - - - - - - - - - - 课堂花名册 - - - + + + + 帮助 + + + + 1、学号和密码是什么? + + 学号:学号就是你的教务学号。 + 密码:您设定的教务系统的登录密码。 + + 2、忘记密码? + + + 点击这里,复制粘贴到浏览器打开,输入学号点击下一步并按照提示完成密码重置 + + 3、大一新生?暂时还没有学号😥 + + 请耐心等待教务部门注册学籍,办理学生证,然后你就有学号啦。(不要企图用高考考生号登录成功) + + - - - {{item.courseName}} - {{item.className}} - - - - - - - - - - 课表 + + + + 修改密码 + + + + + - - - - 查询课表 - - - - - - - - - - - - - - - + + - \ No newline at end of file diff --git a/pages/index/index.wxss b/pages/index/index.wxss index 3e22fba..9e1991a 100644 --- a/pages/index/index.wxss +++ b/pages/index/index.wxss @@ -1,26 +1,348 @@ -.remind-box { +.container { + background: #7acfa6; + align-items: stretch; + padding: 0; + height: 100%; + overflow: hidden; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #7acfa6; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 30rpx 30rpx 30rpx; +} + +.content { flex: 1; display: flex; + position: relative; + z-index: 10; flex-direction: column; - align-items: center; + align-items: stretch; justify-content: center; - padding-bottom: 300rpx; + width: 100%; + padding-bottom: 450rpx; + background: -webkit-gradient(linear, left top, left bottom, from(rgba(244, 244, 244, 0)), color-stop(0.1, #f4f4f4), to(#f4f4f4)); + opacity: 0; + transform: translate3d(0, 100%, 0); + animation: rise 3s cubic-bezier(0.19, 1, 0.22, 1) 0.25s forwards; +} + +@keyframes rise { + 0% { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 1; + transform: translate3d(0, 450rpx, 0); + } } -.remind-img { - width: 250rpx; - height: 250rpx; - padding-bottom: 25rpx; + +.title { + position: absolute; + top: 30rpx; + left: 50%; + width: 600rpx; + height: 200rpx; + margin-left: -300rpx; + opacity: 0; + animation: show 2.5s cubic-bezier(0.19, 1, 0.22, 1) 0.5s forwards; } -.cu-form-group .title { - min-width: calc(4em + 30rpx); +@keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 0.95; + } } -.praise { - text-indent: 1em; +.hd { + position: absolute; + top: 0; + left: 50%; + width: 1000rpx; + margin-left: -500rpx; + height: 200rpx; + transition: all 0.35s ease; +} + +.logo { + position: absolute; + z-index: 2; + left: 50%; + bottom: 200rpx; + width: 160rpx; + height: 160rpx; + margin-left: -80rpx; + border-radius: 160rpx; + animation: sway 10s ease-in-out infinite; + opacity: 0.95; +} + +@keyframes sway { + 0% { + transform: translate3d(0, 20rpx, 0) rotate(-15deg); + } + + 17% { + transform: translate3d(0, 0rpx, 0) rotate(25deg); + } + + 34% { + transform: translate3d(0, -20rpx, 0) rotate(-20deg); + } + + 50% { + transform: translate3d(0, -10rpx, 0) rotate(15deg); + } + + 67% { + transform: translate3d(0, 10rpx, 0) rotate(-25deg); + } + + 84% { + transform: translate3d(0, 15rpx, 0) rotate(15deg); + } + + 100% { + transform: translate3d(0, 20rpx, 0) rotate(-15deg); + } +} + +.wave { + position: absolute; + z-index: 3; + right: 0; + bottom: 0; + opacity: 0.725; + height: 260rpx; + width: 2250rpx; + animation: wave 10s linear infinite; +} + +.wave-bg { + z-index: 1; + animation: wave-bg 10.25s linear infinite; } -.school-ads { +@keyframes wave { + from { + transform: translate3d(125rpx, 0, 0); + } + + to { + transform: translate3d(1125rpx, 0, 0); + } +} + +@keyframes wave-bg { + from { + transform: translate3d(375rpx, 0, 0); + } + + to { + transform: translate3d(1375rpx, 0, 0); + } +} + +.bd { position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + animation: bd-rise 2s cubic-bezier(0.23, 1, 0.32, 1) 0.75s forwards; + opacity: 0; +} + +@keyframes bd-rise { + from { + opacity: 0; + transform: translate3d(0, 60rpx, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +form { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; +} + +.input-group { + display: flex; + align-items: center; + padding: 25rpx 10rpx; + margin: 40rpx 3%; + background: #fff; + border-radius: 5px; + border: 2px solid #f4f4f4; + transition: all 0.25s ease-in-out; +} + +.input-group.active { + border: 2px solid #7acfa6; +} + +.input-label { + color: #888; + font-size: 13pt; + height: 25rpx; + line-height: 25rpx; + padding: 0 25rpx; + border-right: 1px solid #d8d8d8; +} + +.input-group input, .input-group picker { + flex: 1; + font-size: 13pt; + min-height: 52rpx; + height: 52rpx; + line-height: 52rpx; + padding: 0 25rpx; +} + +.input-placeholder, .input-group picker.placeholder { + color: #ccc; +} + +.login-help { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0 30rpx; + font-size: 10pt; + color: #bbb; +} + +.login-help-img { + width: 11pt; + height: 11pt; + margin: 0 5rpx; +} + +.confirm-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #7acfa6; + color: #fff; + text-align: center; + border-radius: 5px; + margin: 50rpx 3%; +} + +.confirm-btn:active { + opacity: 0.8; +} + +.help { + position: absolute; + z-index: 100; top: 0; -} \ No newline at end of file + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.box { + position: relative; + display: flex; + flex-direction: column; + align-items: stretch; + width: 80%; + background: #fff; + border-radius: 10px; + box-shadow: 0 0 50px rgba(22, 22, 22, 0.35); + transform: translate3d(0, -400rpx, 0); +} + +.box-hd { + display: flex; + align-items: center; + justify-content: center; + height: 100rpx; + border-bottom: 1px solid #eee; +} + +.box-title { + font-size: 13pt; +} + +.box-close { + position: absolute; + right: 20rpx; + width: 35rpx; + height: 35rpx; + padding: 15rpx; +} + +.box-bd { + flex: 1; + display: flex; + flex-direction: column; + padding: 15rpx 40rpx 30rpx; +} + +.help-q { + color: #999; + font-size: 11pt; + line-height: 200%; + margin-top: 5rpx; +} + +.help-a { + text-indent: 1em; + line-height: 160%; + display: flex; + flex-direction: column; +} + +.help-a text { + word-break: break-all; +} + +/**登录动画**/ + +.login_video { + position: absolute; + z-index: 1; + top: 50%; + left: 50%; + width: 750rpx; + margin-left: -375rpx; + height: 1334rpx; + margin-top: -667rpx; +} + +.video_hidden { + visibility: hidden; +} + +page .wx-video-bar { + display: none; +} diff --git a/pages/index/login.js b/pages/index/login.js deleted file mode 100644 index b86624e..0000000 --- a/pages/index/login.js +++ /dev/null @@ -1,331 +0,0 @@ -//login.js -//获取应用实例 -var app = getApp(); -var domain = app.globalData.domain; -Page({ - data: { - remind: '加载中', - help_status: false, - reset_status: false, - userid_focus: false, - passwd_focus: false, - // vcode_focus: false, - idcard_focus: false, - userid: '', - passwd: '', - // vcode: '', - // cookie: '', - // vcodeUrl: '', - idcard: '', - angle: 0, - percent: 0, - costSeconds: 0 - }, - onLoad: function () { - }, - onReady: function () { - try { - const edusysUserInfo = wx.getStorageSync('edusysUserInfo') || {} - if (edusysUserInfo.name.length > 0) wx.switchTab({ url: './index' }) - } catch (error) { - // this.getCookie(); - } - - var _this = this; - setTimeout(function () { - _this.setData({ remind: '' }) - }, 100); - wx.onAccelerometerChange(function (res) { - var angle = -(res.x * 30).toFixed(1); - if (angle > 14) { angle = 14; } - else if (angle < -14) { angle = -14; } - if (_this.data.angle !== angle) { - _this.setData({ angle: angle }); - } - }); - }, - getUserInfo: function () { - if (!this.vaildForm()) { - return - } - // 登录进度条 - const _this = this - const interval = 500 - var progress = setInterval(function () { - let costSeconds = _this.data.costSeconds - costSeconds = costSeconds + (interval * 2) - const percent = (costSeconds / app.globalData.requestTimeout * 100).toFixed(2) - if (parseInt(percent) < 90) _this.setData({ costSeconds: costSeconds, percent: percent }) - }, interval) - this.login({}, progress); - }, - vaildForm: function () { - var uid = this.data.userid; - var password = this.data.passwd; - // var cookie = this.data.cookie; - // var vcode = this.data.vcode; - if (uid.length < 1) { - wx.showToast({ - title: '请输入教务网账号', - icon: 'none' - }) - return false; - } - if (password.length < 1) { - wx.showToast({ - title: '请输入教务网密码', - icon: 'none' - }) - return false - } - return true; - }, - login: function (userInfo, progress) { - var _this = this - _this.setData({ remind: '加载中' }) - var uid = this.data.userid - var password = this.data.passwd - wx.request({ - url: `${domain}/edu/profile`, - data: { - uid: uid, - pwd: password, - userFrom: 'wechat', - openid: app.globalData.openid - }, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function (res) { - // console.log('eduSysProfile:', res.data) - try { - if (res.data.name.length > 1) { - _this.setData({ costSeconds: 0, percent: 100 }) - clearInterval(progress) - res.data.password = password - wx.setStorage({ data: res.data, key: 'edusysUserInfo' }) - app.globalData.edusysUserInfo = res.data - wx.vibrateShort({ type: 'medium' }) - setTimeout(function () { wx.switchTab({ url: './index' }) }, 1000); - } - } catch (error) { - // _this.getCookie(); - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - _this.setData({ remind: '' }); - } - }, - fail: function (fail) { - if (fail.errMsg == 'request:fail timeout') { - wx.showToast({ - title: '失败了,要不要再试一次?', - icon: 'none', - duration: 5000 - }) - _this.setData({ remind: '' }); - } - } - }) - }, - resetPassword: function () { - if (!this.vaildResetForm()) { - return - } - wx.showLoading({ - title: 'loading', - }) - var _this = this; - const uid = this.data.userid; - const idcard = this.data.idcard; - const password = this.data.passwd; - wx.request({ - url: `${domain}/edu/password/reset`, - data: { - uid: uid, - idcard: idcard, - password: password - }, - method: 'POST', - success: function (res) { - wx.hideLoading(); - try { - if (res.data.code == 200) { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - _this.setData({ reset_status: false }) - } else { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - } - } catch (error) { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - } - } - }) - }, - showResetModal: function () { - this.setData({ - help_status: false, - reset_status: true - }) - }, - closeResetModal: function () { - this.setData({ - reset_status: false - }) - }, - vaildResetForm: function () { - const uid = this.data.userid; - const idcard = this.data.idcard; - const password = this.data.passwd; - const idcardReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ - - if (uid.length < 1) { - wx.showToast({ - title: '请输入正确的教务网账号', - icon: 'none' - }) - return false; - } - if (idcardReg.test(idcard) == false) { - wx.showToast({ - title: '身份证号码格式有误', - icon: 'none' - }) - return false; - } - if (uid == password) { - wx.showToast({ - title: '用户名与密码不可以相同', - icon: 'none' - }) - return false; - } - if (password.length < 8) { - wx.showToast({ - title: '密码长度不得短于8位', - icon: 'none' - }) - return false; - } - let hasAlpha = (password.search(/[A-Za-z]/) != -1) ? 1 : 0; - let hasNumber = (password.search(/[0-9]/) != -1) ? 1 : 0; - if (hasAlpha == 0 || hasNumber == 0) { - wx.showToast({ - title: '密码必需同时包含数字和字母', - icon: 'none' - }) - return false; - } - - return true; - }, - getCookie: function () { - // 解脱了,不用输入验证码了 - // var _this = this; - // wx.request({ - // url: `${domain}/edu/cookie`, - // success: function(res) { - // _this.setData({ - // vcode: res.data.vcodeOcr, - // cookie: res.data.cookie, - // vcodeUrl: res.data.vcode - // }) - // } - // }) - }, - useridInput: function (e) { - this.setData({ - userid: e.detail.value - }); - if (e.detail.value.length >= 9) { - wx.hideKeyboard(); - } - }, - passwdInput: function (e) { - this.setData({ - passwd: e.detail.value - }); - }, - // vcodeInput: function(e) { - // this.setData({ - // vcode: e.detail.value - // }); - // }, - idcardInput: function (e) { - this.setData({ - idcard: e.detail.value - }); - }, - inputFocus: function (e) { - if (e.target.id == 'userid') { - this.setData({ - 'userid_focus': true - }); - } else if (e.target.id == 'passwd') { - this.setData({ - 'passwd_focus': true - }); - // }else if(e.target.id == 'vcode'){ - // this.setData({ - // 'vcode_focus': true - // }); - } else if (e.target.id == 'idcard') { - this.setData({ - 'idcard_focus': true - }); - } - }, - inputBlur: function (e) { - if (e.target.id == 'userid') { - this.setData({ - 'userid_focus': false - }); - } else if (e.target.id == 'passwd') { - this.setData({ - 'passwd_focus': false - }); - // }else if(e.target.id == 'vcode'){ - // this.setData({ - // 'vcode_focus': false - // }); - } else if (e.target.id == 'idcard') { - this.setData({ - 'idcard_focus': false - }); - } - }, - tapHelp: function (e) { - if (e.target.id == 'help') { - this.hideHelp(); - } - }, - showHelp: function (e) { - this.setData({ - 'help_status': true - }); - }, - hideHelp: function (e) { - this.setData({ - 'help_status': false - }); - }, - showDoc: function () { - wx.navigateToMiniProgram({ - appId: 'wxd45c635d754dbf59', - path: 'pages/detail/detail?qqdocurl=https%3A%2F%2Fdocs.qq.com%2Fpdf%2FDVERBQWFEeHRQSnRq&url=https%3A%2F%2Fdocs.qq.com%2Fpdf%2FDVERBQWFEeHRQSnRq&scene=k57fg4fBFfg4IRaWa0VAFfg4hb4ln1' - }) - } -}); \ No newline at end of file diff --git a/pages/index/login.wxml b/pages/index/login.wxml deleted file mode 100644 index 3cfa747..0000000 --- a/pages/index/login.wxml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - 正在登录,请耐心等候... - - {{percent}}% - - - - - - - - - - - 重置密码 - - - - - - - 账号 - - - - 身份证号 - - - - 新密码 - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/index/setting.js b/pages/index/setting.js deleted file mode 100644 index 5a3d8d8..0000000 --- a/pages/index/setting.js +++ /dev/null @@ -1,99 +0,0 @@ -// pages/index/setting.js -const app = getApp() -Page({ - data: { - avatarUrl: app.globalData.defaultGrayAvatar, - nickname: '' - }, - onLoad () { - const uid = app.globalData.edusysUserInfo ? app.globalData.edusysUserInfo.uid : '' - console.log('uid', uid) - if (!uid) { - wx.redirectTo({ url: '../index/login' }) - return - } - this.fetch() - }, - fetch () { - const _this = this - const domain = app.globalData.domain - var uid = app.globalData.edusysUserInfo ? app.globalData.edusysUserInfo.uid : '' - wx.request({ - url: `${domain}/wechat/userinfo`, - data: { uid: uid }, - timeout: app.globalData.requestTimeout, - success: function(res){ - if (res.statusCode == 200 && res.data.code == 200) { - const avatarUrl = res.data.data.avatar ? res.data.data.avatar : app.globalData.defaultGrayAvatar - const nickName = res.data.data.nickname ? res.data.data.nickname : uid - _this.setData({ avatarUrl: avatarUrl, nickname: nickName }) - let userInfo = { avatarUrl: avatarUrl, nickName: nickName } - userInfo = Object.assign(userInfo, res.data.data) - wx.setStorageSync('userInfo', userInfo) - } - } - }) - }, - save () { - var _this = this - _this.setData({remind: '加载中'}) - var uid = app.globalData.edusysUserInfo ? app.globalData.edusysUserInfo.uid : '' - var openid = app.globalData.openid ? app.globalData.openid : '' - var avatarUrl = this.data.avatarUrl - var nickName = _this.data.nickname - const domain = app.globalData.domain - wx.request({ - url: `${domain}/wechat/userinfo`, - data:{ - uid: uid, - openid: openid, - nickname: nickName, - avatar: avatarUrl - }, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function(res){ - if (res.statusCode == 200 && res.data.code == 200) { - let userInfo = wx.getStorageSync('userInfo') || {} - Object.assign(userInfo, { - avatarUrl: avatarUrl, - avatar: avatarUrl, - nickname: nickName, - nickName: nickName - }) - wx.setStorageSync('userInfo', userInfo) - wx.navigateBack({ delta: 1 }) - } - } - }) - }, - onChooseAvatar(e) { - wx.showLoading({ title: '获取中' }) - const avatarUrl = e.detail.avatarUrl - this.uploadAvatar(avatarUrl) - }, - nicknameChange(e) { - const nickname = e.detail.value - this.setData({ nickname: nickname }) - console.log(nickname) - }, - uploadAvatar: function (filepath) { - var _this = this - const domain = app.globalData.domain - wx.uploadFile({ - url: `${domain}/upload`, - formData: { category: 'avatar' }, - filePath: filepath, - name: 'image', - success(res) { - wx.hideLoading() - const data = JSON.parse(res.data) - if (res.statusCode == 200 || data.code == 200) { - _this.setData({ avatarUrl: data.url }) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - }, -}) \ No newline at end of file diff --git a/pages/index/setting.json b/pages/index/setting.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/index/setting.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/index/setting.wxml b/pages/index/setting.wxml deleted file mode 100644 index fdd3451..0000000 --- a/pages/index/setting.wxml +++ /dev/null @@ -1,22 +0,0 @@ - - - 昵称头像设置 - - - - - 点击上方空白头像授权修改 - - - 昵称 - - - - - 受《小程序用户头像昵称获取规则调整公告》通知要求,微信小程序使用用户头像昵称必须经过用户主动授权允许。小盒子调整为默认使用灰色头像,登录学号作为头像,昵称;您可在此页面修改授权。请放心,即使不修改授权也不会影响您任何功能正常使用 - - - - - \ No newline at end of file diff --git a/pages/index/setting.wxss b/pages/index/setting.wxss deleted file mode 100644 index f5e435d..0000000 --- a/pages/index/setting.wxss +++ /dev/null @@ -1,8 +0,0 @@ -/* pages/index/setting.wxss */ -page { - background: #eee; -} - -.avatar { - width: 100%; -} \ No newline at end of file diff --git a/pages/index/vcode.js b/pages/index/vcode.js new file mode 100644 index 0000000..2b32457 --- /dev/null +++ b/pages/index/vcode.js @@ -0,0 +1,152 @@ +// pages/index/reset.js +var app = getApp() +Page({ + /** + * 页面的初始数据 + */ + data: { + jsonStr: '', + PreInfo: {}, + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + console.log(options) + var that = this; + if (Object.keys(options.to) == 0) { + wx.redirectTo({ + url: '/pages/bookSearch/index' + }) + return; + } + var courseCache = wx.getStorageSync('personal19Class'); + var scoreCache = wx.getStorageSync('p19Score'); + if (options.to == 'grkb') { + that.setData({ + toPage: '/pages/classQuery/index' + }) + if (courseCache != '' && options.update == '1') { + + } else if (courseCache != '' && options.update == '0') { + wx.redirectTo({ + url: '/pages/classQuery/index', + }) + } + } else if (options.to == 'score') { + that.setData({ + toPage: '/pages/score/score' + }) + if (scoreCache != '' && options.update == '1') { + + } else if (scoreCache != '' && options.update == '0') { + wx.redirectTo({ + url: '/pages/score/score', + }) + } + } else { + wx.redirectTo({ + url: '/pages/bookSearch/index' + }) + } + + that.getVcode(); + }, + getVcode: function() { + var that = this; + wx.request({ + url: app.globalData.apiURL + '/v4/getCookie.php', + success: function(res) { + console.log(res.data); + that.setData({ + PreInfo: res.data, + }) + if (res.data.code == 500) { + wx.showToast({ + title: '教务异常,无法查询', + icon: 'none', + duration: 5000 + }); + } + } + }); + }, + submitInfo: function(e) { + wx.showToast({ + title: "loading...", + icon: "loading", + duration: 10000 + }) + var that = this; + var username = wx.getStorageSync('uid'); + var password = wx.getStorageSync('newpwd'); + var vcode = e.detail.value.vcode; + if (vcode == '' || vcode.length != 4) { + wx.showToast({ + title: '验证码有误', + image: '/images/info.png', + icon: 'none', + duration: 1000 + }); + return; + } else { + wx.request({ + url: app.globalData.apiURL + '/v4/profile.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: username, + password: password, + cookie: that.data.PreInfo.cookie, + vcode: vcode + }, + success: function(res) { + that.setData({ + jsonStr: res.data, + }) + wx.hideToast() + console.log(res.data); + //账号密码错误以下功能实现密码错误Toast + if (res.data.code == 401) { + wx.showToast({ + title: '账号密码有误', + image: '/images/info.png', + duration: 3000 + }); + that.reLogin(); + } else if (res.data.code == 402) { + wx.showToast({ + title: '验证码错误', + image: '/images/info.png', + duration: 3000 + }); + that.getVcode(); + } else if (res.data.name != "" || res.data.number != "") { + wx.redirectTo({ + url: that.data.toPage + '?cookie=' + that.data.PreInfo.cookie + '&vcode=' + vcode + '&update=1', + }) + } else { + wx.redirectTo({ + url: '/pages/error/queryerror?ErrorTips=暂时无法查询,咨询客服学长了解详情' + }) + } + } + }) + } + }, + //注销重登录 + reLogin: function() { + app.globalData.uid = ""; + app.globalData.pwd = ""; + app.globalData.newpwd = ""; + wx.setStorageSync('uid', ''); + wx.setStorageSync('pwd', ''); + wx.setStorageSync('newpwd', ''); + wx.redirectTo({ + url: '/pages/index/index' + }) + }, +}) \ No newline at end of file diff --git a/pages/elesys/bind.json b/pages/index/vcode.json similarity index 58% rename from pages/elesys/bind.json rename to pages/index/vcode.json index 4b7401c..71dc900 100644 --- a/pages/elesys/bind.json +++ b/pages/index/vcode.json @@ -1,7 +1,6 @@ { - "navigationStyle": "default", - "navigationBarTitleText": "寝室绑定", "navigationBarBackgroundColor": "#7acfa6", + "backgroundColor": "#7acfa6", "enablePullDownRefresh": false, "disableScroll": true } \ No newline at end of file diff --git a/pages/index/vcode.wxml b/pages/index/vcode.wxml new file mode 100644 index 0000000..c7883ee --- /dev/null +++ b/pages/index/vcode.wxml @@ -0,0 +1,23 @@ + + + + + 对不起,小盒砸是无辜的。都怪那万恶的新教务系统更新验证码影响,成绩查询等教务相关查询操作需要您手动输入验证码。为此,小盒砸也是万般无奈,您还是赏个脸手动输入一下吧。(✿◡‿◡) + + + + + + + \ No newline at end of file diff --git a/pages/index/vcode.wxss b/pages/index/vcode.wxss new file mode 100644 index 0000000..e489c06 --- /dev/null +++ b/pages/index/vcode.wxss @@ -0,0 +1,332 @@ + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #7acfa6; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 30rpx 30rpx 30rpx; +} + +.content { + background: -webkit-gradient(linear, left top, left bottom, from(rgba(244, 244, 244, 0)), color-stop(0.1, #f4f4f4), to(#f4f4f4)); + opacity: 0; + transform: translate3d(0, 100%, 0); + animation: rise 3s cubic-bezier(0.19, 1, 0.22, 1) 0.25s forwards; +} + +@keyframes rise { + 0% { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 1; + transform: translate3d(0, 450rpx, 0); + } +} + +.title { + position: absolute; + top: 30rpx; + left: 50%; + width: 600rpx; + height: 200rpx; + margin-left: -300rpx; + opacity: 0; + animation: show 2.5s cubic-bezier(0.19, 1, 0.22, 1) 0.5s forwards; +} + +@keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 0.95; + } +} + +.hd { + position: absolute; + top: 0; + left: 50%; + width: 1000rpx; + margin-left: -500rpx; + height: 200rpx; + transition: all 0.35s ease; +} + +.logo { + position: absolute; + z-index: 2; + left: 50%; + bottom: 200rpx; + width: 160rpx; + height: 160rpx; + margin-left: -80rpx; + border-radius: 160rpx; + animation: sway 10s ease-in-out infinite; + opacity: 0.95; +} + +@keyframes sway { + 0% { + transform: translate3d(0, 20rpx, 0) rotate(-15deg); + } + + 17% { + transform: translate3d(0, 0rpx, 0) rotate(25deg); + } + + 34% { + transform: translate3d(0, -20rpx, 0) rotate(-20deg); + } + + 50% { + transform: translate3d(0, -10rpx, 0) rotate(15deg); + } + + 67% { + transform: translate3d(0, 10rpx, 0) rotate(-25deg); + } + + 84% { + transform: translate3d(0, 15rpx, 0) rotate(15deg); + } + + 100% { + transform: translate3d(0, 20rpx, 0) rotate(-15deg); + } +} + +.wave { + position: absolute; + z-index: 3; + right: 0; + bottom: 0; + opacity: 0.725; + height: 260rpx; + width: 2250rpx; + animation: wave 10s linear infinite; +} + +.wave-bg { + z-index: 1; + animation: wave-bg 10.25s linear infinite; +} + +@keyframes wave { + from { + transform: translate3d(125rpx, 0, 0); + } + + to { + transform: translate3d(1125rpx, 0, 0); + } +} + +@keyframes wave-bg { + from { + transform: translate3d(375rpx, 0, 0); + } + + to { + transform: translate3d(1375rpx, 0, 0); + } +} + +.bd { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + animation: bd-rise 2s cubic-bezier(0.23, 1, 0.32, 1) 0.75s forwards; + opacity: 0; +} + +@keyframes bd-rise { + from { + opacity: 0; + transform: translate3d(0, 60rpx, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +form { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: center; +} + +.input-group { + display: flex; + align-items: center; + padding: 25rpx 10rpx; + margin: 40rpx 3%; + background: #fff; + border-radius: 5px; + border: 2px solid #f4f4f4; + transition: all 0.25s ease-in-out; +} + +.input-group.active { + border: 2px solid #7acfa6; +} + +.input-label { + color: #888; + font-size: 13pt; + height: 25rpx; + line-height: 25rpx; + padding: 0 25rpx; + border-right: 1px solid #d8d8d8; +} + +.input-group input, .input-group picker { + flex: 1; + font-size: 13pt; + min-height: 52rpx; + height: 52rpx; + line-height: 52rpx; + padding: 0 25rpx; +} + +.input-placeholder, .input-group picker.placeholder { + color: #ccc; +} + +.login-help { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0 30rpx; + font-size: 10pt; + color: #bbb; +} + +.login-help-img { + width: 11pt; + height: 11pt; + margin: 0 5rpx; +} + +.confirm-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #7acfa6; + color: #fff; + text-align: center; + border-radius: 5px; + margin: 50rpx 3%; +} + +.confirm-btn:active { + opacity: 0.8; +} + +.help { + position: absolute; + z-index: 100; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.box { + position: relative; + display: flex; + flex-direction: column; + align-items: stretch; + width: 80%; + background: #fff; + border-radius: 10px; + box-shadow: 0 0 50px rgba(22, 22, 22, 0.35); + transform: translate3d(0, -400rpx, 0); +} + +.box-hd { + display: flex; + align-items: center; + justify-content: center; + height: 100rpx; + border-bottom: 1px solid #eee; +} + +.box-title { + font-size: 13pt; +} + +.box-close { + position: absolute; + right: 20rpx; + width: 35rpx; + height: 35rpx; + padding: 15rpx; +} + +.box-bd { + flex: 1; + display: flex; + flex-direction: column; + padding: 15rpx 40rpx 30rpx; +} + +.help-q { + color: #999; + font-size: 11pt; + line-height: 200%; + margin-top: 5rpx; +} + +.help-a { + text-indent: 1em; + line-height: 160%; + display: flex; + flex-direction: column; +} + +.help-a text { + word-break: break-all; +} + +/**登录动画**/ + +.login_video { + position: absolute; + z-index: 1; + top: 50%; + left: 50%; + width: 750rpx; + margin-left: -375rpx; + height: 1334rpx; + margin-top: -667rpx; +} + +.video_hidden { + visibility: hidden; +} + +page .wx-video-bar { + display: none; +} diff --git a/pages/net/netBind.js b/pages/net/netBind.js new file mode 100644 index 0000000..f8cc5a7 --- /dev/null +++ b/pages/net/netBind.js @@ -0,0 +1,120 @@ +// pages/net/netBind.js +//获取应用实例 +var app = getApp(); +var base64 = require('../../utils/base64.min.js'); +Page({ + data: { + uid: "", + netPassword: "", + help_status: false, + netPassword_focus: false, + angle: 0, + isBind: false + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + wx.showToast({ + title: "loading", + icon: "loading", + duration: 5000 + }) + var uid = wx.getStorageSync('uid'); + var netPassword = wx.getStorageSync('netPassword'); + var that = this; + if (uid != "" && netPassword != '') { + app.globalData.netPassword = netPassword; + wx.redirectTo({ + url: './netfare?uid=' + uid + '&netPassword=' + base64.encode(netPassword), + }) + wx.hideToast(); + } else { + that.setData({ + uid: uid, + isBind: false + }); + wx.hideToast(); + } + }, + NetQuery: function(e) { + var that = this; + console.log(that.data.uid); + console.log(e.detail.value.netPassword) + if (e.detail.value.netPassword.length <= 5) { + wx.showToast({ + title: '密码有误', + image: '/images/info.png', + icon: 'none', + duration: 1000 + }); + } else { + wx.request({ + url: app.globalData.apiURL + '/netFareExternal.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: that.data.uid, + netPassword: e.detail.value.netPassword + }, + success: function(res) { + that.setData({ + netJson: res.data, + }) + console.log(res.data); + //查询出错 + if (res.data.code != "200") { + wx.showToast({ + title: res.data.desc, + icon: 'none', + duration: 5000 + }); + } else if (res.data.code == "200") { + //设置本地Storage,维持登录态用 + wx.setStorageSync('netPassword', base64.encode(e.detail.value.netPassword)); + wx.redirectTo({ + url: './netfare?uid=' + that.data.uid + '&netPassword=' + base64.encode(e.detail.value.netPassword) + }) + } else { + wx.showToast({ + title: "无法查询,请联系客服", + icon: 'none', + duration: 5000 + }); + } + } + }) + } + }, + tapHelp: function(e) { + if (e.target.id == 'help') { + this.hideHelp(); + } + }, + showHelp: function(e) { + this.setData({ + 'help_status': true + }); + }, + hideHelp: function(e) { + this.setData({ + 'help_status': false + }); + }, + inputFocus: function(e) { + if (e.target.id == 'netPassword') { + this.setData({ + 'netPassword_focus': true + }); + } + }, + inputBlur: function(e) { + if (e.target.id == 'netPassword') { + this.setData({ + 'netPassword_focus': false + }); + } + }, +}); \ No newline at end of file diff --git a/pages/traffic/navi.json b/pages/net/netBind.json similarity index 53% rename from pages/traffic/navi.json rename to pages/net/netBind.json index c8fe754..729627d 100644 --- a/pages/traffic/navi.json +++ b/pages/net/netBind.json @@ -1,7 +1,6 @@ { - "navigationStyle": "default", - "navigationBarTitleText": "校园导航 - 贝壳小盒子", - "navigationBarBackgroundColor": "#7acfa6", + "navigationBarTitleText": " ", "enablePullDownRefresh": false, + "navigationBarBackgroundColor": "#7acfa6", "disableScroll": true } \ No newline at end of file diff --git a/pages/net/netBind.wxml b/pages/net/netBind.wxml new file mode 100644 index 0000000..6010015 --- /dev/null +++ b/pages/net/netBind.wxml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + 帮助 + + + + 1、帐号和密码是什么? + + 密码:您的校园网账号上网密码 + 初始密码请查看微信公众号“北京科技大学天津学院智慧校园”,上网方法帮助文章仔细寻找获取默认初始密码方法。 + + 2、忘记密码? + + 请携带学生证和身份证,前往3号教学楼309网络中心重置密码 + + + + + + + \ No newline at end of file diff --git a/pages/index/login.wxss b/pages/net/netBind.wxss similarity index 74% rename from pages/index/login.wxss rename to pages/net/netBind.wxss index 31bed69..028b9f2 100644 --- a/pages/index/login.wxss +++ b/pages/net/netBind.wxss @@ -1,14 +1,12 @@ -/**login.wxss**/ -@import "../../colorui/icon.wxss"; +/* pages/net/netBind.wxss */ .container { background: #7acfa6; align-items: stretch; padding: 0; height: 100%; - min-height: 100%; overflow: hidden; } -.content-login{ +.content{ flex: 1; display: flex; position: relative; @@ -29,7 +27,7 @@ 50% {opacity: 1;} 100% {opacity: 1;transform: translate3d(0,450rpx,0);} } -.title-login{ +.title{ position: absolute; top: 30rpx; left: 50%; @@ -58,10 +56,9 @@ z-index: 2; left: 50%; bottom: 200rpx; - width: 160rpx; - height: 160rpx; + width: 120rpx; + height: 120rpx; margin-left: -80rpx; - border-radius: 160rpx; animation: sway 10s ease-in-out infinite; opacity: .95; } @@ -75,7 +72,6 @@ 100% {transform: translate3d(0,20rpx,0) rotate(-15deg); } } .wave { - max-width: unset; position: absolute; z-index: 3; right: 0; @@ -112,6 +108,7 @@ to {opacity: 1; transform: translate3d(0,0,0); } } form { + margin-top: 100rpx; flex: 1; display: flex; flex-direction: column; @@ -131,7 +128,6 @@ form { .input-group.active { border: 2px solid #7acfa6; } - .input-label { color: #888; font-size: 13pt; @@ -156,7 +152,7 @@ form { .login-help { display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-end; padding: 0 30rpx; font-size: 10pt; color: #bbb; @@ -214,8 +210,8 @@ form { .box-close { position: absolute; right: 20rpx; - width: 35px; - height: 35px; + width: 35rpx; + height: 35rpx; padding: 15rpx; } .box-bd { @@ -256,81 +252,14 @@ form { page .wx-video-bar{ display: none; } - -page{ - font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; - font-size: 10pt; - line-height: 150%; - color: #666; - min-height: 100%; - position: relative; - display: flex; - flex-direction: column; - align-items: stretch; -} -.container { - position: relative; - flex: 1; - display: flex; - flex-direction: column; - min-height: 100%; - padding-bottom: 100rpx; - box-sizing: border-box; -} - -.remind-box { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding-bottom: 300rpx; - padding-left: 30rpx; - padding-right: 30rpx; -} -.remind-img { - width: 250rpx; - height: 250rpx; - padding-bottom: 25rpx; -} -.remind-text { - font-size: 12pt; - line-height: 150%; -} -.remind-btn { - margin-top: 20rpx; - font-size: 9pt; - padding: 5rpx 20rpx; - text-align: center; - background-color: #7acfa6; - border-radius: 3px; - border-bottom: 2px solid #4fc08d; +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 30rpx 30rpx 30rpx; } - -.fix_tip{ - position: fixed; - bottom: 50rpx; - left: 0; - width: 100%; - text-align: center; - opacity: 0; - transform: translate3d(0, 80rpx, 0); - transition: all .5s cubic-bezier(0.19, 1, 0.22, 1) -} -.fix_tip.active{ - opacity: 1; - transform: translate3d(0, 0, 0); -} -.fix_tip text{ - font-size: 9pt; - line-height: 100%; - padding: 10rpx 20rpx; - border-radius: 10rpx; - background: rgba(66,66,66,.6); - color: #fff; -} - -.active { - border: 2px solid #7acfa6; -} \ No newline at end of file diff --git a/pages/net/netfare.js b/pages/net/netfare.js new file mode 100644 index 0000000..a11c633 --- /dev/null +++ b/pages/net/netfare.js @@ -0,0 +1,114 @@ +// pages/net/netfare.js +var app = getApp(); +var base64 = require('../../utils/base64.min.js'); +Page({ + /** + * 页面的初始数据 + */ + data: { + netJson: "", + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + wx.showToast({ + title: "loading", + icon: "loading", + duration: 5000 + }) + console.log(options); + var that = this; + that.getJson(options.uid, base64.decode(options.netPassword)); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + + /** + * 用户点击右上角分享 + */ + // onShareAppMessage: function () { + + // } + getJson: function(uid, netPassword) { + var that = this; + wx.request({ + url: app.globalData.apiURL + '/netFareExternal.php', + method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + netPassword: netPassword + }, + success: function(res) { + that.setData({ + netJson: res.data, + }) + wx.hideToast(); + console.log(res.data); + //查询出错 + if (res.data.code == "401") { + wx.setStorageSync('netPassword', ''); + wx.showToast({ + title: res.data.desc, + icon: 'none', + duration: 5000 + }); + wx.redirectTo({ + url: './netBind' + }) + } else if (res.data.code == "200") { + //设置本地Storage,维持登录态用 + wx.setStorageSync('netPassword', base64.encode(netPassword)); + } else { + wx.redirectTo({ + url: '/pages/error/queryerror?ErrorTips=无法查询,请联系客服' + }) + } + } + }) + } +}) \ No newline at end of file diff --git a/pages/netsys/index.json b/pages/net/netfare.json similarity index 51% rename from pages/netsys/index.json rename to pages/net/netfare.json index 96b591d..d177bed 100644 --- a/pages/netsys/index.json +++ b/pages/net/netfare.json @@ -1,5 +1,6 @@ { - "navigationBarTitleText": "校历 - 贝壳小盒子", "navigationBarBackgroundColor": "#ffcb63", + "navigationBarTitleText": "网费查询", + "backgroundColor": "#ffcb63", "enablePullDownRefresh": false } \ No newline at end of file diff --git a/pages/net/netfare.wxml b/pages/net/netfare.wxml new file mode 100644 index 0000000..f0525bd --- /dev/null +++ b/pages/net/netfare.wxml @@ -0,0 +1,52 @@ + + + + + + + + {{netJson.name}} + {{netJson.number}} + + + 截止 + {{netJson.time}} + + + + + + 余额 + + {{netJson.balance}}元 + + + + + 本月计费 + + {{netJson.useFare}} 元 + + + + + + + + 本月流量 + {{netJson.monthUseFlow}}MB + + + + 本月在线时长 + {{netJson.monthUseLength}}分钟 + + + + 使用宿舍 + {{netJson.installedPlace}} + + + + + \ No newline at end of file diff --git a/pages/netsys/index.wxss b/pages/net/netfare.wxss similarity index 90% rename from pages/netsys/index.wxss rename to pages/net/netfare.wxss index 2246107..98bc7c7 100644 --- a/pages/netsys/index.wxss +++ b/pages/net/netfare.wxss @@ -1,6 +1,16 @@ -/* pages/netsys/index.wxss */ +/* pages/net/netfare.wxss */ + + page { - padding-bottom: 60rpx; + font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; + font-size: 10pt; + line-height: 150%; + color: #666; + min-height: 100%; + position: relative; + display: flex; + flex-direction: column; + align-items: stretch; } .container { @@ -103,7 +113,7 @@ page { .result-model { display: flex; flex-flow: column; - border-radius: 15rpx; + border-radius: 3px; color: #666; background-color: #faf9f7; overflow: hidden; @@ -181,15 +191,7 @@ page { .model-info { color: #777; font-weight: bold; - font-size: 30pt; - line-height: 120%; - padding: 0 15rpx 0 20rpx; -} - -.model-info-lite { - color: #777; - font-weight: bold; - font-size: 20pt; + font-size: 40pt; line-height: 120%; padding: 0 15rpx 0 20rpx; } @@ -222,4 +224,4 @@ page { bottom: -2rpx; left: 0; right: 0; -} \ No newline at end of file +} diff --git a/pages/netsys/bind.js b/pages/netsys/bind.js deleted file mode 100644 index 1d925c7..0000000 --- a/pages/netsys/bind.js +++ /dev/null @@ -1,142 +0,0 @@ -// pages/netsys/bind.js//获取应用实例 -var app = getApp(); -var domain = app.globalData.domain; -Page({ - data: { - remind: '加载中', - help_status: false, - netid_focus: false, - passwd_focus: false, - netid: '', - passwd: '', - bgimg: 'https://upload-images.jianshu.io/upload_images/4697920-61be38713bbefa8c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - angle: 0 - }, - onLoad: function (){ - }, - onReady: function(){ - var _this = this; - try { - const netsysUserInfo = wx.getStorageSync('netsysUserInfo') || {} - if(netsysUserInfo.netid.length > 0) { - wx.redirectTo({ url: './index' }) - } - } catch (error) { - _this.setData({ netid: app.globalData.edusysUserInfo.uid }) - } - - setTimeout(function(){ _this.setData({ remind: '' }) }, 1000); - wx.onAccelerometerChange(function(res) { - var angle = -(res.x*30).toFixed(1); - if(angle > 14){ angle = 14 } - else if(angle<-14) { angle = -14 } - if(_this.data.angle !== angle){ - _this.setData({ angle: angle }) - } - }); - }, - bind: function() { - if (!this.vaildForm()) { - return - } - var _this = this; - _this.getProfile() - }, - vaildForm: function () { - var netid = this.data.netid - var password = this.data.passwd - if(netid.length < 1){ - wx.showToast({ title: '请输入上网账号', icon: 'none' }) - return false - } - if (password.length < 1) { - wx.showToast({ title: '请输入校园网密码', icon: 'none' }) - return false - } - return true - }, - getProfile: function () { - var _this = this - _this.setData({remind: '加载中'}) - var netid = this.data.netid - var password = this.data.passwd - wx.request({ - url: `${domain}/netsys/profile`, - data:{ - uid: app.globalData.edusysUserInfo.uid, - userid: netid, - password: password, - }, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function(res){ - try { - if (res.data.welcome.length > 1) { - const netsysUserInfo = {netid: netid, password: password } - res.data.password = password - app.globalData.netsysUserInfo = res.data - wx.setStorage({ data: netsysUserInfo, key: 'netsysUserInfo' }) - wx.redirectTo({ url: './index' }) - } - } catch (error) { - _this.setData({remind: ''}) - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - } - } - }) - }, - netidInput: function(e) { - this.setData({ - netid: e.detail.value - }); - if(e.detail.value.length >= 9){ - wx.hideKeyboard(); - } - }, - passwdInput: function(e) { - this.setData({ - passwd: e.detail.value - }) - }, - inputFocus: function(e){ - if(e.target.id == 'netid'){ - this.setData({ - 'netid_focus': true - }) - }else if(e.target.id == 'passwd'){ - this.setData({ - 'passwd_focus': true - }) - } - }, - inputBlur: function(e){ - if(e.target.id == 'netid'){ - this.setData({ - 'netid_focus': false - }); - } else if(e.target.id == 'passwd'){ - this.setData({ - 'passwd_focus': false - }); - } - }, - tapHelp: function(e){ - if(e.target.id == 'help'){ - this.hideHelp(); - } - }, - showHelp: function(e){ - this.setData({ - 'help_status': true - }); - }, - hideHelp: function(e){ - this.setData({ - 'help_status': false - }) - } -}); \ No newline at end of file diff --git a/pages/netsys/bind.json b/pages/netsys/bind.json deleted file mode 100644 index d7c5cf9..0000000 --- a/pages/netsys/bind.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "navigationStyle": "default", - "navigationBarTitleText": "校园网账号绑定 - 贝壳小盒子", - "navigationBarBackgroundColor": "#7acfa6", - "enablePullDownRefresh": false, - "disableScroll": true -} \ No newline at end of file diff --git a/pages/netsys/bind.wxml b/pages/netsys/bind.wxml deleted file mode 100644 index a1e65ed..0000000 --- a/pages/netsys/bind.wxml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/pages/netsys/bind.wxss b/pages/netsys/bind.wxss deleted file mode 100644 index 6caf245..0000000 --- a/pages/netsys/bind.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/netsys/bind.wxss */ -@import "../index/login.wxss"; \ No newline at end of file diff --git a/pages/netsys/index.js b/pages/netsys/index.js deleted file mode 100644 index b91b982..0000000 --- a/pages/netsys/index.js +++ /dev/null @@ -1,95 +0,0 @@ -// pages/netsys/index.js -var app = getApp() -var util = require("../../utils/util") -Page({ - /** - * 页面的初始数据 - */ - data: { - isLoading: true, - uid: '', - netid: '', - password: '', - cookie: '', - info: '', - timeText: '' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.inital(); - }, - inital: function () { - var getDataBy = 'account' - const netsysUserInfo = wx.getStorageSync('netsysUserInfo') || {} - const edusysUserInfo = wx.getStorageSync('edusysUserInfo') || {} - if (netsysUserInfo.netid.length > 0 && edusysUserInfo.uid.length > 0) { - getDataBy = 'account'; - this.setData({ - uid: edusysUserInfo.uid, - netid: netsysUserInfo.netid, - password: netsysUserInfo.password - }) - this.getData(netsysUserInfo.netid, netsysUserInfo.password, '', getDataBy) - } else if (app.globalData.netsysUserInfo != '') { - getDataBy = 'cookie'; - this.setData({ cookie: app.globalData.netsysUserInfo.cookie }) - this.getData('', '', app.globalData.netsysUserInfo.cookie, getDataBy) - } else { - wx.removeStorageSync('netsysUserInfo') - wx.redirectTo({ url: './bind' }) - return - } - const date = new Date() - const nowTimestamp = date.getTime() - const timeText = util.formatDateTime(nowTimestamp, true) - if (edusysUserInfo == '') { - wx.redirectTo({ url: '../index/login' }) - } - this.setData({ timeText: timeText, uid: edusysUserInfo.uid}) - }, - getData: function (netid = '', password = '', cookie = '', getDataBy = 'account') { - var _this = this - let postdata = {} - - if (getDataBy === 'account') { - postdata = { - uid: app.globalData.edusysUserInfo.uid, - userid: netid, - password: password, - } - } else { - postdata = { cookie: cookie } - } - - wx.request({ - url: `${app.globalData.domain}/netsys/profile`, - data: postdata, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function(res){ - try { - if (res.data.welcome.length > 1) { - _this.setData({ info: res.data, isLoading: '' }) - app.globalData.netsysUserInfo = res.data - wx.vibrateShort({ type: 'medium' }) - } - } catch (error) { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - wx.redirectTo({ url: './bind' }) - } - } - }) - }, - unbind: function () { - wx.removeStorageSync('netsysUserInfo') - wx.vibrateShort({ type: 'medium' }) - wx.redirectTo({ url: './bind' }) - } -}) \ No newline at end of file diff --git a/pages/netsys/index.wxml b/pages/netsys/index.wxml deleted file mode 100644 index 2c46d16..0000000 --- a/pages/netsys/index.wxml +++ /dev/null @@ -1,86 +0,0 @@ - - - 网费查询 - - - - - - - - - - {{info.name}} - {{netid}} - - - {{info.status}} {{info.service}} - 解绑 - - - - - - 余额 - - {{info.leftMoney}}元 - - - - - 本月计费 - - {{info.monthlyFare}} 元 - - - - - - - - 本月流量 - {{info.monthlyFlow}}MB - - - - 本月在线时长 - {{info.monthlyTime}}分钟 - - - - 使用宿舍 - {{info.userAddress}} - - - - - - - - 扣费账单 - - - - - - 业务办理记录 - - - - - - 上网详单 - - - - - - 缴费明细 - - - - - - - - \ No newline at end of file diff --git a/pages/netsys/list.js b/pages/netsys/list.js deleted file mode 100644 index 215ea3f..0000000 --- a/pages/netsys/list.js +++ /dev/null @@ -1,161 +0,0 @@ -// pages/netsys/list.js -var app = getApp() -var util = require("../../utils/util") -Page({ - /** - * 页面的初始数据 - */ - data: { - isLoading: true, - radioItems: [ - { name: '月份', value: '3', checked: true }, - { name: '日期', value: '4' } - ], - today: '', - title: '', - type: 'feebill', - cookie: '', - info: '', - year: '', - month: '', - startDate: '', - endDate: '', - getDataBy: 3 - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - console.log(options) - this.inital(options) - }, - inital:function (options) { - const pageType = options.type - let getDataBy = this.data.getDataBy - - const date = new Date() - const thisYear = date.getFullYear() - const thisMonth = date.getFullYear() + '-' + (date.getMonth() + 1) - const today = util.formatDate(date) - - this.setData({ - type: pageType, - title: options.title, - cookie: options.cookie, - year: thisYear, - month: thisMonth, - today: today, - startDate: today, - endDate: today - }) - if (pageType == 'feebill') { - this.getFeebill('', app.globalData.netsysUserInfo.cookie) - } - if (pageType == 'bizlog' || pageType == 'uselog' || pageType == 'payment') { - if (pageType == 'uselog') { - getDataBy = 4 - this.setData({ getDataBy: getDataBy }) - } - this.getLogdata(getDataBy, thisMonth, today, today, app.globalData.netsysUserInfo.cookie) - } - }, - // 获取扣费账单记录 - getFeebill: function (year = '', cookie) { - wx.showLoading({ title: 'loading...' }) - var _this = this - wx.request({ - url: `${app.globalData.domain}/netsys/feebill`, - data: { year: year, cookie: cookie }, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function(res) { - try { - console.log(res.data) - _this.setData({ - info: res.data, - isLoading: '' - }) - wx.vibrateShort({ type: 'medium' }) - } catch (error) { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - } - wx.hideLoading() - } - }) - }, - // 获取业务办理操作记录、上网详单、缴费充值记录 - getLogdata: function (type = 4, month = '', startDate = '', endDate = '', cookie = '') { - wx.showLoading({ title: 'loading...' }) - var _this = this - wx.request({ - url: `${app.globalData.domain}/netsys/${this.data.type}`, - data: { - type: type, - month: month, - startDate: startDate, - endDate: endDate, - cookie: cookie - }, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function(res){ - try { - console.log(res.data) - _this.setData({ info: res.data, isLoading: '' }) - wx.vibrateShort({ type: 'medium' }) - } catch (error) { - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 5000 - }) - } - wx.hideLoading() - } - }) - }, - radioChange: function (e) { - this.setData({ getDataBy: e.detail.value }) - var radioItems = this.data.radioItems; - for (var i = 0, len = radioItems.length; i < len; ++i) { - radioItems[i].checked = radioItems[i].value == e.detail.value - } - this.setData({ radioItems: radioItems }) - }, - yearChange: function (e) { - this.setData({ year: e.detail.value }) - this.getFeebill(e.detail.value, app.globalData.netsysUserInfo.cookie) - }, - startDateChange: function (e) { - this.setData({ startDate: e.detail.value }) - }, - endDateChange: function (e) { - this.setData({ endDate: e.detail.value }) - }, - monthChange: function (e) { - const pageType = this.data.type - const type = this.data.getDataBy - const month = e.detail.value - const startDate = this.data.startDate - const endDate = this.data.endDate - const cookie = app.globalData.netsysUserInfo.cookie - this.setData({ month: month}) - if (pageType == 'bizlog') { - this.getLogdata(type, month, startDate, endDate, cookie ) - } - if (pageType == 'payment') { - this.getLogdata(type, month, startDate, endDate, cookie ) - } - }, - searchFeebill: function () { - this.getFeebill(this.data.year, app.globalData.netsysUserInfo.cookie) - }, - searchLog: function () { - this.getLogdata(this.data.getDataBy, this.data.month, this.data.startDate, this.data.endDate, app.globalData.netsysUserInfo.cookie) - } -}) \ No newline at end of file diff --git a/pages/netsys/list.json b/pages/netsys/list.json deleted file mode 100644 index 10ada01..0000000 --- a/pages/netsys/list.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/netsys/list.wxml b/pages/netsys/list.wxml deleted file mode 100644 index f7e31c5..0000000 --- a/pages/netsys/list.wxml +++ /dev/null @@ -1,142 +0,0 @@ - - - {{title}} - - - - - - - - - - - - 查询本人上网费用结算账单 - - - - 年份 - - {{year}} - - - - - - - - - 基本月租 - - {{info.summary.basicMonthlyRent}}元 - - - - - 时长计费 - - {{info.summary.fee}} 元 - - - - - - - 使用时长 - - {{info.summary.usedMinutes}}分钟 - - - - - 使用流量 - {{info.summary.usedFlow}}MB - - - - - - - - - 查询本人业务办理记录 - 查询本人交费明细 - - - 查询方式 - - {{item.name}} - - - - 月份 - - {{month}} - - - - 开始日期 - - {{startDate}} - - - - 结束日期 - - {{endDate}} - - - - - - - - - - - - 查询本人上下网使用详单 - - - - 开始日期 - - {{startDate}} - - - - 结束日期 - - {{endDate}} - - - - - - - - - - - - - 查询结果 - - 共{{info.data.length}}条 - - - - - {{row.name}}: - {{row.value}} - - - - - - - - - - \ No newline at end of file diff --git a/pages/netsys/list.wxss b/pages/netsys/list.wxss deleted file mode 100644 index 6982ebb..0000000 --- a/pages/netsys/list.wxss +++ /dev/null @@ -1,11 +0,0 @@ -/* pages/netsys/list.wxss */ -@import "../school/cert.wxss"; -@import "./index.wxss"; - -page{ - background-color: #eee; -} - -.word-wrap { - word-wrap:break-word; -} \ No newline at end of file diff --git a/pages/books/bind.js b/pages/opac/bind.js similarity index 71% rename from pages/books/bind.js rename to pages/opac/bind.js index 96e6004..82e9674 100644 --- a/pages/books/bind.js +++ b/pages/opac/bind.js @@ -1,5 +1,5 @@ -// pages/books/bind.js var app = getApp() +var base64 = require('../../utils/base64.min.js'); Page({ data: { uid: '', @@ -17,19 +17,15 @@ Page({ PreInfo: {}, isLoading: true, defaultUid: '', - storageOpacPassword:'', - from: 'index', - opacClosed: false, + storageOpacPassword:'' }, - onLoad: function(options) { - var that = this - var uid = app.globalData.edusysUserInfo.uid; - var pwd = wx.getStorageSync('opacPassword') || '' - const from = options.from ? options.from : 'index' + onLoad: function() { + var that = this; + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('opacPassword'); that.setData({ defaultUid: uid, - storageOpacPassword: pwd, - from: from + storageOpacPassword:pwd }) this.getVcode(); if (this.checkHasLogin()) {} else { @@ -37,13 +33,14 @@ Page({ } }, checkHasLogin: function() { - var uid = wx.getStorageSync('uid') || '' - var pwd = wx.getStorageSync('opacPassword') || '' + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('opacPassword'); if (uid != '' && pwd != '') { return true; } else { return false; } + }, submitInfo: function(e) { wx.showToast({ @@ -51,10 +48,10 @@ Page({ icon: "loading", duration: 10000 }) - var that = this - var uid = e.detail.value.username - var pwd = e.detail.value.password - var vcode = e.detail.value.vcode + var that = this; + var uid = e.detail.value.username; + var pwd = e.detail.value.password; + var vcode = e.detail.value.vcode; if ((uid.length == 0 || pwd.length == 0) || vcode.length != 4) { wx.showToast({ title: '输入有误', @@ -64,19 +61,22 @@ Page({ }); } else { wx.request({ - url: `${app.globalData.domain}/book/login/index`, + url: app.globalData.apiURL + '/opac/readerUCenter.php', method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, data: { - uid: app.globalData.edusysUserInfo.uid ? app.globalData.edusysUserInfo.uid : uid, username: uid, password: pwd, cookie: that.data.PreInfo.cookie, vcode: vcode, token: that.data.PreInfo.token, - sca: that.data.PreInfo.sca }, success: function(res) { - that.setData({ jsonStr: res.data }) + that.setData({ + jsonStr: res.data, + }) // console.log(res.data) wx.hideToast() // console.log(res.data); @@ -95,29 +95,17 @@ Page({ duration: 3000 }); that.getVcode(); - } else if (res.data.code == '200') { - if (res.data.readerInfo.name != "") { - - app.globalData.uid = uid; - app.globalData.opacLogin = { - uid: uid, - pwd: pwd, - vcode: vcode, - cookie: that.data.PreInfo.cookie, - token: that.data.PreInfo.token, - sca: that.data.PreInfo.sca - }; - //设置本地Storage,维持登录态用 - wx.setStorageSync('opacPassword', pwd) - if (that.data.from == 'portrait') { - wx.redirectTo({ url: '../books/portrait' }) - } else { - wx.redirectTo({ url: '../books/my' }) - } - } + } else if (res.data.readerInfo.name != "" && res.data.code == '200') { + app.globalData.uid = uid; + app.globalData.opacPassword = pwd; + //设置本地Storage,维持登录态用 + wx.setStorageSync('opacPassword', pwd); + wx.redirectTo({ + url: '/pages/opac/index?uid=' + uid + '&pwd=' + base64.encode(pwd) + '&cookie=' + that.data.PreInfo.cookie + '&vcode=' + vcode + '&token=' + base64.encode(that.data.PreInfo.token), + }) } else { wx.showToast({ - title: res.data.message, + title: '暂时无法登录', icon: 'none', duration: 3000 }); @@ -216,22 +204,21 @@ Page({ getVcode: function() { var that = this; wx.request({ - url: `${app.globalData.domain}/book/login/cookie`, + url: app.globalData.apiURL + '/opac/getLibCookie.php', success: function(res) { // console.log(res.data); that.setData({ PreInfo: res.data, }) if (res.data.code == 500) { - that.setData({ opacClosed: true }) wx.showToast({ - title: '图书馆系统异常', + title: '教务系统异常', icon: 'none', duration: 5000 }); } } - }) + }); }, resetPassword: function() { this.setData({ diff --git a/pages/books/bind.json b/pages/opac/bind.json similarity index 74% rename from pages/books/bind.json rename to pages/opac/bind.json index a86a783..410c995 100644 --- a/pages/books/bind.json +++ b/pages/opac/bind.json @@ -3,6 +3,5 @@ "backgroundColor": "#7acfa6", "navigationBarTitleText": "绑定借阅证", "enablePullDownRefresh": false, - "disableScroll": true, - "navigationStyle": "default" + "disableScroll": true } \ No newline at end of file diff --git a/pages/books/bind.wxml b/pages/opac/bind.wxml similarity index 86% rename from pages/books/bind.wxml rename to pages/opac/bind.wxml index cc360a0..5177c21 100644 --- a/pages/books/bind.wxml +++ b/pages/opac/bind.wxml @@ -1,14 +1,13 @@ - - + - + @@ -36,7 +35,7 @@ - + @@ -50,7 +49,8 @@ 1、证件号和密码是什么? 证件号:学生默认证件号为学号,教职工默认证件号请咨询图书馆。 - 密码:图书馆OPAC(“我的图书馆”)系统密码,默认密码为身份证后六位; + 密码:图书馆OPAC(“我的图书馆”)系统密码,19级默认密码为身份证后六位;18、17、16级默认密码学号 + 2、忘记密码? diff --git a/pages/books/bind.wxss b/pages/opac/bind.wxss similarity index 97% rename from pages/books/bind.wxss rename to pages/opac/bind.wxss index 9db9aae..9e1991a 100644 --- a/pages/books/bind.wxss +++ b/pages/opac/bind.wxss @@ -1,11 +1,8 @@ -/* pages/books/bind.wxss */ -@import "../index/login.wxss"; .container { background: #7acfa6; align-items: stretch; padding: 0; height: 100%; - min-height: 100%; overflow: hidden; } @@ -299,8 +296,8 @@ form { .box-close { position: absolute; right: 20rpx; - width: 35px; - height: 35px; + width: 35rpx; + height: 35rpx; padding: 15rpx; } @@ -348,4 +345,4 @@ form { page .wx-video-bar { display: none; -} \ No newline at end of file +} diff --git a/pages/books/my.js b/pages/opac/index.js similarity index 57% rename from pages/books/my.js rename to pages/opac/index.js index 53b273e..c7f314e 100644 --- a/pages/books/my.js +++ b/pages/opac/index.js @@ -1,6 +1,6 @@ -// pages/books/my.js -var app = getApp() -var util = require("../../utils/util") +//获取应用实例 +var app = getApp(); +var base64 = require('../../utils/base64.min.js'); Page({ data: { remind: '加载中', @@ -11,55 +11,13 @@ Page({ vcode_focus: false, renew_status: false, renewNeed: '', - renewBoxTop: 100, - showPasswordModal: false + renewBoxTop: 100 }, onLoad: function(para) { - const opacLogin = app.globalData.opacLogin; - this.getData(opacLogin); - }, - hidePasswordModal: function () { - this.setData({ showPasswordModal: false }); - }, - changePasswordAction: function (e) { - var that = this; - const newPassword = e.detail.value.newPassword; - const recheckPassword = e.detail.value.recheckPassword; - if (newPassword.length < 8 || recheckPassword.length < 8) { - wx.showToast({ title: '新密码不得少于八位', icon: 'none' }); - return; - } - - if (newPassword.length > 20 || recheckPassword.length > 20) { - wx.showToast({ title: '新密码不得多于20位', icon: 'none' }); - return; - } - - if (newPassword != recheckPassword){ - wx.showToast({ title: '两次密码不一样啊,再试试?', icon: 'none' }); - return; - } + console.log(para) - const name = this.data.jsonStr.readerInfo.name; - const cookie = this.data.jsonStr.input.cookie; + this.getData(para); - wx.request({ - url: `${app.globalData.domain}/book/login/password`, - method: "POST", - data: { name: name, password: newPassword, cookie: cookie }, - success: function(res) { - if (res.data.code == 200 && res.data.desc == 'success') { - wx.showToast({ title: res.data.data, icon: 'none' }); - wx.removeStorageSync('opacPassword'); - that.setData({ showPasswordModal: false}); - // 1秒后跳转重新登录 - setTimeout(function () { wx.redirectTo({ url: './bind' }) }, 1000); - } else { - wx.showToast({ title: res.data.data, icon: 'none' }); - return; - } - } - }) }, jyHistory: function() { var that = this; @@ -71,37 +29,53 @@ Page({ duration: 1000 }) }, - getJYHistory: function(page = 1) { + getJYHistory: function() { var that = this; wx.request({ - url: `${app.globalData.domain}/book/history`, + url: app.globalData.apiURL + '/opac/getBorrowedHistory.php', method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, data: { username: that.data.jsonStr.input.username, password: that.data.jsonStr.input.password, cookie: that.data.jsonStr.input.cookie, vcode: that.data.vcode, token: that.data.jsonStr.input.token, - sca: that.data.jsonStr.input.sca, - page: page }, success: function(res) { - that.setData({ remind: false }); + that.setData({ + remind: false, + }) // console.log(res.data); - if (res.data.code == '200') { + //账号密码错误以下功能实现密码错误Toast + if (res.data.code == 401) { + wx.showToast({ + title: '账号密码有误', + image: '/images/info.png', + duration: 3000 + }); + wx.redirectTo({ + url: '/pages/opac/bind', + }) + } else if (res.data.code == 402) { + wx.showToast({ + title: '验证码错误', + image: '/images/info.png', + duration: 3000 + }); + wx.redirectTo({ + url: '/pages/opac/bind', + }) + } else if (res.data.code == '200') { wx.hideToast() - if (res.data.input.page == 1) { - that.setData({ historyList: res.data }) - } else { - let historyList = that.data.historyList - historyList.input = res.data.input - historyList.execTime = res.data.execTime - historyList.data = that.data.historyList.data.concat(res.data.data) - that.setData({ historyList: historyList }) - } + that.setData({ + historyList: res.data, + }) } else { wx.showToast({ - title: res.data.desc, + title: '暂时无法查询', icon: 'none', duration: 3000 }); @@ -112,16 +86,17 @@ Page({ getData: function(para) { var that = this; wx.request({ - url: `${app.globalData.domain}/book/login/index`, + url: app.globalData.apiURL + '/opac/readerUCenter.php', method: "POST", + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, data: { - uid: app.globalData.edusysUserInfo.uid ? app.globalData.edusysUserInfo.uid : para.uid, username: para.uid, - password: para.pwd, + password: base64.decode(para.pwd), cookie: para.cookie, vcode: para.vcode, - token: para.token, - sca: para.sca + token: base64.decode(para.token), }, success: function(res) { that.setData({ @@ -192,7 +167,7 @@ Page({ }) var that = this; wx.request({ - url: `${app.globalData.domain}/book/renew/vcode`, + url: app.globalData.apiURL + '/opac/getOpacVcode.php', method: "POST", header: { 'content-type': 'application/x-www-form-urlencoded', @@ -255,7 +230,7 @@ Page({ }) } else { wx.request({ - url: `${app.globalData.domain}/book/renew`, + url: app.globalData.apiURL + '/opac/renewBook.php', method: "POST", header: { 'content-type': 'application/x-www-form-urlencoded', @@ -287,37 +262,5 @@ Page({ } }) } - }, - export: function () { - const cookie = this.data.jsonStr.input.cookie - const uid = this.data.jsonStr.input.username - const manage = wx.getFileSystemManager() - const fileName = util.formatDate(new Date()) + '_' + uid - wx.downloadFile({ - url: `${app.globalData.domain}/book/history/export?uid=${uid}&cookie=${cookie}`, - success (res) { - var savePath = wx.env.USER_DATA_PATH + "/" + fileName - if (res.statusCode == 200) { - manage.saveFile({ - tempFilePath: res.tempFilePath, - filePath: savePath+'.xlsx', - success:function(res){ - wx.openDocument({ - filePath: res.savedFilePath, - fileType: 'xlsx', - showMenu: true - }) - } - }) - } - } - }) - }, - onReachBottom () { - const currentPage = this.data.historyList.input.page - const total = this.data.jsonStr.readerInfo.borrowedBooksSum - if (currentPage * 20 >= total) return - const page = currentPage + 1 - this.getJYHistory(page) } }); \ No newline at end of file diff --git a/pages/books/my.json b/pages/opac/index.json similarity index 59% rename from pages/books/my.json rename to pages/opac/index.json index 6925cfd..ff860b9 100644 --- a/pages/books/my.json +++ b/pages/opac/index.json @@ -1,6 +1,5 @@ { "navigationBarBackgroundColor": "#73b4ef", "navigationBarTitleText": "我的借阅", - "backgroundColor": "#73b4ef", - "navigationStyle": "default" + "backgroundColor": "#73b4ef" } \ No newline at end of file diff --git a/pages/books/my.wxml b/pages/opac/index.wxml similarity index 72% rename from pages/books/my.wxml rename to pages/opac/index.wxml index 9b42717..de9c55a 100644 --- a/pages/books/my.wxml +++ b/pages/opac/index.wxml @@ -1,4 +1,3 @@ - @@ -17,18 +16,15 @@ 证件号:{{jsonStr.readerInfo.cardNO}} 条码号:{{jsonStr.readerInfo.barCodeNO}} - + + + {{jsonStr.readerInfo.expirationDate}}到期 - - - - - 最多可借 @@ -62,13 +58,12 @@ - + {{itemName.bookName}} - + @@ -92,7 +87,7 @@ 历史借阅记录 - + @@ -116,7 +111,7 @@ - + @@ -127,8 +122,7 @@ - \ No newline at end of file diff --git a/pages/books/my.wxss b/pages/opac/index.wxss similarity index 98% rename from pages/books/my.wxss rename to pages/opac/index.wxss index ecd4c31..ca6dbb1 100644 --- a/pages/books/my.wxss +++ b/pages/opac/index.wxss @@ -1,5 +1,6 @@ -/* pages/books/my.wxss */ -@import "../index/index.wxss"; +/**jy.wxss**/ +@import "../common/weui.wxss"; + .container { background-color: #f7f7f7; } @@ -340,8 +341,8 @@ form { .box-close { position: absolute; right: 20rpx; - width: 35px; - height: 35px; + width: 35rpx; + height: 35rpx; padding: 15rpx; } @@ -368,4 +369,4 @@ form { .help-a text { word-break: break-all; -} \ No newline at end of file +} diff --git a/pages/school/aboutus.js b/pages/school/aboutus.js deleted file mode 100644 index 74b0f05..0000000 --- a/pages/school/aboutus.js +++ /dev/null @@ -1,125 +0,0 @@ -// pages/school/aboutus.js -var app = getApp(); -Page({ - /** - * 页面的初始数据 - */ - data: { - width: '100%', - height: '', - version: '', - QGroupModal: false, - showFreedomFunc: false, - weappCodeImage: 'https://upload-images.jianshu.io/upload_images/4697920-92c8f24e739051d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - coder: [{ - avatar: 'https://upload-images.jianshu.io/upload_images/4697920-4bbd851e6b007d72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/128', - nickName: 'Airmole', - weibo: 'pages/profile/profile?objectUid=2423156830&nickname=Airmole' - }, { - avatar: 'https://upload-images.jianshu.io/upload_images/4697920-54c15375dfd9568e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/128', - nickName: '很奔放', - weibo: '' - }, { - avatar: 'https://upload-images.jianshu.io/upload_images/4697920-5b0f0ef862d2e5e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/128', - nickName: '秃头程序媛', - weibo: '' - }], - otherApps: [{ - appid: 'wx183616af30e5723d', - icon: 'https://upload-images.jianshu.io/upload_images/4697920-9f02095775140703.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/128', - name: '贝壳班车订票' - }] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - var that = this; - const accountInfo = wx.getAccountInfoSync(); - - that.setData({ - version: accountInfo.miniProgram.version, - width: wx.getSystemInfoSync().windowWidth * 0.9 + 'px', - height: wx.getSystemInfoSync().windowWidth * 0.9 * 0.5625 + 'px' - }) - wx.pageScrollTo({ - scrollTop: 1600, - duration: 4000, - }) - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - - setTimeout(function () { - wx.pageScrollTo({ - scrollTop: 0, - duration: 300, - }) - }, 4000); - }, - copyID: function () { - wx.setClipboardData({ - data: 'wxf0ba93e3faff4eda' - }) - wx.showToast({ - title: '已复制到粘贴版', - icon: 'none', - duration: 1000 - }); - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function (res) { - return { - title: '关于 - 【贝壳小盒子】 ', - path: 'pages/school/aboutus', - } - }, - showAppCode: function () { - var weappCode = this.data.weappCodeImage; - wx.previewImage({ - current: weappCode, // 当前显示图片的http链接 - urls: [weappCode] // 需要预览的图片http链接列表 - }) - }, - goOtherApps: function (e) { - var appid = e.currentTarget.dataset.appid; - wx.navigateToMiniProgram({ appId: appid }) - }, - checkUpdate: function () { - app.appUpdate('userclick'); - }, - showQQGroupCode: function () { - this.setData({ QGroupModal: true }) - }, - hideQQGroupCode: function () { - this.setData({ QGroupModal: false }) - }, - goWeibo: function (e) { - var weiboPath = e.currentTarget.dataset.weibo; - - if (weiboPath.length > 0) { - wx.navigateToMiniProgram({ - appId: 'wx9074de28009e1111', - path: weiboPath - }) - } - }, - canBeFree: function (e) { - const hasEdusysStorage = app.globalData.hasEdusysStorage - if (!hasEdusysStorage) { - return - } - - if (this.data.showFreedomFunc) { - this.setData({ showFreedomFunc: false }) - return - } - - } -}) \ No newline at end of file diff --git a/pages/school/aboutus.json b/pages/school/aboutus.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/school/aboutus.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/aboutus.wxml b/pages/school/aboutus.wxml deleted file mode 100644 index 4429a56..0000000 --- a/pages/school/aboutus.wxml +++ /dev/null @@ -1,110 +0,0 @@ - - - 关于 - 贝壳小盒子 - - - - - - - - - - - - - - - - 贝壳小盒子 - 公测 {{version}} - - - 检测更新 - - - - - - - 简介 - - 贝壳小盒子(ShellBox)是一款微信小程序,致力于帮助师生更方便的查询教务、图书、用电等信息,以及浏览学院校历、拨打各系部电话,并提供校园内地理导航等功能。 - 贝壳小盒子目前还处于公测阶段,有一系列新的功能正在我们的开发计划中。“你想要的,都在这里!” - - *: 微信小程序版本开发维护优先于QQ版本小程序,强烈建议优先使用微信小程序版贝壳小盒子 - - - 数据来源 - - - - * 课表、成绩等数据来自教务处官网 \r\n - * 图书相关信息来自相关网络 \r\n - * 校历、各系部联系电话来自于网络收集 \r\n - * 用电数据、网费信息来自智慧校园 \r\n - * 四六级成绩由 “国家政务服务平台” 小程序提供 \r\n - * 实时公交数据由 “车来了” 小程序提供 - - - - - 开发贡献 - - - - - - {{item.nickName}} - - - - - 关联贝壳小盒子 - - - 若您或者您的朋友在运营校园相关的公众号(学生组织/社团/校园自媒体等),「贝壳小盒子」诚挚地欢迎您的公众号关联我们的小程序,并期待合作!\r\n - - AppID:wxf0ba93e3faff4eda - - 其他小程序 - - - - - {{item.name}} - - - - - - - - - - - - - - - - - - - - - - 我知道了 - - - - - - - \ No newline at end of file diff --git a/pages/school/board/detail.js b/pages/school/board/detail.js deleted file mode 100644 index 7c5f32d..0000000 --- a/pages/school/board/detail.js +++ /dev/null @@ -1,201 +0,0 @@ -// pages/school/board/detail.js -var app = getApp() -Page({ - /** - * 页面的初始数据 - */ - data: { - env: 'develop', - isLoading: true, - isAdminer: false, - canReplay: false, - uid: '', - id: '', - backpage: '', - tags: ['其他', '食堂', '宿舍', '教学楼', '老师'], - data: [] - }, - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.setData({ env: app.globalData.env }) - this.inital(options) - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - onShow: function () { - this.getDetailData(this.data.id, 1) - }, - inital: function (options) { - const envVersion = app.globalData.env - if (envVersion != 'release') { - wx.switchTab({ url: '../../index/index' }) - } - const id = options.id - const edusysInfo = wx.getStorageSync('edusysUserInfo') || {} - const uid = edusysInfo != '' && edusysInfo.uid ? edusysInfo.uid : 0 - const backpage = options.backpage ? options.backpage : 1 - let pages = getCurrentPages() - let prevPage = pages[pages.length - 2] - if (prevPage) prevPage.setData({ backpage: backpage }) - this.setData({ id: id }) - this.getDetailData(id, 1) - console.log(typeof app.globalData.isBoardAdminer, app.globalData.isBoardAdminer) - if (app.globalData.isBoardAdminer == undefined) { - this.isAdminer(uid) - } else { - this.setData({ uid: uid, isAdminer: app.globalData.isBoardAdminer ? true : false }) - } - }, - getDetailData: function (id, page = 1) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - data: { page: page }, - timeout: app.globalData.requestTimeout, - success: (res) => { - const canReplay = _this.data.isAdminer ? true : false - _this.setData({ data: res.data, canReplay: canReplay, isLoading: false }) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - reditConfirm: function (e) { - const id = e.currentTarget.dataset.id - const _this = this - wx.showModal({ - title: '注意', - content: '真的要重新编辑此回复?', - success(res) { - if (res.confirm) { - wx.navigateTo({ url: `./edit?reditid=${id}` }) - } else if (res.cancel) { - console.log('用户点击取消') - } - } - }) - }, - deleteConfirm: function (e) { - const id = e.currentTarget.dataset.id - const _this = this - wx.showModal({ - title: '真的要删除?', - content: '确认删除嘛?将会删除本条回复评论且无法恢复!', - success(res) { - if (res.confirm) { - _this.deleteDataItem(id) - } else if (res.cancel) { - console.log('用户点击取消') - } - } - }) - }, - reply() { - const id = this.data.id - wx.navigateTo({ url: `./edit?id=${id}` }) - }, - update(e) { - const id = this.data.id - const hot = e.currentTarget.dataset.hot ? e.currentTarget.dataset.hot : this.data.data.content.hot - const resolve_status = e.currentTarget.dataset.resolve ? e.currentTarget.dataset.resolve : this.data.data.content.resolve_status - const data = { hot: hot, resolve_status: resolve_status } - const _this = this - wx.showModal({ - title: '注意', - content: resolve_status == 1 ? '设置为已解决后将无法重新修改解决状态,确认【已解决】?' : '确定设为【常见问题】嘛?', - success(res) { - if (res.confirm) { - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - data: data, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function (res) { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.showToast({ title: '操作成功' }) - _this.getDetailData(_this.data.id, 1) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - } else if (res.cancel) { - console.log('取消操作') - } - } - }) - }, - deleteDataItem: function (id) { - wx.showLoading({ title: '删除中...' }) - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - timeout: app.globalData.requestTimeout, - method: 'DELETE', - success: (res) => { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.hideLoading() - wx.showToast({ title: res.data.message }) - _this.getDetailData(_this.data.id, 1) - } - } catch (error) { - wx.hideLoading() - wx.showToast({ title: res.data.message, icon: 'none' }) - wx.vibrateShort({ type: 'medium' }) - } - } - }) - }, - isAdminer: function (uid = 0) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/adminer/${uid}`, - timeout: app.globalData.requestTimeout, - success: (res) => { - app.globalData.isBoardAdminer = false - if (res.data.code == 200 && res.data.message == 'success') { - _this.setData({ uid: uid, isAdminer: true }) - app.globalData.isBoardAdminer = true - } - } - }) - }, - // 上一页 - lastPage: function () { - const current = this.data.data.pagination.current - const targetPage = current > 1 ? Number(current) - 1 : 2 - this.getDetailData(this.data.id, targetPage) - }, - // 下一页 - nextPage: function () { - const current = this.data.datalist.pagination.current - const last = this.data.datalist.pagination.last - const targetPage = current < last ? Number(current) + 1 : last - this.getDetailData(this.data.id, targetPage) - }, - previewImage: function (e) { - wx.previewImage({ urls: e.currentTarget.dataset.allurl, current: e.currentTarget.dataset.url }) - }, - callPhone: function (e) { - var tel = e.currentTarget.dataset.tel; - wx.makePhoneCall({ phoneNumber: tel }); - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - const id = this.data.id - return { - title: '投诉维权', - path: `pages/school/board/detail?id=${id}` - } - } -}) \ No newline at end of file diff --git a/pages/school/board/detail.json b/pages/school/board/detail.json deleted file mode 100644 index 2e3378c..0000000 --- a/pages/school/board/detail.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/board/detail.wxml b/pages/school/board/detail.wxml deleted file mode 100644 index e04391f..0000000 --- a/pages/school/board/detail.wxml +++ /dev/null @@ -1,158 +0,0 @@ - - - - 投诉维权详情 - - - - - - - - - - - - - - - {{data.content.id}} - {{data.content.created_at}} - - - - - - {{tags[data.content.tag]}} - - {{data.content.status == 1 ? '已回复': '待回复'}} - - {{data.content.resolve_status == 1 ? '已解决': '解决中'}} - - - - {{data.content.place_building}} - {{data.content.place_room}} - - - {{data.content.content}} - - - - - - - - - - - 登录 - - - - - - - 投诉人联系方式 - - - - - - - - {{data.content.nickname}} - 联系方式:{{data.content.mobile}} - - - - - - - - - - - - 评论回复 - - - - 常见问题 - - - - 非常见问题 - - - - 已解决 - - - - - - - - - 回复 - - - - - - - - - - 权益中心工作人员 - {{item.nickname}} - {{item.created_at}} - - - - - {{item.content}} - - - - - - - - - - - - - - - - - - - - - - - - - - - {{data.pagination.current}} / - {{data.pagination.last}} - - - - - - - - - \ No newline at end of file diff --git a/pages/school/board/detail.wxss b/pages/school/board/detail.wxss deleted file mode 100644 index 974e74a..0000000 --- a/pages/school/board/detail.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/school/board/detail.wxss */ -@import "../cert.wxss"; \ No newline at end of file diff --git a/pages/school/board/edit.js b/pages/school/board/edit.js deleted file mode 100644 index 02b6d13..0000000 --- a/pages/school/board/edit.js +++ /dev/null @@ -1,294 +0,0 @@ -// pages/school/board/edit.js -var app = getApp() -Page({ - /** - * 页面的初始数据 - */ - data: { - env: 'develop', - uid: 0, - nickname: '', - avatar: '', - pindex: null, - imgList: [], - content: '', - mobile: '', - realted: '', - reditid: '', - tag: null, - tags: ['其他', '食堂', '宿舍', '教学楼', '老师', '图书馆'], - canteen: null, - canteens: ['一食堂', '二食堂', '三食堂'], - library: null, - libraries: ['理工图书馆', '社科图书馆'], - teachBuilding: null, - teachBuildings: [], - dormitory: null, - dormitories: [], - placeRoom: '' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.setData({ env: app.globalData.env }) - if (app.globalData.env != 'release') { - wx.switchTab({ url: '../../index/index' }) - } - this.inital(options) - }, - inital: function (options) { - let weuser = wx.getStorageSync('edusysUserInfo') || {} - let openid = wx.getStorageSync('openid') || {} - openid = openid.openid ? openid.openid : '' - const nickname = weuser.nickname ? weuser.nickname : openid - const avatar = weuser.avatar - const edusysInfo = wx.getStorageSync('edusysUserInfo') || {} - const uid = edusysInfo.uid ? edusysInfo.uid : 0 - const realted = options.id ? options.id : '' - const reditid = options.reditid ? options.reditid : '' - if (reditid != '') this.getDetailData(reditid, 1) - // 生成教学楼选择列表 - const teachBuildings = [] - for (let index = 1; index < 13; index++) { - teachBuildings.push(`${index}号教学楼`) - } - // 生成宿舍楼选择列表 - const dormitories = [] - for (let index = 1; index < 43; index++) { - dormitories.push(`${index}斋`) - } - this.setData({ - uid: uid, - nickname: nickname, - avatar: avatar, - realted: realted, - reditid: reditid, - teachBuildings: teachBuildings, - dormitories: dormitories - }) - }, - contentInput: function (e) { - this.setData({ content: e.detail.value }) - }, - mobileInput: function (e) { - this.setData({ mobile: e.detail.value }) - }, - roomInput: function (e) { - this.setData({ placeRoom: e.detail.value }) - }, - tagChange(e) { - this.setData({ - tag: e.detail.value - }) - }, - canteenChange(e) { - this.setData({ - canteen: e.detail.value - }) - }, - libraryChange(e) { - this.setData({ - library: e.detail.value - }) - }, - dormitoryChange(e) { - this.setData({ - dormitory: e.detail.value - }) - }, - teachBuildingChange(e) { - this.setData({ - teachBuilding: e.detail.value - }) - }, - previewImage: function (e) { - wx.previewImage({ urls: this.data.imgList, current: e.currentTarget.dataset.url }) - }, - DelImg: function (e) { - var _this = this - wx.showModal({ - title: '桥豆麻袋', - content: '确定要删除这张图片?', - cancelText: '点错了', - confirmText: '删掉!', - success: res => { - if (res.confirm) { - _this.data.imgList.splice(e.currentTarget.dataset.index, 1) - _this.setData({ imgList: _this.data.imgList }) - } - } - }) - }, - chooseImage: function () { - var _this = this - wx.chooseMedia({ - count: 1, - mediaType: ['image'], - sizeType: ['compressed'], - sourceType: ['album', 'camera'], - success: (res) => { - wx.showLoading({ title: '上传中...' }) - var tempFilesSize = res.tempFiles[0].size - console.log('上传图片文件大小', tempFilesSize) - if (tempFilesSize > 2000000) { // 2M图片大小限制 - wx.hideLoading() - wx.showToast({ title: '上传图片不能大于2M!', icon: 'none' }) - return - } - _this.uploadImage(res.tempFiles[0].tempFilePath) - } - }) - }, - uploadImage: function (filepath) { - var _this = this - const domain = app.globalData.domain - wx.uploadFile({ - url: `${domain}/upload`, - formData: { category: 'complain' }, - filePath: filepath, - name: 'image', - success(res) { - wx.hideLoading() - const data = JSON.parse(res.data) - if (res.statusCode == 200 || data.code == 200) { - console.log(data) - if (_this.data.imgList.length != 0) { - _this.setData({ imgList: _this.data.imgList.concat(data.url) }) - } else { - _this.setData({ imgList: [data.url] }) - } - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - }, - postContent: function () { - // 编辑修改 - if (this.data.reditid) { - const content = this.data.content - const images = this.data.imgList - if (content == '' && images.length == 0) { - wx.showToast({ title: '图片,文字内容,你总得填一个吧', icon: 'none' }) - return - } - this.update(this.data.reditid, { content: content, images: images }) - return - } - // 发布新帖、评论 - const uid = this.data.uid - const nickname = this.data.nickname ? this.data.nickname : uid - const avatar = this.data.avatar ? this.data.avatar : '' - const content = this.data.content - const images = this.data.imgList - const realted = this.data.realted - const mobile = this.data.mobile - const tag = this.data.tag === null ? '0' : this.data.tag - let place_building = '' - let place_room = this.data.placeRoom - if (tag == 1) place_building = this.data.canteen === null ? '' : this.data.canteens[this.data.canteen] - if (tag == 2) place_building = this.data.dormitory === null ? '' : this.data.dormitories[this.data.dormitory] - if (tag == 3) place_building = this.data.teachBuilding === null ? '' : this.data.teachBuildings[this.data.teachBuilding] - if (tag == 5) place_building = this.data.library === null ? '' : this.data.libraries[this.data.library] - const data = { - uid: uid, - nickname: nickname, - avatar: avatar, - tag: tag, - content: content, - images: images, - mobile: mobile, - place_building: place_building, - place_room: place_room - } - if ((tag == '' || tag == null) && realted == '') { - wx.showToast({ title: '请先选择投诉问题类型', icon: 'none' }) - return - } - // 食堂、教学楼、宿舍问题选择位置验证 - if ((tag <= 3 && tag >= 1) && (place_building == '' || place_room == '')) { - wx.showToast({ title: '请填写位置', icon: 'none' }) - return - } - if (mobile.length < 5 && realted == '') { - wx.showToast({ title: '请您务必输入正确联系方式,以便工作人员联系你', icon: 'none' }) - return - } - if (realted != '') data.realted = realted - if (content.length < 1) { - wx.showToast({ title: '你啥都没输入鸭!!!', icon: 'none' }) - return - } - const templateIds = ['el20tge29Hz5-ZLDcKZABYj6BPiPK8eAUb4gumP01PQ'] - const _this = this - if (realted){ - _this.sendPostRequest(data) - return - } - wx.requestSubscribeMessage({ - tmplIds: templateIds, - success (res) { - _this.sendPostRequest(data) - }, - fail (res) { - _this.sendPostRequest(data) - } - }) - }, - sendPostRequest: function (data) { - wx.request({ - url: `${app.globalData.domain}/complain`, - data: data, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function (res) { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.showToast({ title: '发布成功' }) - // 1秒后跳转上页 - setTimeout(function () { wx.navigateBack({ delta: 1 }) }, 1000) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - }, - getDetailData: function (id, page = 1) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - data: { page: page }, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({ content: res.data.content.content, imgList: res.data.content.images }) - } - }) - }, - update(id, data) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - data: data, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function (res) { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.showToast({ title: '修改成功' }) - // 1秒后跳转上页 - setTimeout(function () { wx.navigateBack({ delta: 1 }) }, 1000) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - } -}) \ No newline at end of file diff --git a/pages/school/board/edit.json b/pages/school/board/edit.json deleted file mode 100644 index 2e3378c..0000000 --- a/pages/school/board/edit.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/board/edit.wxml b/pages/school/board/edit.wxml deleted file mode 100644 index c19131e..0000000 --- a/pages/school/board/edit.wxml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - 投诉维权信息 - - - - - - - 投诉问题类型 - - - {{tag?tags[tag]:'请选择投诉问题类型'}} - - - - - - - 维权食堂 - - - {{canteen?canteens[canteen]:'点击选择食堂'}} - - - - - - - - - 宿舍 - - - {{dormitory?dormitories[dormitory]:'点击选择宿舍'}} - - - - - - - - - 教学楼 - - - {{teachBuilding?teachBuildings[teachBuilding]:'点击选择教学楼'}} - - - - - - - - - 图书馆 - - - {{library?libraries[library]:'点击选择图书馆'}} - - - - - - - - 联系方式 - - - - - - - - - 图片(也可以不上传) - {{imgList.length}}/4 - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/board/edit.wxss b/pages/school/board/edit.wxss deleted file mode 100644 index d2f8941..0000000 --- a/pages/school/board/edit.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/school/board/edit.wxss */ -@import "../cert.wxss"; \ No newline at end of file diff --git a/pages/school/board/faq.js b/pages/school/board/faq.js deleted file mode 100644 index 1ecdaf9..0000000 --- a/pages/school/board/faq.js +++ /dev/null @@ -1,156 +0,0 @@ -// pages/school/board/faq.js -var app = getApp() -Page({ - /** - * 页面的初始数据 - */ - data: { - env: 'develop', - isLoading: true, - isAdminer: false, - uid: 0, - qrcode: 'https://upload-images.jianshu.io/upload_images/4697920-03629fe77465b1b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/512', - datalist: [], - tags: ['其他', '食堂', '宿舍', '教学楼', '老师'] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.setData({ env: app.globalData.env }) - if (app.globalData.env != 'release') { - wx.switchTab({ url: '../../index/index' }) - } - - this.inital() - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - onShow: function () { - this.inital() - }, - inital: function () { - this.getHotDatalist() - let edusysInfo = wx.getStorageSync('edusysUserInfo') || {} - const uid = edusysInfo != '' && edusysInfo.uid ? edusysInfo.uid : 0 - this.setData({ uid: uid }) - this.isAdminer(uid) - }, - getHotDatalist: function (page = 1, hot = [1]) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain`, - data: { - page: page, - hot: JSON.stringify(hot) - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({ datalist: res.data, isLoading : false }) - } - }) - }, - isAdminer: function(uid = 0) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/adminer/${uid}`, - timeout: app.globalData.requestTimeout, - success: (res) => { - app.globalData.isBoardAdminer = false - if (res.data.code == 200 && res.data.message == 'success') { - _this.setData({ isAdminer: true }) - app.globalData.isBoardAdminer = true - } - } - }) - }, - deleteConfirm: function(e) { - const id = e.currentTarget.dataset.id - const _this = this - wx.showModal({ - title: '真的要删除?', - content: '确认删除嘛?将会连同相关评论回复全部一起删除且无法恢复。', - success (res) { - if (res.confirm) { - _this.deleteDataItem(id) - } else if (res.cancel) { - console.log('用户点击取消') - } - } - }) - }, - deleteDataItem: function (id) { - wx.showLoading({ title: '删除中...' }) - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - timeout: app.globalData.requestTimeout, - method: 'DELETE', - success: (res) => { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.hideLoading() - wx.showToast({ title: res.data.message }) - _this.getDatalist() - } - } catch (error) { - wx.hideLoading() - wx.showToast({ title: res.data.message, icon: 'none' }) - wx.vibrateShort({ type: 'medium' }) - } - } - }) - }, - update (e) { - const id = e.currentTarget.dataset.id - const hot = e.currentTarget.dataset.hot - const data = { hot: hot } - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - data: data, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function (res) { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.showToast({ title: '操作成功' }) - _this.getHotDatalist() - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - }, - previewImage:function (e) { - wx.previewImage({ urls: e.currentTarget.dataset.allurl, current: e.currentTarget.dataset.url }) - }, - // 上一页 - lastPage: function () { - const current = this.data.datalist.pagination.current - const targetPage = current > 1 ? Number(current) - 1 : 2 - this.getHotDatalist(targetPage) - }, - // 下一页 - nextPage: function () { - const current = this.data.datalist.pagination.current - const last = this.data.datalist.pagination.last - const targetPage = current < last ? Number(current) + 1 : last - this.getHotDatalist(targetPage) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - title: '“贝壳小盒子” - 投诉维权常见问题', - path: 'pages/school/board/faq' - } - } -}) \ No newline at end of file diff --git a/pages/school/board/faq.json b/pages/school/board/faq.json deleted file mode 100644 index 2e3378c..0000000 --- a/pages/school/board/faq.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/board/faq.wxml b/pages/school/board/faq.wxml deleted file mode 100644 index 932d0fb..0000000 --- a/pages/school/board/faq.wxml +++ /dev/null @@ -1,74 +0,0 @@ - - - - 投诉维权 - 常见问题 - - - - - - - - - - - - - - - {{item.id}} - {{item.created_at}} - - - - - - {{tags[item.tag]}} - - {{item.status == 1 ? '已回复': '待回复'}} - {{item.content}} - - - - - - - - 查看详情 - - - - - - - - - - - - - - - - - - - - - {{datalist.pagination.current}} / - {{datalist.pagination.last}} - - - - - - - - - \ No newline at end of file diff --git a/pages/school/board/faq.wxss b/pages/school/board/faq.wxss deleted file mode 100644 index 4d52954..0000000 --- a/pages/school/board/faq.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/school/board/faq.wxss */ -@import "../cert.wxss"; \ No newline at end of file diff --git a/pages/school/board/index.js b/pages/school/board/index.js deleted file mode 100644 index 69bb9ad..0000000 --- a/pages/school/board/index.js +++ /dev/null @@ -1,187 +0,0 @@ -// pages/school/board/index.js -var app = getApp() -Page({ - /** - * 页面的初始数据 - */ - data: { - showMoreDesc: false, - env: 'develop', - isLoading: true, - isAdminer: false, - uid: 0, - qrcode: 'https://upload-images.jianshu.io/upload_images/4697920-03629fe77465b1b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/512', - datalist: [], - hotDatalist: [], - tags: ['其他', '食堂', '宿舍', '教学楼', '老师'], - tag: '[0,1,2,3,4]', - tagList: [{ - title: '所有', - value: '[0,1,2,3,4]' - }, { - title: '食堂', - value: '[1]' - }, { - title: '宿舍', - value: '[2]' - }, { - title: '教学楼', - value: '[3]' - }, { - title: '老师', - value: '[4]' - }, { - title: '其他', - value: '[0]' - }], - backpage: '1' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.setData({ env: app.globalData.env }) - if (app.globalData.env != 'release') { - wx.switchTab({ url: '../../index/index' }) - } - - this.inital() - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - onShow: function () { - let pages = getCurrentPages() - let currPage = pages[pages.length - 1] - const page = currPage.data.backpage ? currPage.data.backpage : '1' - this.inital(page) - }, - inital: function (page = 1) { - this.getDatalist(page) - this.getHotDatalist() - const edusysInfo = wx.getStorageSync('edusysUserInfo') || {} - const uid = (edusysInfo != '' && edusysInfo.uid) ? edusysInfo.uid : 0 - this.setData({ uid: uid }) - this.isAdminer(uid) - }, - getDatalist: function (page = 1) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain`, - data: { - page: page, - tag: _this.data.tag - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({ datalist: res.data, isLoading: false }) - wx.vibrateShort({ type: 'medium' }) - } - }) - }, - getHotDatalist: function (page = 1, hot = [1]) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain`, - data: { - page: page, - hot: JSON.stringify(hot) - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({ hotDatalist: res.data }) - } - }) - }, - tagChanged: function (e) { - const tag = this.data.tagList[e.currentTarget.dataset.index].value - // console.log(type, orderby); - this.setData({ tag: tag}); - this.getDatalist(1, tag); - }, - isAdminer: function(uid = 0) { - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/adminer/${uid}`, - timeout: app.globalData.requestTimeout, - success: (res) => { - app.globalData.isBoardAdminer = false - if (res.data.code == 200 && res.data.message == 'success') { - _this.setData({ isAdminer: true }) - app.globalData.isBoardAdminer = true - } - } - }) - }, - deleteConfirm: function(e) { - const id = e.currentTarget.dataset.id - const _this = this - wx.showModal({ - title: '真的要删除?', - content: '确认删除嘛?将会连同相关评论回复全部一起删除且无法恢复。', - success (res) { - if (res.confirm) { - _this.deleteDataItem(id) - } else if (res.cancel) { - console.log('用户点击取消') - } - } - }) - }, - deleteDataItem: function (id) { - wx.showLoading({ title: '删除中...' }) - const _this = this - wx.request({ - url: `${app.globalData.domain}/complain/${id}`, - timeout: app.globalData.requestTimeout, - method: 'DELETE', - success: (res) => { - try { - if (res.statusCode == 200 && res.data.code == 200) { - wx.hideLoading() - wx.showToast({ title: res.data.message }) - _this.getDatalist() - } - } catch (error) { - wx.hideLoading() - wx.showToast({ title: res.data.message, icon: 'none' }) - wx.vibrateShort({ type: 'medium' }) - } - } - }) - }, - previewImage:function (e) { - wx.previewImage({ urls: e.currentTarget.dataset.allurl, current: e.currentTarget.dataset.url }) - }, - unfoldDesc: function () { - const showMoreDesc = this.data.showMoreDesc - this.setData({ showMoreDesc: !showMoreDesc }) - }, - goFaqPage () { - wx.navigateTo({ url: './faq'}) - }, - // 上一页 - lastPage: function () { - const current = this.data.datalist.pagination.current - const targetPage = current > 1 ? Number(current) - 1 : 2 - this.getDatalist(targetPage) - }, - // 下一页 - nextPage: function () { - const current = this.data.datalist.pagination.current - const last = this.data.datalist.pagination.last - const targetPage = current < last ? Number(current) + 1 : last - this.getDatalist(targetPage) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - title: '“贝壳小盒子” - 投诉维权通道', - path: 'pages/school/board/index' - } - } -}) \ No newline at end of file diff --git a/pages/school/board/index.json b/pages/school/board/index.json deleted file mode 100644 index 2e3378c..0000000 --- a/pages/school/board/index.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/board/index.wxml b/pages/school/board/index.wxml deleted file mode 100644 index 0c7de5d..0000000 --- a/pages/school/board/index.wxml +++ /dev/null @@ -1,144 +0,0 @@ - - - - 投诉维权通道 - - - - - - - - - - -     如果您在学校遇到了以下问题,可以向“北科天院权益中心”发起投诉维权:\n - - 1.食堂问题;  2.维修问题;  3.教学;  4.其他;  \n - - 展开详细说明 - - - - - 1. 食堂问题:\n     外卖,工作人员,饭菜,餐具,桌椅,其他问题; - 2. 维修问题: -     宿舍:厕所,床架,书桌(宿舍维修问题需注明几斋几室); -     操场:石板,体育设施; -     教学区域:桌椅,黑板, 媒体设备,门窗; -     公共区域:图书馆,下水井盖破损,路灯不亮; - 3. 教学: -     对任课老师的建议。 - 4.其他问题(您在校园里遇见的其他需要求助相关部门的问题) - - 注:请勿发布无关的话题内容!您的投诉留言将由“北科天院权益中心”相关工作人员回复并跟进解决,其他同学无权回复评论。 -     工作人员会在投诉问题后24-48小时内给您回复,请您在投诉维权后持续关注本维权投诉通道对应投诉内容的相关答复。 - - - 收起详细说明 - - - - - - - - 常见问题 - - - - - - - - {{item.content}} - - - {{tags[item.tag]}} - - - - - 更多... - - - - - - - 我要投诉维权 - - - - - - - - {{item.title}} - - - - - - - - - - - {{item.id}} - {{item.created_at}} - - - - - - {{tags[item.tag]}} - - {{item.status == 1 ? '已回复': '待回复'}} - - {{item.resolve_status == 1 ? '已解决': '解决中'}} - {{item.content}} - - - - - - - - 查看详情 - - - - - - - - - - - - - - - - - - {{datalist.pagination.current}} / - {{datalist.pagination.last}} - - - - 本功能由"贝壳小盒子"为北科天院权益中心开发\n欢迎更多社团与小盒子合作 - - - - - - - \ No newline at end of file diff --git a/pages/school/board/index.wxss b/pages/school/board/index.wxss deleted file mode 100644 index abc3b67..0000000 --- a/pages/school/board/index.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/school/board/index.wxss */ -@import "../cert.wxss"; - -.faq-item { - min-height: 70rpx !important; -} \ No newline at end of file diff --git a/pages/school/calendar.js b/pages/school/calendar.js deleted file mode 100644 index 020f77a..0000000 --- a/pages/school/calendar.js +++ /dev/null @@ -1,70 +0,0 @@ -// pages/school/calendar.js -var app = getApp(); -Page({ - /** - * 页面的初始数据 - */ - data: { - calendarImage: 'https://image.airmole.net/file/830d9301f45a8c7b109d1.jpg', - isLoading: true, - screenHeight: '900', - colorArr: ['red','orange','yellow','olive','green','cyan','blue','purple','mauve','pink','brown','grey','gray'], - jsonContent: '', - gradeArray: [{ - title: '大一', - value: 'freshmanWork' - },{ - title: '大二', - value: 'sophomoreWork' - },{ - title: '大三', - value: 'juniorWork' - },{ - title: '大四', - value: 'seniorWork' - }] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.inital(); - }, - inital: function () { - const device = wx.getSystemInfoSync(); - // console.log(device.screenHeight); - this.setData({screenHeight: device.screenHeight}); - // 再通过setData更改Page()里面的data,动态更新页面的数据 - var _this = this; - wx.request({ - url: app.globalData.domain + '/edu/calendar', - success(res) { - // console.log(res.data) - _this.setData({ jsonContent: res.data }) - setTimeout(function () { - _this.setData({ isLoading: false }) - wx.vibrateShort({ type: 'medium' }) - }, 800) - } - }) - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function (res) { - return { - title: '校历', - path: 'pages/school/calendar', - } - }, - showPic: function () { - var image = this.data.calendarImage; - wx.previewImage({ current: image, urls: [image] }) - } -}) \ No newline at end of file diff --git a/pages/school/calendar.json b/pages/school/calendar.json deleted file mode 100644 index aad4c3d..0000000 --- a/pages/school/calendar.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "navigationBarTitleText": "校历 - 贝壳小盒子", - "navigationBarBackgroundColor": "#030c13", - "enablePullDownRefresh": false, - "usingComponents": { - "calendar-item": "./component/calendarItem" - } -} \ No newline at end of file diff --git a/pages/school/calendar.wxml b/pages/school/calendar.wxml deleted file mode 100644 index 1c84b31..0000000 --- a/pages/school/calendar.wxml +++ /dev/null @@ -1,94 +0,0 @@ - - - 校历 - 贝壳小盒子 - - - - - - - - - - - 教学校历 - - - - {{jsonContent.schoolYear}}学年 第{{jsonContent.semester}}学期\n - - {{jsonContent.month}} 月{{jsonContent.day}} 日(第 {{jsonContent.teachWeek}} 周) - {{jsonContent.dayOfWeek}}\n - - - {{jsonContent.month}}月{{jsonContent.day}}日(假期){{jsonContent.dayOfWeek}} - - \r\n受各种因素影响,校历为暂行版或更新不及时,学校随时可能更新或根据实际情况变更,本校历仅供参考. - - - - - - - - - - - - - 本周(第{{jsonContent.teachWeek}}周)校历安排 - - - - {{item.title}} - {{jsonContent.thisWeekWork[item.value]}} - - - - - - - - - - - - - - - 下周(第{{jsonContent.teachWeek+1}}周)校历安排 - - - - {{item.title}} - {{jsonContent.nextWeekWork[item.value]}} - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/calendar.wxss b/pages/school/calendar.wxss deleted file mode 100644 index 4917692..0000000 --- a/pages/school/calendar.wxss +++ /dev/null @@ -1,48 +0,0 @@ -/* pages/school/calendar.wxss */ -page { - background-color: #333333; -} - -.calendar-item { - position: relative; - display: flex; - padding: 0 30rpx; - min-height: 100rpx; - justify-content: space-between; - align-items: center; - background-color: var(--cyan); - color: var(--white); -} - -.remind-box { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding-top: 300rpx; - padding-bottom: 300rpx; -} -.remind-img { - width: 250rpx; - height: 250rpx; - padding-bottom: 25rpx; -} -.remind-text { - font-size: 12pt; - line-height: 150%; -} -.remind-btn { - margin-top: 20rpx; - font-size: 9pt; - padding: 5rpx 20rpx; - text-align: center; - background-color: #7acfa6; - border-radius: 3px; - border-bottom: 2px solid #4fc08d; - color: #fff; -} - -.item-height{ - height: 200rpx; -} diff --git a/pages/school/card/bind.js b/pages/school/card/bind.js deleted file mode 100644 index 409ece1..0000000 --- a/pages/school/card/bind.js +++ /dev/null @@ -1,58 +0,0 @@ -// pages/school/card/bind.js -var app = getApp() -Page({ - - /** - * 页面的初始数据 - */ - data: { - webImage: 'https://upload-images.jianshu.io/upload_images/4697920-b9667ae84f3059d7.png', - uid: '', - password: '' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad(options) { - const ehallAccount = wx.getStorageSync('ehallAccount') || {} - const idcard = app.globalData.edusysUserInfo.idcard || '' - - let uid = options.uid || '' - let password = options.password || '' - if (uid != '' && password == '') { - const pointGrade = 20 - const grade = uid.substr(0, 2) - // 20级之前默认密码身份证号码后六位 - if (grade < pointGrade && uid.indexOf(grade) === 0) password = idcard.substring(idcard.length - 6) - // 20级之后默认密码身份证号码后八位 - if (grade >= pointGrade && uid.indexOf(grade) === 0) password = idcard.substring(idcard.length - 8) - } - if (uid != '' && password == '' && ehallAccount && ehallAccount.uid == uid) password = ehallAccount.password - if (uid == '' && password=='' && ehallAccount && ehallAccount.uid) { - uid = ehallAccount.uid - password = ehallAccount.password - } - this.setData({ uid: uid, password: password }) - if (uid && password) this.getCardAmount(uid, password) - }, - getCardAmount(uid = '', password = '') { - var _this = this - wx.request({ - url: `${app.globalData.domain}/ehall/card`, - data: { uid: uid, password: password }, - success (res) { - if (res.statusCode == 200) { - wx.setStorageSync('ehallAccount', { - uid: uid, - password: password - }) - wx.redirectTo({ url: `./index?uid=${uid}&password=${password}` }) - } else { - _this.setData({ password: '' }) - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - } -}) \ No newline at end of file diff --git a/pages/school/card/bind.json b/pages/school/card/bind.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/school/card/bind.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/card/bind.wxml b/pages/school/card/bind.wxml deleted file mode 100644 index 423f6f1..0000000 --- a/pages/school/card/bind.wxml +++ /dev/null @@ -1,31 +0,0 @@ - - - 一卡通绑定关联 - - - - - - - - - 请输入关联以上系统平台账号密码\r\n默认初始账号为学号,大一新生可能暂不支持\r\n19级默认密码身份证号后六位,20,21级末8位 - - - - - 账号 - - - - 密码 - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/card/bind.wxss b/pages/school/card/bind.wxss deleted file mode 100644 index 718d975..0000000 --- a/pages/school/card/bind.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/card/bind.wxss */ \ No newline at end of file diff --git a/pages/school/card/index.js b/pages/school/card/index.js deleted file mode 100644 index 36c8914..0000000 --- a/pages/school/card/index.js +++ /dev/null @@ -1,73 +0,0 @@ -// pages/school/card/index.js -const app = getApp() -Page({ - - /** - * 页面的初始数据 - */ - data: { - remind: '', - user: {}, - ehall: {}, - uid: '', - password: '' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad(options) { - let uid = options ? options.uid : '' - let password = options ? options.password : '' - if (uid == '' || password == '') { - const ehallAccount = wx.getStorageSync('ehallAccount') || {} - uid = ehallAccount ? ehallAccount.uid : '' - password = ehallAccount ? ehallAccount.password : '' - } - if (uid == '' || password == '') { - const idcard = app.globalData.edusysUserInfo.idcard || '' - uid = app.globalData.edusysUserInfo.uid - password = idcard.substring(idcard.length - 6) - } - if (uid == '' || password == '') { - wx.redirectTo({ url: './bind?uid=&password=' }) - return - } - - this.getCardAmount(uid, password) - this.setData({ user: app.globalData.edusysUserInfo, uid: uid, password: password }) - }, - getCardAmount(uid = '', password = '') { - var _this = this - wx.request({ - url: `${app.globalData.domain}/ehall/card`, - data: { uid: uid, password: password }, - success(res) { - if (res.statusCode == 200) { - wx.setStorageSync('ehallAccount', { - uid: uid, - password: password - }) - _this.setData({ ehall: res.data }) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - setTimeout(function () { wx.redirectTo({ url: './bind?uid=&password=' }) }, 1500) - } - } - }) - }, - rebind() { - wx.showModal({ - title: '提示', - content: '您确认要切换查询其他一卡通余额?', - success(res) { - if (res.confirm) { - wx.setStorageSync('ehallAccount', '') - wx.redirectTo({ url: './bind?password=&uid=' }) - } else if (res.cancel) { - } - } - }) - - } -}) \ No newline at end of file diff --git a/pages/school/card/index.json b/pages/school/card/index.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/school/card/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/card/index.wxml b/pages/school/card/index.wxml deleted file mode 100644 index 7bee98b..0000000 --- a/pages/school/card/index.wxml +++ /dev/null @@ -1,85 +0,0 @@ - - - 一卡通余额 - - - - - - - - - - - - 余额 - - {{ehall.amount}}元 - - - - - - - - 截至:{{ehall.execTime}} - 卡号:{{ehall.cardno}} - - - - - - - 姓名 - - - {{user.name}} - - - - - 班级 - - - {{user.class}} - - - - - 学号 - - - {{user.uid}} - - - - - 专业 - - - {{user.profession}} - - - - - 一卡通卡号 - - - {{ehall.cardno}} - - - - - - - - - 切换查询他人一卡通余额 - - - - - - - - \ No newline at end of file diff --git a/pages/school/card/index.wxss b/pages/school/card/index.wxss deleted file mode 100644 index 2902d2a..0000000 --- a/pages/school/card/index.wxss +++ /dev/null @@ -1,71 +0,0 @@ -/* pages/school/card/index.wxss */ - -/* 今日余额 */ -.ykt-card { - display: flex; - flex-direction: column; - height: 350rpx; - margin: 15rpx 50rpx 45rpx; - background: #ffcb63; - border-radius: 15rpx; - box-shadow: 5rpx 5rpx 15rpx #ccc; -} -.ykt-black-line { - width: 100%; - height: 80rpx; - margin: 40rpx 0 0; - background: #7b7b7b; -} -.ykt-content { - flex: 1; - display: flex; - align-items: center; - justify-content: space-between; -} -.ykt-ye { - flex: 1; - display: flex; - flex-direction: column; - padding-right: 50rpx; - color: #777; -} -.ykt-ye-name { - font-size: 11pt; - line-height: 50rpx; - padding-left: 30rpx; -} -.ykt-ye-money { - text-align: center; - font-size: 10pt; -} -.ykt-ye-value { - font-size: 36pt; - font-weight: bold; - line-height: 80rpx; - padding-right: 25rpx; -} -.ykt-img { - display: flex; - align-items: center; - justify-content: center; - width: 200rpx; -} -.ykt-img image { - width: 125rpx; - height: 125rpx; - padding: 20rpx 30rpx; -} -.ykt-card-more { - display: flex; - justify-content: space-between; - align-items: flex-end; - margin: 5rpx 25rpx 10rpx 25rpx; - line-height: 100%; - opacity: .6; -} -.ykt-ye-time { - font-size: 9pt; -} -.ykt-ye-id { - font-size: 10pt; -} diff --git a/pages/school/cert.js b/pages/school/cert.js deleted file mode 100644 index 33551a7..0000000 --- a/pages/school/cert.js +++ /dev/null @@ -1,291 +0,0 @@ -// pages/school/cert.js -Page({ - - /** - * 页面的初始数据 - */ - data: { - isLoading: true, - hasWeappMethod: ['http://cet.neea.edu.cn/cet/'], - cardColor: ['red', 'orange', 'yellow', 'olive', 'green', 'blue', 'purple', 'mauve', 'pink'], - certList: [ - { - title: '英语四六级(CET-4/6)', - hookId: 'cet', - content: [{ - subtitle: '官网', - url: 'http://cet.neea.edu.cn/' - }, { - subtitle: '报名', - url: 'http://cet-bm.neea.edu.cn/' - }, { - subtitle: '成绩查询', - url: 'http://cet.neea.edu.cn/cet/' - }] - }, { - title: '计算机等级考试(计算机二级)(NCRE)', - hookId: 'ncre', - content: [{ - subtitle: '官网', - url: 'http://ncre.neea.edu.cn/' - }, { - subtitle: '报名', - url: 'https://ncre-bm.neea.cn/' - }, { - subtitle: '成绩查询', - url: 'http://cjcx.neea.edu.cn/html1/folder/1508/206-1.htm?sid=300' - }] - }, - { - title: '中小学教师资格考试(NTCE)', - hookId: 'ntce', - content: [{ - subtitle: '官网', - url: 'http://ntce.neea.edu.cn/' - }, { - subtitle: '报名', - url: 'http://ntce.neea.edu.cn/html1/folder/16013/15-1.htm' - }, { - subtitle: '成绩查询', - url: 'http://cjcx.neea.edu.cn/html1/folder/1508/206-1.htm?sid=2nasVMoohJ6cFnsQEIjGYmh' - }, { - subtitle: '合格证查询', - url: 'http://ntce.neea.edu.cn/html1/folder/1508/211-1.htm?sid=660' - }] - }, - { - title: '英语专四专八考试(TEM-4/8)', - hookId: 'tem', - content: [{ - subtitle: '官网', - url: 'http://tem.fltonline.cn/' - }, { - subtitle: 'TEM-4', - url: 'http://tem.fltonline.cn/?p=75109' - }, { - subtitle: 'TEM-8', - url: 'http://tem.fltonline.cn/?p=75109' - }, { - subtitle: '报名', - url: '仅支持学校英语专业统一组织报名' - }] - }, - { - title: '会计资格证', - hookId: 'kzp', - content: [{ - subtitle: '官网', - url: 'http://kzp.mof.gov.cn/index.jsp' - }, { - subtitle: '成绩查询', - url: 'http://kzp.mof.gov.cn/cjcx/cjcx.jsp' - }] - }, - { - title: '普通话水平测试', - hookId: 'cltt', - content: [{ - subtitle: '报名', - url: 'http://bm.cltt.org/' - }] - }, - { - title: '软考(软件工程师考试)', - hookId: 'ruankao', - content: [{ - subtitle: '官网', - url: 'https://www.ruankao.org.cn/' - }, { - subtitle: '报名', - url: 'https://bm.ruankao.org.cn/sign/welcome' - }] - }, - { - title: '证券从业资质考试', - hookId: 'zhengquan', - content: [{ - subtitle: '官网', - url: 'https://www.sac.net.cn/cyry/kspt/kstz/' - }] - }, - { - title: '基金从业资格考试', - hookId: 'jijin', - content: [{ - subtitle: '报名', - url: 'https://www.amac.org.cn/' - }] - }, - { - title: '银行从业资格考试', - hookId: 'bank', - content: [{ - subtitle: '官网', - url: 'https://www.china-cba.net/Index/lists/catid/31.html' - },{ - subtitle: '报名', - url: 'http://cj.ccbp.org.cn/apply/' - }] - }, - { - title: '期货从业资格考试', - hookId: 'qihuo', - content: [{ - subtitle: '报名', - url: 'http://cfa.ata.net.cn/site/#/default/login' - }] - }, - { - title: '注册会计师考试', - hookId: 'cpa', - content: [{ - subtitle: '官网', - url: 'https://www.cicpa.org.cn/' - }, { - subtitle: '报名', - url: 'https://www.cicpa.org.cn/ztzl1/exam/' - }] - }, - { - title: '法律职业资格考试', - hookId: 'laywer', - content: [{ - subtitle: '官网', - url: 'http://www.moj.gov.cn/jgsz/jgszzsdw/zsdwgjsfkszx/' - }] - }, - { - title: '剑桥商务英语(BEC)', - hookId: 'bec', - content: [{ - subtitle: '官网', - url: 'http://bec.neea.cn/' - }] - }, - { - title: '雅思(IELTS)', - hookId: 'ielts', - content: [{ - subtitle: '官网', - url: 'http://ielts-main.neea.cn/' - }, { - subtitle: '报名', - url: 'https://ielts.neea.cn/' - }] - }, - { - title: '托福(TOEFL)', - hookId: 'toefl', - content: [{ - subtitle: '官网', - url: 'https://toefl.neea.cn/' - }, { - subtitle: '报名', - url: 'https://toefl.neea.cn/examination_reg_cn.html' - }] - } - ] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.inital(); - }, - inital: function () { - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - copyUrl(e) { - const url = e.currentTarget.dataset.url - - wx.setClipboardData({ - data: url, - success(res) { - wx.getClipboardData({ - success(res) { - console.log(res.data) // data - wx.showToast({ - title: '复制成功,粘贴到浏览器访问', - icon: 'none' - }) - } - }) - } - }) - }, - goToHook(e) { - const hookId = e.currentTarget.dataset.target - wx.pageScrollTo({ - duration: 2500, - selector: '#' + hookId - }) - }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - var that = this; - setTimeout(function () { - that.setData({ - isLoading: false - }); - }, 400); - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - title: '“贝壳小盒子” - 考证助手', - path: 'pages/school/cert' - } - }, - goToOtherWeapp(e) { - if (e.currentTarget.dataset.url == 'http://cet.neea.edu.cn/cet/') { - wx.navigateToMiniProgram({ - appId: 'wx2eec5fb00157a603', - path: 'jiaoyubu/pages/business/cet/fillInfo/fillInfo', - }) - } - } -}) \ No newline at end of file diff --git a/pages/school/cert.json b/pages/school/cert.json deleted file mode 100644 index 16d9035..0000000 --- a/pages/school/cert.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "navigationStyle": "default", - "navigationBarTitleText": "考证助手 - 贝壳小盒子", - "navigationBarBackgroundColor": "#57B8B3", - "enablePullDownRefresh": false -} \ No newline at end of file diff --git a/pages/school/cert.wxml b/pages/school/cert.wxml deleted file mode 100644 index 85924f5..0000000 --- a/pages/school/cert.wxml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - 考证助手 - - - - 大学期间可考的资格证书考证咨询,为同学们提供报考、成绩查询、准考证打印等资源信息。若相应网址链接变更可以咨询提醒客服学长修改。 - - - - - - - - - {{item.title}} - - - - - - - - - - - - - - - - {{item.title}} - - {{subItem.subtitle}}: - - {{subItem.url}} - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/cert.wxss b/pages/school/cert.wxss deleted file mode 100644 index e804909..0000000 --- a/pages/school/cert.wxss +++ /dev/null @@ -1,50 +0,0 @@ -/* pages/school/cert.wxss */ - -page{ - background-color: var(--cyan); -} -.remind-box { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding-bottom: 300rpx; -} -.remind-img { - width: 250rpx; - height: 250rpx; - padding-bottom: 25rpx; -} -.card-item { - padding: 30rpx; - color: #fff; - margin-bottom: 30rpx; - overflow-x: scroll; -} - -.card-title { - font-size: 15pt; - border-bottom: 1px solid #eee; -} - -.card-content { - margin-top: 15rpx; -} - -.desc-title { - display: flex; - font-size: 13pt; - line-height: 200%; -} - -.desc-content { - padding-bottom: 15rpx; - font-size: 12pt; - text-decoration: underline; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - /* color: rgb(83, 143, 233); - text-shadow:-1px 0 white,0 1px white,1px 0 white,0 -1px white; */ -} \ No newline at end of file diff --git a/pages/school/component/calendarItem.js b/pages/school/component/calendarItem.js deleted file mode 100644 index 038082b..0000000 --- a/pages/school/component/calendarItem.js +++ /dev/null @@ -1,45 +0,0 @@ -// pages/school/component/calendarItem.js -Component({ - options: { - styleIsolation: 'isolated' - }, - /** - * 组件的属性列表 - */ - properties: { - outcolor: { - type: String, - value: 'black' - }, - bgcolor: { - type: String, - value: 'blue' - }, - value: { - type: String, - value: '' - }, - title: { - type: String, - value: '' - }, - subtitle: { - type: String, - value: '' - } - }, - - /** - * 组件的初始数据 - */ - data: { - - }, - - /** - * 组件的方法列表 - */ - methods: { - - } -}) diff --git a/pages/school/component/calendarItem.json b/pages/school/component/calendarItem.json deleted file mode 100644 index 32640e0..0000000 --- a/pages/school/component/calendarItem.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "component": true -} \ No newline at end of file diff --git a/pages/school/component/calendarItem.wxml b/pages/school/component/calendarItem.wxml deleted file mode 100644 index 4b107a7..0000000 --- a/pages/school/component/calendarItem.wxml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - {{title}} - {{subtitle}} - - {{value}} - - \ No newline at end of file diff --git a/pages/school/component/calendarItem.wxss b/pages/school/component/calendarItem.wxss deleted file mode 100644 index b2d518d..0000000 --- a/pages/school/component/calendarItem.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/school/component/calendarItem.wxss */ -@import "../../../app.wxss"; - -.item-height{ - height: 200rpx; -} \ No newline at end of file diff --git a/pages/school/finance/bind.js b/pages/school/finance/bind.js deleted file mode 100644 index 123d01f..0000000 --- a/pages/school/finance/bind.js +++ /dev/null @@ -1,198 +0,0 @@ -// pages/school/finance/bind.js -var app = getApp() -Page({ - data: { - username: '', - password: '', - jsonContent: {}, - jsonStr: "", - help_status: false, - userid_focus: false, - passwd_focus: false, - vcode_focus: false, - angle: 0, - cookieInfo: {}, - isLoading: true, - password:'', - }, - onLoad: function(options) { - const hasFinanceCookie = app.globalData.financeInfo ? true : false - if (hasFinanceCookie) { - wx.redirectTo({ url: './index' }) - return - } - var that = this - var uid = app.globalData.edusysUserInfo.uid - let username = uid - let password = wx.getStorageSync('financePassword') || '' - password = password ? password : app.globalData.edusysUserInfo.idcard.substr(12) - that.setData({ - username: username, - password: password - }) - this.getVcode(); - if (this.checkHasLogin()) {} else { - this.onReady(); - } - }, - checkHasLogin: function() { - var username = wx.getStorageSync('uid') || '' - var password = wx.getStorageSync('financePassword') || '' - if (username != '' && password != '') { - return true; - } else { - return false; - } - }, - submitInfo: function(e) { - wx.showToast({ - title: "登录中...", - icon: "loading", - duration: 10000 - }) - var that = this - var username = e.detail.value.username - var password = e.detail.value.password - var vcode = e.detail.value.vcode - if ((username.length == 0 || password.length == 0) || vcode.length != 5) { - wx.showToast({ - title: '输入有误', - image: '/images/info.png', - icon: 'none', - duration: 1000 - }) - } else { - wx.request({ - url: `${app.globalData.domain}/finance/login`, - method: "POST", - data: { - uid: app.globalData.edusysUserInfo.uid, - username: username, - password: password, - cookie: that.data.cookieInfo.cookie, - vcode: vcode, - }, - success: function(res) { - // console.log(res.data) - wx.hideToast() - // console.log(res.data); - //账号密码错误以下功能实现密码错误Toast - if (res.statusCode == 200) { - that.setData({ jsonStr: res.data }) - app.globalData.financeInfo = { - username: username, - password: password, - vcode: vcode, - cookie: res.data.cookie - }; - //设置本地Storage,维持登录态用 - wx.setStorageSync('financePassword', password) - wx.redirectTo({ url: './index' }) - } else { - wx.showToast({ - title: res.data.detail ? res.data.detail.content : res.data.message, - icon: 'none', - duration: 3000 - }) - that.getVcode() - } - } - }) - } - }, - tapHelp: function(e) { - if (e.target.id == 'help') { - this.hideHelp(); - } - }, - showHelp: function(e) { - this.setData({ - 'help_status': true - }); - }, - hideHelp: function(e) { - this.setData({ - 'help_status': false - }); - }, - usernameInput: function(e) { - if (e.detail.value.length >= 9) { - wx.hideKeyboard() - } - }, - vcodeInput: function(e) { - if (e.detail.value.length >= 5) { - wx.hideKeyboard() - } - }, - inputFocus: function(e) { - if (e.target.id == 'username') { - this.setData({ - 'userid_focus': true - }); - } else if (e.target.id == 'password') { - this.setData({ - 'passwd_focus': true - }); - } else if (e.target.id == 'vcode') { - this.setData({ - 'vcode_focus': true - }); - } - }, - inputBlur: function(e) { - if (e.target.id == 'username') { - this.setData({ - 'userid_focus': false - }); - } else if (e.target.id == 'password') { - this.setData({ - 'passwd_focus': false - }); - } else if (e.target.id == 'vcode') { - this.setData({ - 'vcode_focus': false - }); - } - }, - onReady: function() { - var that = this - setTimeout(function() { - that.setData({ - isLoading: false - }); - }, 1000); - wx.onAccelerometerChange(function(res) { - var angle = -(res.x * 30).toFixed(1); - if (angle > 14) { - angle = 14; - } else if (angle < -14) { - angle = -14; - } - if (that.data.angle !== angle) { - that.setData({ - angle: angle - }); - } - }); - }, - getVcode: function() { - var that = this; - wx.request({ - url: `${app.globalData.domain}/finance/login`, - success: function(res) { - // console.log(res.data); - that.setData({ - cookieInfo: res.data, - }) - if (res.data.code != 200) { - wx.showToast({ - title: '财务系统异常', - icon: 'none', - duration: 5000 - }); - } - } - }) - } -}) \ No newline at end of file diff --git a/pages/school/finance/bind.json b/pages/school/finance/bind.json deleted file mode 100644 index 6de3b6b..0000000 --- a/pages/school/finance/bind.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "navigationBarBackgroundColor": "#7acfa6", - "backgroundColor": "#7acfa6", - "navigationBarTitleText": "绑定财务系统账号", - "enablePullDownRefresh": false, - "disableScroll": true, - "navigationStyle": "default" -} \ No newline at end of file diff --git a/pages/school/finance/bind.wxml b/pages/school/finance/bind.wxml deleted file mode 100644 index 8b70fb2..0000000 --- a/pages/school/finance/bind.wxml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - 帮助 - - - - 1、证件号和密码是什么? - - 证件号:老生默认证件号为学号,新生没有学号可以试试考生号。已毕业离校学生不可使用 - 密码:默认密码为身份证账号后6位(X大写) - - 2、忘记密码? - - 登录收费平台网站(http://221.238.213.131:8809),点击“登录”->"领用及找回密码" - - - - - - - - - \ No newline at end of file diff --git a/pages/school/finance/bind.wxss b/pages/school/finance/bind.wxss deleted file mode 100644 index e6d052e..0000000 --- a/pages/school/finance/bind.wxss +++ /dev/null @@ -1,2 +0,0 @@ -/* pages/school/finance/bind.wxss */ -@import "../../books/bind.wxss"; \ No newline at end of file diff --git a/pages/school/finance/component/deferApply/deferApply.js b/pages/school/finance/component/deferApply/deferApply.js deleted file mode 100644 index e8d987a..0000000 --- a/pages/school/finance/component/deferApply/deferApply.js +++ /dev/null @@ -1,93 +0,0 @@ -// pages/school/finance/component/deferApply/deferApply.js -var app = getApp() -Component({ - options: { - addGlobalClass: true, - }, - /** - * 组件的属性列表 - */ - properties: { - - }, - - lifetimes: { - attached: function() { - // 在组件实例进入页面节点树时执行 - this.inital() - }, - detached: function() { - // 在组件实例被从页面节点树移除时执行 - }, - }, - /** - * 组件的初始数据 - */ - data: { - tab: 'pending', - tabs: [{ - title: '可缓交', - value: 'pending' - }, { - title: '已缓交', - value: 'finished' - }], - data: '', - datalist: [] - }, - - /** - * 组件的方法列表 - */ - methods: { - inital: function () { - this.getDatalist() - }, - tabChanged: function (e) { - const tab = this.data.tabs[e.currentTarget.dataset.index].value - this.setData({ tab: tab}) - const record = tab == 'pending' ? 'false' : 'true' - this.getDatalist(record) - }, - getDatalist: function (record = 'false', page = 0, pagesize = 30) { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - if (!cookie) { - wx.showToast({ title: '请先登录', icon: 'none' }) - wx.redirectTo({ url: '/pages/school/finance/bind' }) - return - } - wx.request({ - url: `${app.globalData.domain}/finance/defer`, - data: { - cookie: cookie, - record: record, - page: page, - pagesize: pagesize - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - const datalist = _this.formatAllDate(res.data.data) - _this.setData({ datalist: datalist, data: res.data}) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - }, - complete: (res)=> { - wx.hideLoading() - } - }) - }, - formatAllDate: function (array) { - let result = [] - array.forEach(element => { - const showDate = new Date(parseInt(element.DelayEndTime.substr(6, 13))).toLocaleDateString() - element.showDate = showDate - result.push(element) - }) - return result - } - } -}) diff --git a/pages/school/finance/component/deferApply/deferApply.json b/pages/school/finance/component/deferApply/deferApply.json deleted file mode 100644 index 6f99aea..0000000 --- a/pages/school/finance/component/deferApply/deferApply.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "tips": "../../../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/finance/component/deferApply/deferApply.wxml b/pages/school/finance/component/deferApply/deferApply.wxml deleted file mode 100644 index d7e35c8..0000000 --- a/pages/school/finance/component/deferApply/deferApply.wxml +++ /dev/null @@ -1,42 +0,0 @@ - - - - {{item.title}} - - - - - - - - - {{item.Year}}{{item.FeeRange.Name}}{{item.ChargeProject.Name}} - - - - - 欠费金额:{{item.Overdue}} - 应收金额:{{item.ShowReceivable}} - 缓交金额:{{tab == 'pending' ? item.Defer : item.Amount.Amount}} - - - 到期日期:{{ item.showDate}} - - - 上传附件:{{item.EnableAttachment}} - 申请附件:{{item.FileName}} - - - 助学贷款回执校验码:{{item.Zxdkhzjym}} - - - - - - - - - - 到底啦~什么都没有了 - \ No newline at end of file diff --git a/pages/school/finance/component/deferApply/deferApply.wxss b/pages/school/finance/component/deferApply/deferApply.wxss deleted file mode 100644 index 92d511b..0000000 --- a/pages/school/finance/component/deferApply/deferApply.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/finance/component/deferApply/deferApply.wxss */ \ No newline at end of file diff --git a/pages/school/finance/component/feeBusiness/feeBusiness.js b/pages/school/finance/component/feeBusiness/feeBusiness.js deleted file mode 100644 index e7f26cd..0000000 --- a/pages/school/finance/component/feeBusiness/feeBusiness.js +++ /dev/null @@ -1,78 +0,0 @@ -// pages/school/finance/component/feeBusiness/feeBusiness.js -var app = getApp() -Component({ - options: { - addGlobalClass: true, - }, - /** - * 组件的属性列表 - */ - properties: { - - }, - lifetimes: { - attached: function() { - // 在组件实例进入页面节点树时执行 - this.inital() - }, - detached: function() { - // 在组件实例被从页面节点树移除时执行 - }, - }, - /** - * 组件的初始数据 - */ - data: { - tab: 'pending', - tabs: [{ - title: '待缴费', - value: 'pending' - }, { - title: '已缴费', - value: 'finished' - }], - data: {}, - datalist: [] - }, - - /** - * 组件的方法列表 - */ - methods: { - inital: function () { - this.getDatalist('false') - }, - tabChanged: function (e) { - const tab = this.data.tabs[e.currentTarget.dataset.index].value - this.setData({ tab: tab}) - const paid = tab == 'pending' ? 'false' : 'true' - this.getDatalist(paid) - }, - getDatalist: function (paid = 'true', page = 0, pagesize = 30) { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - if (!cookie) { - wx.showToast({ title: '请先登录', icon: 'none' }) - wx.redirectTo({ url: '/pages/school/finance/bind' }) - return - } - wx.request({ - url: `${app.globalData.domain}/finance/fee`, - data: { - cookie: cookie, - paid: paid, - page: page, - pagesize: pagesize - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - _this.setData({ datalist: res.data.data, data: res.data }) - }, - complete: (res)=> { - wx.hideLoading() - } - }) - } - } -}) diff --git a/pages/school/finance/component/feeBusiness/feeBusiness.json b/pages/school/finance/component/feeBusiness/feeBusiness.json deleted file mode 100644 index 6f99aea..0000000 --- a/pages/school/finance/component/feeBusiness/feeBusiness.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "tips": "../../../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/finance/component/feeBusiness/feeBusiness.wxml b/pages/school/finance/component/feeBusiness/feeBusiness.wxml deleted file mode 100644 index 8f247a4..0000000 --- a/pages/school/finance/component/feeBusiness/feeBusiness.wxml +++ /dev/null @@ -1,47 +0,0 @@ - - - - {{item.title}} - - - - - - - - - {{item.Year}}{{item.FeeRange.Name}}{{item.ChargeProject.Name}} - - - - - 应收:{{item.NowReceivable}} - 实收:{{item.Paid}} - - - 减免金额:{{item.Reduce}} - 欠费金额:{{item.Overdue}} - - - 抵扣金额:{{item.Deductible}} - 退费金额:{{item.Return}} - - - 缓交金额:{{item.Delay}} - - 状态: - 处理中 - {{item.ReceivableBalance <= 0 ? "已缴清" : "欠费"}} - - - - - - - - - - - 到底啦~什么都没有了 - \ No newline at end of file diff --git a/pages/school/finance/component/feeBusiness/feeBusiness.wxss b/pages/school/finance/component/feeBusiness/feeBusiness.wxss deleted file mode 100644 index 00eb6b0..0000000 --- a/pages/school/finance/component/feeBusiness/feeBusiness.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/finance/component/feeBusiness/feeBusiness.wxss */ \ No newline at end of file diff --git a/pages/school/finance/component/feeRecord/feeRecord.js b/pages/school/finance/component/feeRecord/feeRecord.js deleted file mode 100644 index f98eb13..0000000 --- a/pages/school/finance/component/feeRecord/feeRecord.js +++ /dev/null @@ -1,109 +0,0 @@ -// pages/school/finance/component/feeRecord.js -var app = getApp() -Component({ - options: { - addGlobalClass: true, - }, - /** - * 组件的属性列表 - */ - properties: { - }, - - /** - * 组件的初始数据 - */ - data: { - datalist: [] - }, - lifetimes: { - attached: function() { - // 在组件实例进入页面节点树时执行 - this.inital() - }, - detached: function() { - // 在组件实例被从页面节点树移除时执行 - }, - }, - - /** - * 组件的方法列表 - */ - methods: { - inital: function () { - this.getDatalist() - }, - formatDatalist: function (array = []) { - let result = [] - // 一级目录 - array.forEach(element => { - if (element.ParentTaskUID == -1) { - element.unfold = true - result.push(element) - } - }) - // 二级目录 - array.forEach(element => { - result.forEach(function(subele, subidx) { - if (!subele.children) { - result[subidx].children = [] - } - if (element.ParentTaskUID == subele.UID) { - result[subidx].children.push(element) - } - }) - }) - // 三级目录 - array.forEach(element => { - result.forEach(function(subele, subidx) { - subele.children.forEach(function(ssubele, ssubidx) { - if (!ssubele.children) { - result[subidx].children[ssubidx].children = [] - } - if (element.ParentTaskUID == ssubele.UID) { - result[subidx].children[ssubidx].children.push(element) - } - }) - }) - }) - // console.log(result) - return result - }, - fold: function (e) { - const index = e.currentTarget.dataset.index - let datalist = this.data.datalist - datalist[index].unfold = !datalist[index].unfold - this.setData({ datalist: datalist }) - }, - getDatalist: function (page = 0, pagesize = 30) { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - if (!cookie) { - wx.showToast({ title: '请先登录', icon: 'none' }) - wx.redirectTo({ url: '/pages/school/finance/bind' }) - return - } - wx.request({ - url: `${app.globalData.domain}/finance/paid`, - data: { - cookie: cookie, - page: page, - pagesize: pagesize - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - const datalist = _this.formatDatalist(res.data.data) - _this.setData({ datalist: datalist }) - } else { - wx.showToast({ title: res.data.message }) - } - }, - complete: (res)=> { - wx.hideLoading() - } - }) - } - } -}) diff --git a/pages/school/finance/component/feeRecord/feeRecord.json b/pages/school/finance/component/feeRecord/feeRecord.json deleted file mode 100644 index 6f99aea..0000000 --- a/pages/school/finance/component/feeRecord/feeRecord.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "tips": "../../../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/finance/component/feeRecord/feeRecord.wxml b/pages/school/finance/component/feeRecord/feeRecord.wxml deleted file mode 100644 index afc8aea..0000000 --- a/pages/school/finance/component/feeRecord/feeRecord.wxml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - {{item.xmmc}} - - - - - - - - 应收:{{item.xysje}} - 实收:{{item.sjje}} - - - 抵扣金额:{{item.dkje}} - 退费金额:{{item.tfje}} - - - 减免金额:{{item.jmje}} - 缴费次数:{{item.jfcs}}次 - - - - - - - - {{sitem.sfnd}}{{sitem.sfqjmc}} - - 应收:{{sitem.xysje}} - - 实收:{{sitem.sjje}} - - - - 抵扣金额:{{sitem.dkje}} - 退费金额:{{sitem.tfje}} - - - 减免金额:{{sitem.jmje}} - 缴费次数:{{sitem.jfcs}}次 - - - - - 实收金额:{{ssitem.sjje}} - - - - - - - - - - - - - - - 到底啦~什么都没有了 - \ No newline at end of file diff --git a/pages/school/finance/component/feeRecord/feeRecord.wxss b/pages/school/finance/component/feeRecord/feeRecord.wxss deleted file mode 100644 index 81e17d1..0000000 --- a/pages/school/finance/component/feeRecord/feeRecord.wxss +++ /dev/null @@ -1,7 +0,0 @@ -/* pages/school/finance/component/feeRecord.wxss */ -page { - background-color: var(--cyan); -} -.cu-list.menu-avatar.comment>.cu-item { - padding: 30rpx 30rpx 0rpx 50rpx; -} \ No newline at end of file diff --git a/pages/school/finance/component/invoiceApply/invoiceApply.js b/pages/school/finance/component/invoiceApply/invoiceApply.js deleted file mode 100644 index faf56aa..0000000 --- a/pages/school/finance/component/invoiceApply/invoiceApply.js +++ /dev/null @@ -1,165 +0,0 @@ -// pages/school/finance/component/invoiceApply/invoiceApply.js -var app = getApp() -Component({ - options: { - addGlobalClass: true, - }, - /** - * 组件的属性列表 - */ - properties: { - - }, - - lifetimes: { - attached: function() { - // 在组件实例进入页面节点树时执行 - this.inital() - }, - detached: function() { - // 在组件实例被从页面节点树移除时执行 - }, - }, - /** - * 组件的初始数据 - */ - data: { - tab: 'pending', - tabs: [{ - title: '待开票', - value: 'pending' - }, { - title: '已开票', - value: 'finished' - }], - target: 0, - showTarget: false, - targetData: [], - year: '', - data: '', - datalist: [] - }, - - /** - * 组件的方法列表 - */ - methods: { - inital: function (params) { - const date = new Date() - const thisYear = date.getFullYear() - this.setData({ year: thisYear }) - this.getDatalist('false', thisYear) - }, - tabChanged: function (e) { - const tab = this.data.tabs[e.currentTarget.dataset.index].value - this.setData({ tab: tab}) - const record = tab == 'pending' ? 'false' : 'true' - this.getDatalist(record) - }, - yearChange: function (e) { - this.setData({ year: e.detail.value }) - }, - getDatalist: function (record = 'false', year, page = 0, pagesize = 30) { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - if (!cookie) { - wx.showToast({ title: '请先登录', icon: 'none' }) - wx.redirectTo({ url: '/pages/school/finance/bind' }) - return - } - - wx.request({ - url: `${app.globalData.domain}/finance/invocie`, - data: { - cookie: cookie, - year: year ? year : _this.data.year, - record: record, - page: page, - pagesize: pagesize - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - const datalist = record == 'false' ? res.data.data : _this.formatAllDate(res.data.data) - _this.setData({ datalist: datalist, data: res.data }) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - }, - complete: (res)=> { - wx.hideLoading() - } - }) - }, - getTargetDetail: function (cfid = '') { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - wx.request({ - url: `${app.globalData.domain}/finance/invocie/detail`, - data: { - cookie: cookie, - cfid: cfid - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - _this.setData({ - targetData: res.data.data, - showTarget: true - }) - } - }, - complete: (res)=> { - wx.hideLoading() - } - }) - }, - formatAllDate: function (array) { - let result = [] - array.forEach(element => { - const showDate = new Date(parseInt(element.cfkpdate.substr(6, 13))).toLocaleDateString() - element.showDate = showDate - result.push(element) - }) - return result - }, - showTargetModal: function (e) { - const index = e.currentTarget.dataset.index - const cfid = this.data.datalist[index].cfid - this.setData({ target: index }) - this.getTargetDetail(cfid) - }, - closeTargetModal: function () { - this.setData({ showTarget: false }) - }, - download: function (e) { - wx.showLoading({ title: '下载中...' }) - const index = e.currentTarget.dataset.index - const invoce = this.data.datalist[index] - const manage = wx.getFileSystemManager() - const fileName = invoce.cfinvoicecode + '_' + invoce.cfinvoicenum - wx.downloadFile({ - url: invoce.cfinvoicefile, - success (res) { - var savePath = wx.env.USER_DATA_PATH + "/" + fileName - if (res.statusCode == 200) { - manage.saveFile({ - tempFilePath: res.tempFilePath, - filePath: savePath+'.pdf', - success:function(res){ - wx.openDocument({ - filePath: res.savedFilePath, - fileType: 'pdf', - showMenu: true - }) - wx.hideLoading() - } - }) - } - } - }) - } - } -}) diff --git a/pages/school/finance/component/invoiceApply/invoiceApply.json b/pages/school/finance/component/invoiceApply/invoiceApply.json deleted file mode 100644 index 6f99aea..0000000 --- a/pages/school/finance/component/invoiceApply/invoiceApply.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "tips": "../../../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/finance/component/invoiceApply/invoiceApply.wxml b/pages/school/finance/component/invoiceApply/invoiceApply.wxml deleted file mode 100644 index 33f708d..0000000 --- a/pages/school/finance/component/invoiceApply/invoiceApply.wxml +++ /dev/null @@ -1,187 +0,0 @@ - - - - {{item.title}} - - - - - - - - - 开票收费年度 - - - - 年份 - - {{year}} - - - - - - - - - - - - - {{item.Year}}{{item.FeeRange.Name}}{{item.ChargeProject.Name}} - - - - - 应收金额:{{item.Amount.Amount}} - 实缴金额:{{item.Paid}} - - - - 缓交金额:{{item.Delay}} - - 可抵扣金额:{{item.Deductible}} - - - 退费金额:{{item.Return}} - - - - - - - - - - - - - - 票据号:{{item.cfinvoicenum}} - - - - - 临时单号:{{item.fnumber}} - - - - 票据状态: - 未开票 - 已开票 - 作废 - 红冲 - {{item.cfkpsate}} - - 价税合计:{{item.total_money}} - - - - 发票类型: - 增值税专用发票 - 增值税普通发票 - 电子发票 - {{item.open_type}} - - - - 开票日期:{{item.showDate}} - - - - - - - - - - - - - - - - - - - 票据明细 - - - - - - - 票据号:{{datalist[target].cfinvoicenum}} - - - 发票类型: - 增值税专用发票 - 增值税普通发票 - 电子发票 - {{datalist[target].open_type}} - - - - 开票日期:{{datalist[target].showDate}} - - 缴款单位:{{datalist[target].cfbuyername}} - - - - 购方开户银行:{{datalist[target].cfbankname}} - - - - 购方银行账号:{{datalist[target].cfbankaccount}} - - - - 地址:{{datalist[target].cfbuyeraddr}} - - - - 电话:{{datalist[target].cfbuyerphone}} - - - - 寄送电子邮箱:{{datalist[target].cfbuyeremail}} - - - - - 规格:{{item.cfspectype}} - {{item.cfgname}} - - - - 数量:{{item.cfqty}} - - 金额:{{item.cfamount}} - - - - 税率:{{item.cfrate}}% - - 税额:{{item.cfrate * 0.01 * item.cfamount}} - - - - - 金额合计:{{datalist[target].total_money}} - - - - - - - - - - - - 到底啦~什么都没有了 - \ No newline at end of file diff --git a/pages/school/finance/component/invoiceApply/invoiceApply.wxss b/pages/school/finance/component/invoiceApply/invoiceApply.wxss deleted file mode 100644 index ddebc1e..0000000 --- a/pages/school/finance/component/invoiceApply/invoiceApply.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/finance/component/invoiceApply/invoiceApply.wxss */ \ No newline at end of file diff --git a/pages/school/finance/component/orderRecord/orderRecord.js b/pages/school/finance/component/orderRecord/orderRecord.js deleted file mode 100644 index 03d5384..0000000 --- a/pages/school/finance/component/orderRecord/orderRecord.js +++ /dev/null @@ -1,69 +0,0 @@ -// pages/school/finance/component/orderRecord/orderRecord.js -var app = getApp() -Component({ - options: { - addGlobalClass: true, - }, - /** - * 组件的属性列表 - */ - properties: { - - }, - - lifetimes: { - attached: function() { - // 在组件实例进入页面节点树时执行 - this.inital() - }, - detached: function() { - // 在组件实例被从页面节点树移除时执行 - }, - }, - /** - * 组件的初始数据 - */ - data: { - data: '', - datalist: [] - }, - - /** - * 组件的方法列表 - */ - methods: { - inital: function () { - this.getDatalist() - }, - getDatalist: function (page = 0, pagesize = 30) { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - if (!cookie) { - wx.showToast({ title: '请先登录', icon: 'none' }) - wx.redirectTo({ url: '/pages/school/finance/bind' }) - return - } - - wx.request({ - url: `${app.globalData.domain}/finance/order`, - data: { - cookie: cookie, - page: page, - pagesize: pagesize - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - _this.setData({ datalist: res.data.data, data: res.data }) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - }, - complete: (res)=> { - wx.hideLoading() - } - }) - } - } -}) diff --git a/pages/school/finance/component/orderRecord/orderRecord.json b/pages/school/finance/component/orderRecord/orderRecord.json deleted file mode 100644 index e8cfaaf..0000000 --- a/pages/school/finance/component/orderRecord/orderRecord.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "component": true, - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/finance/component/orderRecord/orderRecord.wxml b/pages/school/finance/component/orderRecord/orderRecord.wxml deleted file mode 100644 index 696779c..0000000 --- a/pages/school/finance/component/orderRecord/orderRecord.wxml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - {{item.OrderDetailList[0].Year}}{{item.OrderDetailList[0].FeeRange.Name}}{{item.OrderDetailList[0].ChargeProject.Name}} - - - - - 订单编号:{{item.OrderNo}} - - - 订单金额:{{item.Amount}} - 支付金额:{{item.PayAmount}} - - - 收费方式:{{item.ChargeType.Name}} - - - 订单状态:{{item.OrderStatus}} - - - 订单时间:{{item.CreateDate}} - - - - - - - - - - 到底啦~什么都没有了 - \ No newline at end of file diff --git a/pages/school/finance/component/orderRecord/orderRecord.wxss b/pages/school/finance/component/orderRecord/orderRecord.wxss deleted file mode 100644 index 6cd6a43..0000000 --- a/pages/school/finance/component/orderRecord/orderRecord.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/finance/component/orderRecord/orderRecord.wxss */ \ No newline at end of file diff --git a/pages/school/finance/component/subsidyInfo/subsidyInfo.js b/pages/school/finance/component/subsidyInfo/subsidyInfo.js deleted file mode 100644 index 6c6d6f1..0000000 --- a/pages/school/finance/component/subsidyInfo/subsidyInfo.js +++ /dev/null @@ -1,84 +0,0 @@ -// pages/school/finance/component/subsidyInfo/subsidyInfo.js -var app = getApp() -Component({ - options: { - addGlobalClass: true, - }, - /** - * 组件的属性列表 - */ - properties: { - - }, - - lifetimes: { - attached: function() { - // 在组件实例进入页面节点树时执行 - this.inital() - }, - detached: function() { - // 在组件实例被从页面节点树移除时执行 - }, - }, - /** - * 组件的初始数据 - */ - data: { - - tab: 'pending', - tabs: [{ - title: '待发放', - value: 'pending' - }, { - title: '已发放', - value: 'finished' - }], - data: '', - datalist: [] - }, - - /** - * 组件的方法列表 - */ - methods: { - inital: function () { - this.getDatalist() - }, - tabChanged: function (e) { - const tab = this.data.tabs[e.currentTarget.dataset.index].value - this.setData({ tab: tab}) - const unrelease = tab == 'pending' ? 'true' : 'false' - this.getDatalist(unrelease) - }, - getDatalist: function (unrelease = 'true', page = 0, pagesize = 30) { - wx.showLoading({ title: '等等,我加载下' }) - const _this = this - const cookie = app.globalData.financeInfo ? app.globalData.financeInfo.cookie : '' - if (!cookie) { - wx.showToast({ title: '请先登录', icon: 'none' }) - wx.redirectTo({ url: '/pages/school/finance/bind' }) - return - } - wx.request({ - url: `${app.globalData.domain}/finance/subsidy`, - data: { - cookie: cookie, - unrelease: unrelease, - page: page, - pagesize: pagesize - }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - _this.setData({ datalist: res.data.data, data: res.data }) - } else { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - }, - complete: (res)=> { - wx.hideLoading() - } - }) - } - } -}) diff --git a/pages/school/finance/component/subsidyInfo/subsidyInfo.json b/pages/school/finance/component/subsidyInfo/subsidyInfo.json deleted file mode 100644 index 6f99aea..0000000 --- a/pages/school/finance/component/subsidyInfo/subsidyInfo.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "tips": "../../../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/finance/component/subsidyInfo/subsidyInfo.wxml b/pages/school/finance/component/subsidyInfo/subsidyInfo.wxml deleted file mode 100644 index 1f6abe6..0000000 --- a/pages/school/finance/component/subsidyInfo/subsidyInfo.wxml +++ /dev/null @@ -1,43 +0,0 @@ - - - - {{item.title}} - - - - - - - - - {{item.GrantDate}}{{item.SubsidyType}} - - - - - 发放金额:{{item.Payable}} - - - 抵扣项目:{{item.DiKouItems[0].DYear}}{{item.DiKouItems[0].DFeeRange}}{{item.DiKouItems[0].DBaseChargeProject}} - - - 抵扣金额:{{item.DiKouItems[0].DDeductible}} - 实际发放金额:{{item.Paid}} - - - 状态:{{item.State}} - - - 发放说明:{{item.Remark ? item.Remark : ''}} - - - - - - - - - - 到底啦~什么都没有了 - \ No newline at end of file diff --git a/pages/school/finance/component/subsidyInfo/subsidyInfo.wxss b/pages/school/finance/component/subsidyInfo/subsidyInfo.wxss deleted file mode 100644 index c5bbada..0000000 --- a/pages/school/finance/component/subsidyInfo/subsidyInfo.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/finance/component/subsidyInfo/subsidyInfo.wxss */ \ No newline at end of file diff --git a/pages/school/finance/index.js b/pages/school/finance/index.js deleted file mode 100644 index f5471f3..0000000 --- a/pages/school/finance/index.js +++ /dev/null @@ -1,94 +0,0 @@ -// pages/school/finance/index.js -var app = getApp() -Page({ - - /** - * 页面的初始数据 - */ - data: { - tabbar: '缴费记录', - tabbars: [{ - name: '缴费记录', - icon: 'cuIcon-redpacket' - }, { - name: '缴费业务', - icon: 'cuIcon-moneybag' - }, { - name: '订单记录', - icon: 'cuIcon-list' - }, { - name: '补助信息', - icon: 'cuIcon-refund' - }, { - name: '缓交申请', - icon: 'cuIcon-comment' - }, { - name: '开票申请', - icon: 'cuIcon-ticket' - }] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - let financeInfo = app.globalData.financeInfo - if (!financeInfo) { - wx.redirectTo({ url: './bind' }) - return - } - console.log('finance收费平台账号登录信息', financeInfo) - }, - - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - tabbarChange: function (e) { - const name = e.currentTarget.dataset.name - this.setData({ tabbar: name }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - - } -}) \ No newline at end of file diff --git a/pages/school/finance/index.json b/pages/school/finance/index.json deleted file mode 100644 index 0414b64..0000000 --- a/pages/school/finance/index.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "usingComponents": { - "feeRecord": "./component/feeRecord/feeRecord", - "orderRecord": "./component/orderRecord/orderRecord", - "feeBusiness": "./component/feeBusiness/feeBusiness", - "subsidyInfo": "./component/subsidyInfo/subsidyInfo", - "deferApply": "./component/deferApply/deferApply", - "invoiceApply": "./component/invoiceApply/invoiceApply" - } -} \ No newline at end of file diff --git a/pages/school/finance/index.wxml b/pages/school/finance/index.wxml deleted file mode 100644 index 2a9d4eb..0000000 --- a/pages/school/finance/index.wxml +++ /dev/null @@ -1,18 +0,0 @@ - - - - {{tabbar}} - - - - - - - - - - - - {{item.name}} - - \ No newline at end of file diff --git a/pages/school/finance/index.wxss b/pages/school/finance/index.wxss deleted file mode 100644 index d1a5845..0000000 --- a/pages/school/finance/index.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/finance/index.wxss */ \ No newline at end of file diff --git a/pages/school/movie.js b/pages/school/movie.js deleted file mode 100644 index d00ff47..0000000 --- a/pages/school/movie.js +++ /dev/null @@ -1,142 +0,0 @@ -// pages/school/movie.js -const app = getApp() -import todo from '../../utils/calendar/plugins/todo' -import plugin from '../../utils/calendar/plugins/index' - -plugin.use(todo) - -const conf = { - data: { - calendarConfig: { - theme: 'default', - firstDayOfWeek: 'Mon', - }, - checkedDate: '', - movieList: [] - }, - onLoad(option) { - console.log('option', option) - if (option && option.date) { - this.setData({ checkedDate: option.date }) - } else { - var date = new Date() - var year = date.getFullYear() - var month = date.getMonth() + 1 - var day = date.getDate() - this.setData({ checkedDate: `${year}-${month}-${day}` }) - } - }, - whenChangeMonth(e) { - this.getMovieDaysByMonth(`${e.detail.next.year}-${e.detail.next.month}`) - }, - afterCalendarRender(e) { - // 获取日历组件上的 calendar 对象 - const calendar = this.selectComponent('#calendar').calendar - console.log('afterCalendarRender', e) - // 选中 - const checkDate = this.data.checkedDate.split('-') - const toSet = [{ year: checkDate[0], month: checkDate[1], date: checkDate[2] }] - calendar.setSelectedDates(toSet) - // 获取当月放映天 - this.getMovieDaysByMonth(`${checkDate[0]}-${checkDate[1]}`) - // 获取当天放映 - this.getMoviesByDay(this.data.checkedDate) - }, - afterTapDate(e) { - console.log('afterTapDate', e) - const date = `${e.detail.year}-${e.detail.month}-${e.detail.date}` - this.setData({ checkedDate: date }) - this.getMoviesByDay(date) - }, - getMovieDaysByMonth(month = '') { - const _this = this - wx.request({ - url: `${app.globalData.domain}/library/movie/month?month=${month}`, - success(res) { - try { - if (res.statusCode == 200) { - _this.setMovieDayPoints(res.data) - } - } catch (error) { - wx.showToast({ title: '系统异常,稍后再试', icon: 'none' }) - } - } - }) - }, - getMoviesByDay(date = '') { - const _this = this - wx.request({ - url: `${app.globalData.domain}/library/movie?date=${date}`, - success(res) { - try { - if (res.statusCode == 200) { - _this.setData({ movieList: res.data }) - } - } catch (error) { - wx.showToast({ title: '系统异常,稍后再试', icon: 'none' }) - } - } - }) - }, - setMovieDayPoints(dates) { - console.log('dates', dates) - const calendar = this.selectComponent('#calendar').calendar - calendar.setTodos({ - // 待办点标记设置 - pos: 'bottom', // 待办点标记位置 ['top', 'bottom'] - dotColor: '#00C853', // 待办点标记颜色 - showLabelAlways: true, // 点击时是否显示待办事项(圆点/文字),在 circle 为 true 及当日历配置 showLunar 为 true 时,此配置失效 - dates: dates - }) - }, - goLibraryCinema () { - wx.navigateTo({ - url: '../traffic/navi?markerId=4', - }) - }, - setRemind (e) { - const index = e.currentTarget.dataset.index - const movie = this.data.movieList[index] - const endTime = new Date(movie.play_at).getTime() + 1000 * 60 * 150 - - const nowTimestamp = new Date().getTime() - const playTimestamp = new Date(movie.play_at).getTime() - if (nowTimestamp > playTimestamp) return - - wx.addPhoneCalendar({ - title: `电影【${movie.name}】`, - startTime: new Date(movie.play_at).getTime().toString().slice(0, -3), - description: `电影《${movie.name}》即将开始放映`, - location: '社科馆202音像室', - endTime: endTime.toString().slice(0, -3), - alarmOffset: 60*15 - }); - }, - showPoster (e) { - wx.previewImage({ - urls: [e.currentTarget.dataset.url], - }) - }, - goDouban (e) { - const index = e.currentTarget.dataset.index - const movie = this.data.movieList[index] - wx.navigateToMiniProgram({ - appId: 'wx2f9b06c1de1ccfca', - path: `pages/subject/subject?id=${movie.douban_id}&type=movie` - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function (res) { - let title = `${this.data.checkedDate}社科音像室影片`; - if (this.data.movieList.length > 0) title = `${title}《${this.data.movieList[0].name}》` - return { - title: title, - path: 'pages/school/movie?date=' + this.data.checkedDate, - imageUrl: this.data.movieList.length > 0 ? this.data.movieList[0].poster : null - } -}, -} - -Page(conf) diff --git a/pages/school/movie.json b/pages/school/movie.json deleted file mode 100644 index 35e3ece..0000000 --- a/pages/school/movie.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "usingComponents": { - "calendar": "/utils/calendar/index", - "tips": "../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/movie.wxml b/pages/school/movie.wxml deleted file mode 100644 index 4429428..0000000 --- a/pages/school/movie.wxml +++ /dev/null @@ -1,42 +0,0 @@ - - - 音像室影片放映 - - - - *:日期下方小绿点表示当天有影片放映安排 - - - - - - - - 当天放映 - - - - - - - - {{item.name}}({{item.year}}) - - - {{ item.play_at }} - - - 社科图书馆音像室(201) - - - {{item.duration}} - {{item.genre}} - - {{item.actor}} - - - - - - - \ No newline at end of file diff --git a/pages/school/movie.wxss b/pages/school/movie.wxss deleted file mode 100644 index 9d81f5a..0000000 --- a/pages/school/movie.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/school/movie.wxss */ \ No newline at end of file diff --git a/pages/school/run/index.js b/pages/school/run/index.js deleted file mode 100644 index 78fb5bf..0000000 --- a/pages/school/run/index.js +++ /dev/null @@ -1,155 +0,0 @@ -// pages/school/run/index.js -var app = getApp() -Page({ - /** - * 页面的初始数据 - */ - data: { - env: 'develop', - type: '0', - defaultAvatar: app.globalData.defaultGrayAvatar, - avatar: app.globalData.defaultGrayAvatar, - nickname: '', - fillImage: 'https://upload-images.jianshu.io/upload_images/4697920-646f99ca82fdc62b.jpeg', - top3icon: [ - 'https://upload-images.jianshu.io/upload_images/4697920-afd8b750ea3b5c32.png', - 'https://upload-images.jianshu.io/upload_images/4697920-0b0376bfe0c8af85.png', - 'https://upload-images.jianshu.io/upload_images/4697920-2fbab52779447beb.png' - ], - types: [{ - name: '今日排行', - value: 'day' - }, { - name: '本周排行', - value: 'week' - }, { - name: '本月排行', - value: 'month' - }], - ranklist: [], - personalRank: [] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.setData({ env: app.globalData.env }) - if (app.globalData.env != 'release') { - wx.switchTab({ url: '../../index/index' }) - } - wx.showLoading() - let type = options.type ? options.type : '0' - let day = this.data.types[type].value - this.setData({ type: type }) - this.inital(day) - }, - inital: function (day) { - const userInfo = wx.getStorageSync('edusysUserInfo') || {} - const avatar = userInfo.avatar ? userInfo.avatar : this.data.avatar - const nickname = userInfo.nickname ? userInfo.nickname : userInfo.uid - this.setData({ avatar: avatar, nickname: nickname }) - var _this = this - wx.checkSession({ - success () { - wx.getWeRunData({ - success (res) { - console.log(res) - _this.sendStepsData(res.encryptedData, res.iv) - } - }) - }, - fail () { - // session_key 已经失效,需要重新执行登录流程 - app.wxLoginAndRequest() - } - }) - this.getRanklist(day) - }, - getRanklist: function (day) { - const _this = this; - wx.request({ - url: `${app.globalData.domain}/steps`, - data: { day: day }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - _this.setData({ranklist: res.data.data}) - } - }, - complete: () => { - _this.getPersonalRank(day) - wx.hideLoading() - } - }) - }, - getPersonalRank: function (day = 'day') { - const userInfo = wx.getStorageSync('edusysUserInfo') || {} - let uid = userInfo ? userInfo.uid : '' - if (!uid) { - wx.showToast({ title: '未登录只能浏览无法参与排行', icon: 'none' }) - } - const _this = this; - wx.request({ - url: `${app.globalData.domain}/steps/rank/${uid}`, - data: { day: day }, - timeout: app.globalData.requestTimeout, - success: (res) => { - if (res.data.code == 200) { - _this.setData({personalRank: res.data.data}) - } - }, - complete: () => { - } - }) - }, - sendStepsData: function (data, iv) { - const _this = this - let domain = app.globalData.domain - let url = `${domain}/steps` - - const userInfo = wx.getStorageSync('edusysUserInfo') || {} - let uid = userInfo ? userInfo.uid : '' - let para = { - uid: uid, - platform: 'weapp', - data: data, - iv: iv - } - wx.request({ - url: url, - data: para, - timeout: app.globalData.requestTimeout, - method: 'POST', - success: function (res) { - try { - console.log(res.data) - _this.getRanklist(_this.data.types[_this.data.type].value) - } catch (error) { - wx.showToast({ title: res.data.message, icon: 'none' }) - } - } - }) - }, - typeSelect: function (e) { - let index = e.currentTarget.dataset.id - let day = this.data.types[index].value - // console.log('切换到', this.data.types[index].name) - this.setData({ type: e.currentTarget.dataset.id }) - this.getRanklist(day) - }, - updateAvatar () { - wx.navigateTo({ url: '../../index/setting' }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - const type = this.data.type - const text = this.data.types[this.data.type].name - return { - title: `贝壳小盒子 - 运动计步${text}排行榜`, - path: `/pages/school/run/index?type=${type}` - } - } -}) \ No newline at end of file diff --git a/pages/school/run/index.json b/pages/school/run/index.json deleted file mode 100644 index 2e3378c..0000000 --- a/pages/school/run/index.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "usingComponents": { - "tips": "../../index/component/tips" - } -} \ No newline at end of file diff --git a/pages/school/run/index.wxml b/pages/school/run/index.wxml deleted file mode 100644 index 67407de..0000000 --- a/pages/school/run/index.wxml +++ /dev/null @@ -1,82 +0,0 @@ - - - - 步数排行 - 贝壳小盒子 - - - - - - - - - - {{ item.name }} - - - - - - - - - - - - - - - {{index + 1}} - - - - - - {{item.wechater&&item.wechater.nickname ? item.wechater.nickname : item.uid}} - - - {{item.steps}} - - - - - - - - - - - - - - - - - {{personalRank[0].ranknum}} - - - - - - - - - - - {{nickname}} 点此更新头像 - - {{personalRank[0].steps}} - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/run/index.wxss b/pages/school/run/index.wxss deleted file mode 100644 index a2fa211..0000000 --- a/pages/school/run/index.wxss +++ /dev/null @@ -1,21 +0,0 @@ -/* pages/school/run/index.wxss */ -page { - background-color: #6847E7; - height: 100%; -} -.image-width { - width: 100%; -} -.icon-size { - width: 60rpx; - height: 80rpx; -} -.userinfo-avatar { - border-radius: 50rpx; - clip-path: circle(50% at center); - box-shadow: 5rpx 5rpx 15rpx #ccc; -} - -.bottom-image { - margin-bottom: 150rpx; -} \ No newline at end of file diff --git a/pages/school/tel.js b/pages/school/tel.js deleted file mode 100644 index 0a9a46c..0000000 --- a/pages/school/tel.js +++ /dev/null @@ -1,259 +0,0 @@ -const app = getApp(); -Page({ - data: { - StatusBar: app.globalData.StatusBar, - CustomBar: app.globalData.CustomBar, - hidden: true, - keyword: '', - backLists: {}, - telLists: { - 'A': [], - 'B': [ - { name: '保卫处', tel: '22411900' } - ], - 'C': [ - { name: '材料系', tel: '22410516' }, - { name: '财务处', tel: '22410769' }, - { name: '财务处', tel: '22410897' }, - { name: '城市建设学院', tel: '22410703' } - ], - 'D': [ - { name: '档案室', tel: '22410779' } - ], - 'E': [], - 'F': [ - { name: '法律系', tel: '22410391' } - ], - 'G': [ - { name: '管理学院', tel: '22410705' }, - { name: '国际合作交流部', tel: '22410389' } - ], - 'H': [ - { name: '后勤处', tel: '22410722' }, - { name: '护理系', tel: '22423905' } - ], - 'I': [], - 'J': [ - { name: '机械系', tel: '22410508' }, - { name: '基础部', tel: '22410502' }, - { name: '基建产业处', tel: '22410976' }, - { name: '教务处', tel: '22410732' }, - { name: '教务处', tel: '22410555' }, - { name: '经济学院', tel: '22410728' } - ], - 'K': [ - { name: '科研处', tel: '22410737' } - ], - 'L': [], - 'M': [], - 'N': [], - 'O': [], - 'P': [], - 'Q': [], - 'R': [ - { name: '人事处', tel: '22410768' }, - { name: '人事处', tel: '22410077' }, - ], - 'S': [ - { name: '思政部', tel: '22410736' } - ], - 'T': [ - { name: '体育部', tel: '22410422' }, - { name: '图书馆', tel: '22410526' }, - { name: '团委', tel: '22410730' } - ], - 'U': [], - 'V': [], - 'W': [ - { name: '外语系', tel: '22410523' }, - ], - 'X': [ - { name: '心理咨询中心', tel: '22410981' }, - { name: '信息学院', tel: '22410704' }, - { name: '宣传部', tel: '22410352' }, - { name: '学生工作办公室', tel: '22410298' }, - { name: '学院报警电话', tel: '22411110' }, - { name: '学院办公室', tel: '22410800' }, - ], - 'Y': [ - { name: '艺术系', tel: '22410348' }, - ], - 'Z': [ - { name: '招办就业处(招生)', tel: '22410960' }, - { name: '招办就业处(招生)', tel: '22410969' }, - { name: '招办就业处(就业)', tel: '22412672' }, - { name: '招办就业处(就业)', tel: '22412902' }, - { name: '资产管理中心', tel: '22410919' } - ] - } - }, - onLoad() { - let list = []; - for (let i = 0; i < 26; i++) { - list[i] = String.fromCharCode(65 + i) - } - - var _this = this; - this.setData({ - list: list, - listCur: 'B', - backLists: _this.data.telLists - }) - this.inital(); - }, - inital: function () { - this.fetchContactList() - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - onReady() { - let that = this; - wx.createSelectorQuery().select('.indexBar-box').boundingClientRect(function (res) { - that.setData({ - boxTop: res.top - }) - }).exec(); - wx.createSelectorQuery().select('.indexes').boundingClientRect(function (res) { - that.setData({ - barTop: res.top - }) - }).exec() - }, - //获取文字信息 - getCur(e) { - var _this = this; - this.setData({ - hidden: false, - listCur: _this.data.list[e.target.id], - }) - }, - - setCur(e) { - this.setData({ - hidden: true, - listCur: this.data.listCur - }) - }, - //滑动选择Item - tMove(e) { - let y = e.touches[0].clientY, - offsettop = this.data.boxTop, - that = this; - //判断选择区域,只有在选择区才会生效 - if (y > offsettop) { - let num = parseInt((y - offsettop) / 20); - this.setData({ - listCur: that.data.list[num] - }) - }; - }, - - //触发全部开始选择 - tStart() { - this.setData({ - hidden: false - }) - }, - //触发结束选择 - tEnd() { - this.setData({ - hidden: true, - listCurID: this.data.listCur - }) - }, - indexSelect(e) { - let that = this; - let barHeight = this.data.barHeight; - let list = this.data.list; - let scrollY = Math.ceil(list.length * e.detail.y / barHeight); - for (let i = 0; i < list.length; i++) { - if (scrollY < i + 1) { - that.setData({ - listCur: list[i], - movableY: i * 20 - }) - return false - } - } - }, - searchInput: function (e) { - var keyword = e.detail.value; - var telLists = this.data.backLists; - var resultLists = {}; - var hasResult = false; - var _this = this; - - if (keyword.length < 1) { - this.setData({ telLists: _this.data.backLists }); - return; - } - for (let index in telLists) { - let element = telLists[index]; - resultLists[index] = []; - element.forEach((ele, ind) => { - if (ele.name.indexOf(keyword) != -1 || ele.tel.indexOf(keyword) != -1) { - resultLists[index].push(ele); - hasResult = true; - } - }); - } - this.setData({ - keyword: keyword, - telLists: resultLists - }) - }, - clearSearch: function () { - var _this = this; - this.setData({ telLists: _this.data.backLists, keyword: '' }); - }, - callPhone: function (e) { - var tel = '022' + e.currentTarget.dataset.tel; - wx.makePhoneCall({ phoneNumber: tel }); - }, - copyTel: function (e) { - var tel = '022' + e.currentTarget.dataset.tel; - wx.setClipboardData({ - data: tel - }) - wx.showToast({ - title: '已复制到粘贴版', - icon: 'none', - duration: 1000 - }); - }, - fetchContactList() { - const _this = this - wx.request({ - url: `${app.globalData.domain}/contact`, - success(res) { - try { - if (res.statusCode == 200) { - const lists = _this.format2list(res.data) - _this.setData({ backLists: lists, telLists: lists }) - } - } catch (error) { - _this.setData({ telLists: _this.data.backLists }) - } - } - }) - }, - format2list(array) { - let list = {} - array.forEach(element => { - if (!list[element.sortname]) list[element.sortname] = [] - list[element.sortname].push({ name: element.name, tel: element.tel }) - }) - return list - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - title: '“贝壳小盒子” - 部门电话', - path: 'pages/school/tel' - } - } -}); diff --git a/pages/school/tel.json b/pages/school/tel.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/school/tel.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/tel.wxml b/pages/school/tel.wxml deleted file mode 100644 index 36c6b8d..0000000 --- a/pages/school/tel.wxml +++ /dev/null @@ -1,47 +0,0 @@ - - - 学院电话 - 贝壳小盒子 - - - - - - - - - - - - - {{index}} - - - - {{tel.name}} - - - - {{tel.name}} - - 022-{{tel.tel}} - - - - - - - - - - {{list[index]}} - - - - \ No newline at end of file diff --git a/pages/school/tel.wxss b/pages/school/tel.wxss deleted file mode 100644 index d5574c3..0000000 --- a/pages/school/tel.wxss +++ /dev/null @@ -1,72 +0,0 @@ -/* pages/school/tel.wxss */ -page { - padding-top: 100rpx; -} - -.indexes { - position: relative; -} - -.indexBar { - position: fixed; - right: 0px; - bottom: 0px; - padding: 20rpx 20rpx 20rpx 60rpx; - display: flex; - align-items: center; -} - -.indexBar .indexBar-box { - width: 40rpx; - height: auto; - background: #fff; - display: flex; - flex-direction: column; - box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.1); - border-radius: 10rpx; -} - -.indexBar-item { - flex: 1; - width: 40rpx; - height: 40rpx; - display: flex; - align-items: center; - justify-content: center; - font-size: 24rpx; - color: #888; -} - -movable-view.indexBar-item { - width: 40rpx; - height: 40rpx; - z-index: 9; - position: relative; -} - -movable-view.indexBar-item::before { - content: ""; - display: block; - position: absolute; - left: 0; - top: 10rpx; - height: 20rpx; - width: 4rpx; - background-color: #f37b1d; -} - -.indexToast { - position: fixed; - top: 0; - right: 80rpx; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - width: 100rpx; - height: 100rpx; - border-radius: 10rpx; - margin: auto; - color: #fff; - line-height: 100rpx; - text-align: center; - font-size: 48rpx; -} diff --git a/pages/school/web.js b/pages/school/web.js deleted file mode 100644 index 61f66e3..0000000 --- a/pages/school/web.js +++ /dev/null @@ -1,177 +0,0 @@ -// pages/school/web.js -Page({ - /** - * 页面的初始数据 - */ - data: { - isLoading: true, - wan: [ - [{ - title: '学院官网', - background: 'https://upload-images.jianshu.io/upload_images/4697920-cb8ee15220e00023.png', - url: ['http://tj.ustb.edu.cn'] - }, - { - title: '教务系统', - background: 'https://upload-images.jianshu.io/upload_images/4697920-31abfba9d10d4f20.png', - url: ['http://61.181.145.1:89/jsxsd', 'http://117.131.241.67:89/jsxsd'] - }], - [{ - title: '财务(学费查询)', - background: 'https://upload-images.jianshu.io/upload_images/4697920-487ee29d884cc028.png', - url: ['http://221.238.213.131:8809'] - }, - { - title: '网上大厅', - background: 'https://upload-images.jianshu.io/upload_images/4697920-dba3529e96f74efb.png', - url: ['http://ehall.bkty.top'] - }] - ], - lan: [ - [{ - title: '学院官网', - background: 'https://upload-images.jianshu.io/upload_images/4697920-cb8ee15220e00023.png', - url: ['http://10.1.254.70'] - }, - { - title: '网费查询', - background: 'https://upload-images.jianshu.io/upload_images/4697920-45814d1b2fa8da6c.png', - url: ['http://10.1.254.112/Self'] - }], - [{ - title: '入党学习', - background: 'https://upload-images.jianshu.io/upload_images/4697920-cb05959c5e47abfc.png', - url: ['http://10.1.254.27'] - }, { - title: '校园网计费登录', - background: 'https://upload-images.jianshu.io/upload_images/4697920-61231fefddf211ac.png', - url: ['http://172.16.1.3'] - }], - [{ - title: '教务系统', - background: 'https://upload-images.jianshu.io/upload_images/4697920-31abfba9d10d4f20.png', - url: ['http://10.1.254.87/jsxsd'] - }, - { - title: '图书检索', - background: 'https://upload-images.jianshu.io/upload_images/4697920-0b70730a135ad56d.png', - url: ['http://10.1.254.101:82'] - }], - [{ - title: '图书馆数字资源', - background: 'https://upload-images.jianshu.io/upload_images/4697920-627c8c3607690f6d.png', - url: ['http://10.1.254.107'] - }, - { - title: '图书馆', - background: 'https://upload-images.jianshu.io/upload_images/4697920-47370bd93784207a.png', - url: ['http://10.1.254.101'] - }], - [{ - title: '财务(学费查询)', - background: 'https://upload-images.jianshu.io/upload_images/4697920-487ee29d884cc028.png', - url: ['http://10.2.254.80:8809'] - },{ - title: '财管系统', - background: 'https://upload-images.jianshu.io/upload_images/4697920-487ee29d884cc028.png', - url: ['http://10.2.254.80'] - }], - [{ - title: '资产与实验室管理', - background: 'https://upload-images.jianshu.io/upload_images/4697920-c86e5b66a7e513ec.png', - url: ['http://10.1.254.170'] - }, { - title: '心理咨询中心', - background: 'https://upload-images.jianshu.io/upload_images/4697920-48dab9eddafb6ce3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300', - url: ['http://10.1.254.51'] - }] - ] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - this.inital(); - }, - inital: function () { - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - copyUrl(e) { - const url = e.currentTarget.dataset.url - - wx.setClipboardData({ - data: url, - success(res) { - wx.getClipboardData({ - success(res) { - console.log(res.data) // data - wx.showToast({ - title: '复制成功,粘贴到浏览器访问', - icon: 'none' - }) - } - }) - } - }) - }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - var that = this; - setTimeout(function () { - that.setData({ - isLoading: false - }); - }, 400); - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - return { - title: '“贝壳小盒子” - 校园站点', - path: 'pages/school/web' - } - } -}) \ No newline at end of file diff --git a/pages/school/web.json b/pages/school/web.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/school/web.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/web.wxml b/pages/school/web.wxml deleted file mode 100644 index 7172f8f..0000000 --- a/pages/school/web.wxml +++ /dev/null @@ -1,59 +0,0 @@ - - - 校园站点 - 贝壳小盒子 - - - - - - - - - - - - 校园站点 - - - - 学校相关的一些网站,打开新世界的大门。点击链接可以复制到粘贴板,然后可打开浏览器访问。校园网站点必须连接校园网方可访问(不是移动CMCC的那个,是学校的校园网)。\r\n\r\n *本页面内容仅做展示不代表以下站点与本程序有任何关联关系。 - - - - - - 公共外网 - - - - {{item.title}} - {{url}} - - - - - - - 校园网 - - - - {{item.title}} - {{url}} - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/web.wxss b/pages/school/web.wxss deleted file mode 100644 index d02c2f9..0000000 --- a/pages/school/web.wxss +++ /dev/null @@ -1,10 +0,0 @@ -/* pages/school/web.wxss */ -@import "./cert.wxss"; - -page{ - background-color: var(--cyan); -} - -.underline{ - text-decoration: underline; -} \ No newline at end of file diff --git a/pages/school/xiaoai.js b/pages/school/xiaoai.js deleted file mode 100644 index 0a06f89..0000000 --- a/pages/school/xiaoai.js +++ /dev/null @@ -1,108 +0,0 @@ -// pages/school/xiaoai.js -Page({ - - /** - * 页面的初始数据 - */ - data: { - isLoading:true, - cover: 'https://upload-images.jianshu.io/upload_images/4697920-fc4ca94341465a0c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - guideImages:[ - 'https://upload-images.jianshu.io/upload_images/4697920-160801a94ef0039a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-67c3f6650998eee6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-19c2e81ae14d4e15.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-3e034cf229e93284.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-50e80fc9566bab30.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-43ddace2b43ddf58.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-f9d98473ae6ead5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-f1418ec9f834aef0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-3705a1e3879ce130.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - 'https://upload-images.jianshu.io/upload_images/4697920-43945b1dc3e74a4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240' - ] - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - - fullScreenPreview(){ - const allImages = this.data.guideImages - wx.showToast({ - title: '左右滑动切换上/下一步', - icon:'none' - }) - wx.previewImage({ - urls: allImages, - }) - }, - go2Bilibili: function () { - wx.navigateToMiniProgram({ - appId: 'wx7564fd5313d24844', - path: 'pages/video/video?bvid=BV1CL4y1Y7C5' - }) - }, - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - var that = this; - setTimeout(function() { - that.setData({ - isLoading: false - }); - }, 800); - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - let cover = this.data.cover - return { - title: '“贝壳小盒子” - 小爱课程表使用指南', - path: 'pages/school/xiaoai', - imageUrl: cover - } - } -}) \ No newline at end of file diff --git a/pages/school/xiaoai.json b/pages/school/xiaoai.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/school/xiaoai.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/school/xiaoai.wxml b/pages/school/xiaoai.wxml deleted file mode 100644 index 3537157..0000000 --- a/pages/school/xiaoai.wxml +++ /dev/null @@ -1,50 +0,0 @@ - - - 小爱课程表 - 贝壳小盒子 - - - - - - - - - - - - 小爱课程表 - - - - 小米或MIUI手机用户可以通过小爱同学快速查询学校课表,方法如下:\r\n 本功能由“不改需求的程序猿”同学个人开发,与任何单位组织无关联关系 - - - - - - - - 演示视频 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/school/xiaoai.wxss b/pages/school/xiaoai.wxss deleted file mode 100644 index 62b9663..0000000 --- a/pages/school/xiaoai.wxss +++ /dev/null @@ -1,6 +0,0 @@ -/* pages/school/xiaoai.wxss */ -@import "./cert.wxss"; - -page{ - background-color: var(--cyan); -} \ No newline at end of file diff --git a/pages/traffic/navi.js b/pages/schoolNav/schoolNav.js similarity index 85% rename from pages/traffic/navi.js rename to pages/schoolNav/schoolNav.js index 299726a..1203637 100644 --- a/pages/traffic/navi.js +++ b/pages/schoolNav/schoolNav.js @@ -1,9 +1,9 @@ -// pages/traffic/navi.js +// pages/schoolNav/schoolNav.js var amapFile = require('../../utils/amap-wx.js'); -var app = getApp(); var sliderWidth = 96; var markersData = []; Page({ + /** * 页面的初始数据 */ @@ -12,9 +12,6 @@ Page({ placeName: "", hideOrNot: 0, activePlaceID: -1, - schoolAddressText: '天津市宝坻区京津新城珠江北环东路1号', - postcode: '301830', - staticMapImage: 'https://upload-images.jianshu.io/upload_images/4697920-8ab5e49dabd814ec.png', markers: [{ id: 0, latitude: 39.544736, @@ -138,13 +135,13 @@ Page({ } }, { id: 11, - latitude: 39.546894, - longitude: 117.399626, + latitude: 39.543706, + longitude: 117.392583, iconPath: "/images/nav/xingzheng.png", width: 30, height: 32, callout: { - content: '办公楼', + content: '行政楼', display: 'ALWAYS' } }, { @@ -479,8 +476,8 @@ Page({ } }, { id: 42, - latitude: 39.545394, - longitude: 117.392733, + latitude: 39.543835, + longitude: 117.39556, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -490,8 +487,8 @@ Page({ } }, { id: 43, - latitude: 39.54575, - longitude: 117.392647, + latitude: 39.544186, + longitude: 117.395501, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -501,8 +498,8 @@ Page({ } }, { id: 44, - latitude: 39.546106, - longitude: 117.392577, + latitude: 39.544649, + longitude: 117.395533, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -512,8 +509,8 @@ Page({ } }, { id: 45, - latitude: 39.546457, - longitude: 117.392513, + latitude: 39.54503, + longitude: 117.395458, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -523,8 +520,8 @@ Page({ } }, { id: 46, - latitude: 39.546792, - longitude: 117.392416, + latitude: 39.545415, + longitude: 117.395377, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -534,8 +531,8 @@ Page({ } }, { id: 47, - latitude: 39.545481, - longitude: 117.393457, + latitude: 39.545762, + longitude: 117.395115, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -545,8 +542,8 @@ Page({ } }, { id: 48, - latitude: 39.545845, - longitude: 117.393366, + latitude: 39.546366, + longitude: 117.395066, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -556,8 +553,8 @@ Page({ } }, { id: 49, - latitude: 39.546246, - longitude: 117.393301, + latitude: 39.546809, + longitude: 117.395098, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -567,8 +564,8 @@ Page({ } }, { id: 50, - latitude: 39.546552, - longitude: 117.393216, + latitude: 39.547156, + longitude: 117.394991, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -578,8 +575,8 @@ Page({ } }, { id: 51, - latitude: 39.546904, - longitude: 117.393151, + latitude: 39.543992, + longitude: 117.396273, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -589,8 +586,8 @@ Page({ } }, { id: 52, - latitude: 39.546279, - longitude: 117.394036, + latitude: 39.544294, + longitude: 117.396161, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -600,8 +597,8 @@ Page({ } }, { id: 53, - latitude: 39.546652, - longitude: 117.39395, + latitude: 39.54472, + longitude: 117.396043, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -611,8 +608,8 @@ Page({ } }, { id: 54, - latitude: 39.546983, - longitude: 117.393865, + latitude: 39.546465, + longitude: 117.395731, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -622,8 +619,8 @@ Page({ } }, { id: 55, - latitude: 39.543835, - longitude: 117.39556, + latitude: 39.546846, + longitude: 117.395683, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -633,8 +630,8 @@ Page({ } }, { id: 56, - latitude: 39.544186, - longitude: 117.395501, + latitude: 39.547235, + longitude: 117.395538, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -644,8 +641,8 @@ Page({ } }, { id: 57, - latitude: 39.544649, - longitude: 117.395533, + latitude: 39.547342, + longitude: 117.396289, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -655,8 +652,8 @@ Page({ } }, { id: 58, - latitude: 39.54503, - longitude: 117.395458, + latitude: 39.546457, + longitude: 117.392513, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -666,8 +663,8 @@ Page({ } }, { id: 59, - latitude: 39.545415, - longitude: 117.395377, + latitude: 39.546106, + longitude: 117.392577, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -677,8 +674,8 @@ Page({ } }, { id: 60, - latitude: 39.545762, - longitude: 117.395115, + latitude: 39.54575, + longitude: 117.392647, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -688,8 +685,8 @@ Page({ } }, { id: 61, - latitude: 39.546366, - longitude: 117.395066, + latitude: 39.545394, + longitude: 117.392733, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -699,8 +696,8 @@ Page({ } }, { id: 62, - latitude: 39.546809, - longitude: 117.395098, + latitude: 39.545481, + longitude: 117.393457, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -710,8 +707,8 @@ Page({ } }, { id: 63, - latitude: 39.547156, - longitude: 117.394991, + latitude: 39.545845, + longitude: 117.393366, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -721,8 +718,8 @@ Page({ } }, { id: 64, - latitude: 39.543992, - longitude: 117.396273, + latitude: 39.546246, + longitude: 117.393301, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -732,8 +729,8 @@ Page({ } }, { id: 65, - latitude: 39.544294, - longitude: 117.396161, + latitude: 39.546552, + longitude: 117.393216, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -743,8 +740,8 @@ Page({ } }, { id: 66, - latitude: 39.54472, - longitude: 117.396043, + latitude: 39.546904, + longitude: 117.393151, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -754,8 +751,8 @@ Page({ } }, { id: 67, - latitude: 39.546465, - longitude: 117.395731, + latitude: 39.546279, + longitude: 117.394036, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -765,8 +762,8 @@ Page({ } }, { id: 68, - latitude: 39.546846, - longitude: 117.395683, + latitude: 39.546652, + longitude: 117.39395, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -776,8 +773,8 @@ Page({ } }, { id: 69, - latitude: 39.547235, - longitude: 117.395538, + latitude: 39.546983, + longitude: 117.393865, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -787,8 +784,8 @@ Page({ } }, { id: 70, - latitude: 39.547342, - longitude: 117.396289, + latitude: 39.546792, + longitude: 117.392416, iconPath: "/images/nav/sushe.png", width: 30, height: 32, @@ -796,83 +793,6 @@ Page({ content: '37斋', display: 'ALWAYS' } - }, { - id: 71, - latitude: 39.547354, - longitude: 117.397008, - iconPath: "/images/nav/sushe.png", - width: 30, - height: 32, - callout: { - content: '38斋', - display: 'ALWAYS' - } - }, { - id: 72, - latitude: 39.547254, - longitude: 117.399165, - iconPath: "/images/nav/jiaoxuelou.png", - width: 30, - height: 32, - callout: { - content: '弘艺音乐厅', - display: 'ALWAYS' - } - }, { - id: 73, - latitude: 39.547734, - longitude: 117.396874, - iconPath: "/images/nav/sushe.png", - width: 30, - height: 32, - callout: { - content: '39斋', - display: 'ALWAYS' - } - }, { - id: 74, - latitude: 39.547614, - longitude: 117.396166, - iconPath: "/images/nav/sushe.png", - width: 30, - height: 32, - callout: { - content: '40斋', - display: 'ALWAYS' - } - }, { - id: 75, - latitude: 39.547531, - longitude: 117.395469, - iconPath: "/images/nav/sushe.png", - width: 30, - height: 32, - callout: { - content: '41斋', - display: 'ALWAYS' - } - }, { - id: 76, - latitude: 39.547412, - longitude: 117.394782, - iconPath: "/images/nav/sushe.png", - width: 30, - height: 32, - callout: { - content: '42斋', - display: 'ALWAYS' - } - }, { - id: 77, - latitude: 39.545699, - longitude: 117.400388, - iconPath: "/images/nav/others.png", - width: 30, - height: 32, - callout: { - content: '鹿鸣园', - display: 'ALWAYS' - } }], distance: '', cost: '', @@ -886,17 +806,16 @@ Page({ /** * 生命周期函数--监听页面加载 */ - onLoad: function (e) { + onLoad: function(e) { console.log(e) var _this = this - _this.inital(); + if (e.markerId !== '' && Object.keys(e).length !== 0) { - const para = { detail: e }; - _this.makertap(para); + _this.makertap(e); } wx.getLocation({ type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 - success: function (res) { + success: function(res) { _this.setData({ userLongitude: res.longitude, userLatitude: res.latitude @@ -905,31 +824,30 @@ Page({ }) }, - inital: function () { - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - onReady: function () { + onReady: function() { var that = this; - setTimeout(function () { that.setData({ isLoading: false }); }, 800); + setTimeout(function() { + that.setData({ + isLoading: false + }); + }, 800); + }, - makertap: function (e) { - // console.log(e) - var id = e.detail.markerId; + makertap: function(e) { + console.log(e) + var id = e.markerId; var that = this; - var markers = that.data.markers; + const markers = that.data.markers; wx.getLocation({ type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 - success: function (res) { + success: function(res) { that.setData({ userLongitude: res.longitude, userLatitude: res.latitude }); that.setData({ activePlaceID: id, - placeName: markers[id].callout.content + placeName: that.data.markers[id].callout.content }) var userLocation = that.data.userLongitude + ',' + that.data.userLatitude; var destination = that.data.markers[id].longitude + ',' + that.data.markers[id].latitude; @@ -938,15 +856,17 @@ Page({ }) }, - planPolyline: function (origin, destination) { + planPolyline: function(origin, destination) { var that = this; var id = that.data.activePlaceID; //规划步行路线 - var myAmapFun = new amapFile.AMapWX({ key: app.globalData._amap_key }); + var myAmapFun = new amapFile.AMapWX({ + key: '66a87160f8db2a9a76431c954b4f52a5' + }); myAmapFun.getWalkingRoute({ origin: origin, destination: destination, - success: function (data) { + success: function(data) { var points = []; if (data.paths && data.paths[0] && data.paths[0].steps) { var steps = data.paths[0].steps; @@ -964,7 +884,7 @@ Page({ json: data.paths[0], polyline: [{ points: points, - color: "#3383F7", + color: "#7acfa6", width: 6 }] }); @@ -980,8 +900,8 @@ Page({ } var markers = that.data.markers; var points = that.data.polyline[0].points; - // 一共78个坐标点 - markers[79] = { + //暂时一共70个坐标点 + markers[71] = { id: 71, latitude: points[0].latitude, longitude: points[0].longitude, @@ -989,7 +909,7 @@ Page({ width: 23, height: 33 }; - markers[80] = { + markers[72] = { id: 72, latitude: points[points.length - 1].latitude, longitude: points[points.length - 1].longitude, @@ -998,15 +918,17 @@ Page({ height: 34 } - that.setData({ markers: markers }); + that.setData({ + markers: markers, + }) }, }) }, - myLocation: function () { + location: function() { var _this = this wx.getLocation({ type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 - success: function (res) { + success: function(res) { _this.setData({ userLongitude: res.longitude, userLatitude: res.latitude @@ -1014,34 +936,31 @@ Page({ } }) }, - moveToSchool: function () { + moveSchool: function() { //视图返回学校 var _this = this; - _this.setData({ userLongitude: 117.396018, userLatitude: 39.545546 }); + _this.setData({ + userLongitude: 117.396018, + userLatitude: 39.545546, + }) }, - showStaticMapImage: function () { - var _this = this; + jtt: function() { wx.previewImage({ - current: _this.data.staticMapImage, - urls: [_this.data.staticMapImage] + current: 'https://z4a.net/images/2019/03/12/SchoolMap.png', // 当前显示图片的http链接 + urls: ["https://z4a.net/images/2019/03/12/SchoolMap.png"] // 需要预览的图片http链接列表 }) }, - goDetail: function () { + goDetail: function() { var that = this; const latitude = that.data.markers[that.data.activePlaceID].latitude; const longitude = that.data.markers[that.data.activePlaceID].longitude; const name = that.data.markers[that.data.activePlaceID].callout.content; - wx.openLocation({ latitude, longitude, name, address: '学校', scale: 18 }) - }, - copyText: function (e) { - const text = e.currentTarget.dataset.text; - wx.setClipboardData({ data: text }); - wx.showToast({ title: '已复制到粘贴到', icon: 'none' }); - }, - onShareAppMessage: function (res) { - return { - title: '校园地图&导航 - 贝壳小盒子', - path: 'pages/traffic/navi', - } - }, + wx.openLocation({ + latitude, + longitude, + name, + address: '北京科技大学天津学院', + scale: 18 + }) + } }) \ No newline at end of file diff --git a/pages/schoolNav/schoolNav.json b/pages/schoolNav/schoolNav.json new file mode 100644 index 0000000..a499c24 --- /dev/null +++ b/pages/schoolNav/schoolNav.json @@ -0,0 +1,3 @@ +{ + "backgroundColor": "#7acfa6" +} \ No newline at end of file diff --git a/pages/schoolNav/schoolNav.wxml b/pages/schoolNav/schoolNav.wxml new file mode 100644 index 0000000..0d896e0 --- /dev/null +++ b/pages/schoolNav/schoolNav.wxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + {{placeName}} + 距离:{{distance}} ({{cost}}) + 详情 + + + 北京科技大学天津学院(📍前往) + 天津市宝坻区京津新城珠江北环东路1号(邮编:301830) + + \ No newline at end of file diff --git a/pages/traffic/navi.wxss b/pages/schoolNav/schoolNav.wxss similarity index 70% rename from pages/traffic/navi.wxss rename to pages/schoolNav/schoolNav.wxss index 71eaa34..554fdd8 100644 --- a/pages/traffic/navi.wxss +++ b/pages/schoolNav/schoolNav.wxss @@ -1,27 +1,5 @@ -/* pages/traffic/navi.wxss */ -.container { - align-items: stretch; - padding: 0; - height: 100%; - overflow: hidden; -} - -.remind-box { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding-bottom: 300rpx; - padding-top: 500rpx; -} - -.remind-img { - width: 250rpx; - height: 250rpx; - padding-bottom: 25rpx; -} - +/* pages/schoolNav/schoolNav.wxss */ +@import "../common/weui.wxss"; .controls { position: relative; top: 70%; @@ -38,7 +16,6 @@ .full { top: 82%; } - .flex-style { display: -webkit-box; display: -webkit-flex; @@ -93,4 +70,4 @@ width: 50px; text-align: center; border-radius: 5px; -} \ No newline at end of file +} diff --git a/pages/score/score.js b/pages/score/score.js index 720596b..03e2671 100644 --- a/pages/score/score.js +++ b/pages/score/score.js @@ -1,18 +1,19 @@ -// pages/score/score.js +// pages/score/showScore/showScore.js var wxCharts = require('../../utils/wxcharts.js'); +var util = require('../../utils/time.js'); var app = getApp(); var lineChart = null; -let interstitialAd = null; // 插屏广告初始化 Page({ /** * 页面的初始数据 */ data: { + stuId: "", password: "", jsonContent: '', PicURL: "", - PicArr: [], - screenHeight: '900', + PicArr: [""], + hasUserInfo: false, isLoading: true, showGraphic: true, painting: {}, @@ -22,57 +23,114 @@ Page({ * 生命周期函数--监听页面加载 */ onLoad: function(options) { - // console.log(options); - this.loadAds(); - this.inital(); - this.getScoreData(); - }, - inital: function () { - const device = wx.getSystemInfoSync(); - // console.log(device.screenHeight); - const scoreCache = wx.getStorageSync('myScore') || {} - let hasScoreCache = Object.keys(scoreCache).length > 0 ? true : false; - this.setData({ - screenHeight: device.screenHeight, - jsonContent: hasScoreCache ? scoreCache : '', - isLoading: hasScoreCache ? false : true - }); - if(hasScoreCache){ - this.charts(); + + var that = this; + console.log(options); + + var uid = wx.getStorageSync('uid'); + var pwd = wx.getStorageSync('newpwd'); + var cookie = options.cookie; + var vcode = options.vcode; + var scoreCache = wx.getStorageSync('p19Score'); + let showCache = true; + if(options.update=='1'){ + showCache = false; + that.GetScoreData(uid, pwd, cookie, vcode); + } + + if (scoreCache != "" && showCache) { + that.setData({ + stuId: uid, + password: pwd, + jsonContent: scoreCache, + isLoading: false + }) + that.charts(); + } else if ((uid == '' || pwd == '') || (vcode == '' || cookie == '')) { + wx.navigateTo({ + url: '/pages/index/index' + }) + } else { + that.GetScoreData(uid, pwd, cookie, vcode); } - return false; }, /** * 查询成绩 */ - getScoreData: function() { - var _this = this - const uid = app.globalData.edusysUserInfo.uid - const pwd = app.globalData.edusysUserInfo.password + GetScoreData: function(uid, pwd, cookie, vcode) { + wx.showToast({ + title: "加载中...", + icon: "loading", + duration: 60000 + }) + var that = this; wx.request({ - url: `${app.globalData.domain}/edu/score`, + url: 'https://api.airmole.cn/ShellBox/v4/score.php', method: "POST", - data: { uid: uid, pwd: pwd, cookie: app.globalData.edusysUserInfo.cookie }, + header: { + 'content-type': 'application/x-www-form-urlencoded', + }, + data: { + username: uid, + password: pwd, + cookie: cookie, + vcode: vcode + }, success: function(res) { + console.log(res.data) + that.setData({ + jsonContent: res.data, + }) + if (res.data == null) { + wx.redirectTo({ + url: '/pages/error/queryerror?ErrorTips=暂无成绩' + }) + } if (res.statusCode == 200) { - _this.setData({ isLoading: false, jsonContent: res.data }) - wx.setStorageSync('myScore', res.data) - _this.charts(); - wx.vibrateShort({ type: 'medium' }) - wx.showToast({ title: '成绩已自动更新为最新', icon: 'none' }) - if (res.data.toString().indexOf('请评教') > 0) { - wx.showModal({ - title: '请评教', - content: '您未完成本次评教,部分成绩无法展示,需要先登录教务系统完成评教后才能正确展示出成绩分数', - showCancel: false, - }) + if (res.data.code == "401" || res.data.desc == "学号、密码不正确?") { + that.reLogin(); } + that.setData({ + isLoading: false + }); + wx.hideToast(); + wx.setStorageSync('p19Score', res.data); + that.charts(); + wx.showToast({ + title: "更新完成", + icon: "succeed", + duration: 2000 + }) } else { - wx.showToast({ title: res.data.message, icon: 'none' }) + wx.redirectTo({ + url: '/pages/error/queryerror?ErrorTips=' + res.data.desc + }) } } }) }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function() { + var that = this; + that.onLoad(); + wx.stopPullDownRefresh(); + wx.showToast({ + title: "更新完成", + icon: "succeed", + duration: 2000 + }) + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + //图表相关 createSimulationData: function() { var that = this; @@ -100,7 +158,9 @@ Page({ data2: data2, } }, + touchHandler: function(e) { + // console.log(lineChart.getCurrentDataIndex(e)); lineChart.showToolTip(e, { // background: '#7cb5ec', format: function(item, category) { @@ -118,10 +178,12 @@ Page({ console.error('getSystemInfoSync failed!'); } var simulationData = this.createSimulationData(); - // console.log(simulationData) + console.log(simulationData) var that = this; if (simulationData.categories.length <= 0) { - that.setData({ showGraphic: false }); + that.setData({ + showGraphic: false + }) } else { lineChart = new wxCharts({ canvasId: 'lineCanvas', @@ -140,9 +202,11 @@ Page({ format: (val) => val + "分" } ], - xAxis: { disableGrid: true }, + xAxis: { + disableGrid: true + }, yAxis: { - title: '每学期成绩趋势', + title: '每学期学分趋势', format: (val) => val.toFixed(2), min: 60 }, @@ -154,13 +218,42 @@ Page({ lineStyle: 'curve' } }); + } }, + /** + * 用户点击右上角分享 + */ + // onShareAppMessage: function(res) { + // // console.log(res); + // return { + // title: '诺~给你看看,这是我的成绩单!', + // path: 'pages/score/score?isShareFrom=true&uid=' + this.data.stuId + '&pwd=' + this.data.password, + // } + // }, + //注销重登录 + reLogin: function() { + app.globalData.uid = ""; + app.globalData.pwd = ""; + app.globalData.newpwd = ""; + wx.setStorageSync('uid', ''); + wx.setStorageSync('pwd', ''); + wx.setStorageSync('newpwd', ''); + wx.redirectTo({ + url: '/pages/index/index' + }) + }, eventDraw() { var that = this; if (that.data.shareImage != '') { - wx.previewImage({ urls: [that.data.shareImage] }); - wx.showToast({ title: '图片已保存至相册,记得分享给朋友们哟', icon: 'none' }); + wx.previewImage({ + urls: [that.data.shareImage], + }) + wx.showToast({ + title: '图片已保存至相册,记得分享给朋友们哟', + icon: 'none', + duration: 3000 + }) return } wx.showLoading({ @@ -168,8 +261,11 @@ Page({ mask: true }) - let userNickName = app.globalData.edusysUserInfo.nickname; - if (userNickName == '') userNickName = app.globalData.edusysUserInfo.uid + let userNickName = app.globalData.nickName; + if (userNickName == '') { + userNickName = that.data.stuId; + } + let nickName = { type: 'text', content: userNickName, @@ -210,14 +306,14 @@ Page({ var whitePaperHeight = (midNum * 20) + 35; var pushArr = [{ type: 'image', - url: 'https://store2018.muapp.cn/images/4697920-b926d6f7b128a808.png', + url: 'https://upload-images.jianshu.io/upload_images/4697920-b926d6f7b128a808.png', top: 0, left: 0, width: 600, height: 390 }, { type: 'image', - url: 'https://store2018.muapp.cn/images/4697920-d0909159d03389c5.png', + url: 'https://upload-images.jianshu.io/upload_images/4697920-d0909159d03389c5.png', top: 390 + whitePaperHeight, left: 0, width: 600, @@ -346,7 +442,7 @@ Page({ pushArr = pushArr.concat(makeupFullPicArr); var topX = 400; - var leftY = 30; + var leftY = 20; for (let i = 0; i < midNum; i++) { topX = topX + 20; let tempNo = { @@ -508,15 +604,9 @@ Page({ that.eventSave(); } }, - // 创建加载插屏广告 - loadAds: function () { - if (wx.createInterstitialAd) { - interstitialAd = wx.createInterstitialAd({ adUnitId: 'adunit-5a3621a7eb4da121' }); - if (interstitialAd) { - interstitialAd.show().catch((err) => { - console.error(err) - }) - } - } + refreshData: function() { + wx.redirectTo({ + url: '/pages/index/vcode?to=score&update=1', + }) } }) \ No newline at end of file diff --git a/pages/score/score.json b/pages/score/score.json index 7d7fcd9..27d4023 100644 --- a/pages/score/score.json +++ b/pages/score/score.json @@ -1,8 +1,8 @@ { - "navigationBarBackgroundColor": "#030c13", - "enablePullDownRefresh": false, + "enablePullDownRefresh": true, + "backgroundColor": "#7acfa6", + "navigationBarTitleText": "成绩查询 - 贝壳盒子", "usingComponents": { - "calendar-item": "../school/component/calendarItem", "canvasdrawer": "/utils/canvasdrawer/canvasdrawer" } } \ No newline at end of file diff --git a/pages/score/score.wxml b/pages/score/score.wxml index 2dfd67b..ec5edef 100644 --- a/pages/score/score.wxml +++ b/pages/score/score.wxml @@ -1,76 +1,75 @@ - - - 成绩 - 贝壳小盒子 - - - - - - - - - - - - 成绩查询 - - - - 注:最终成绩以教务为准,本程序计算结果仅作参考,不具有官方权威性。学分为0或成绩低于60分的课程不纳入计算公式。 + + + + 成绩查询 + + 注:最终成绩以教务为准,本程序计算结果仅作参考,不具有官方权威性。学分为0或成绩低于60分的课程不纳入计算公式。 - - - - + + + - + + + - - - 分享成绩单 - My Transcript - - + + + - - - - {{semester}}学期 + + {{semester}}学期 + + + {{item.className}}({{item.classType}})\r\n + + {{item.examType}} {{item.period}}学时 {{item.credit}}学分 + + + {{item.score}} + {{item.score}} + {{item.score}} + - - + + 学期总结: + 算术平均分:{{item.avg}} + 加权平均分:{{item.gpa}} - - - {{item.className}}({{item.classType}}) - {{item.examType}} {{item.period}}学时 {{item.credit}}学分 - - - {{item.score}} - {{item.score}} - {{item.score}} - - - - 算术平均分:{{item.avg}} - 加权平均分: {{item.gpa}} - - - - + - + + + 更新成绩 + + + + + 很奔放 + Airmole. + + Copyright © 2020 贝壳小盒子(ShellBox) + \ No newline at end of file diff --git a/pages/score/score.wxss b/pages/score/score.wxss index 7c96d51..5c0674c 100644 --- a/pages/score/score.wxss +++ b/pages/score/score.wxss @@ -1,2 +1,212 @@ -/* pages/score/score.wxss */ -@import "../school/calendar.wxss"; \ No newline at end of file +/* pages/score/showScore/showScore.wxss */ +@import "/pages/common/weui.wxss"; + +Page { + background-color: #7acfa6; +} +.page__hd { + padding: 40px; +} + +.page__bd { + padding-bottom: 40px; +} + +.page__bd_spacing { + padding-left: 15px; + padding-right: 15px; +} + +.page__ft { + padding-bottom: 10px; + text-align: center; +} + +.page__title { + text-align: left; + font-size: 20px; + font-weight: 400; +} + +.page__desc { + margin-top: 5px; + color: #888; + text-align: left; + font-size: 14px; +} +.ykt-detail-wraper { + display: flex; + flex-direction: column; + margin: 0 auto; +} + +.ads { + padding: 30rpx 15rpx 30rpx 15rpx; +} + +/* 成绩单按钮 */ + +.clear { + position: inherit; + display: inherit; + margin-left: inherit; + margin-right: inherit; + padding-left: 0; + padding-right: 0; + box-sizing: inherit; + font-size: inherit; + text-align: inherit; + text-decoration: inherit; + line-height: inherit; + border-radius: inherit; + -webkit-tap-highlight-color: inherit; + overflow: inherit; + color: inherit; + background-color: inherit; +} + +button::after { + content: inherit; + width: inherit; + height: inherit; + position: inherit; + top: inherit; + left: inherit; + border: inherit; + -webkit-transform: inherit; + transform: inherit; + -webkit-transform-origin: inherit; + transform-origin: inherit; + box-sizing: inherit; + border-radius: inherit; +} + +.page__bd { + margin-top: 30rpx; +} + +.score__hd { + padding: 20rpx 35rpx 0 35rpx; +} + +.weui-items { + margin: 30rpx 20rpx; +} + +.weui-item { + margin: 30rpx 5rpx; + padding: 20rpx; + color: #fff; +} + +.weui-flex { + justify-content: space-between; + align-items: center; +} + +.background-1 { + background-image: linear-gradient(-45deg, #96deda 0%, #8ec5fc 100%); +} + +.background-2 { + background-image: linear-gradient(-45deg, #fbc2eb 0%, #a6c1ee 100%); +} + +.weui-item__title { + font-size: 42rpx; +} + +.weui-item__desc { + font-size: 28rpx; +} + +.border-shadow { + border-radius: 15rpx; +} + +.result-chargeInfo { + display: flex; + flex-direction: row; + margin: 20rpx 0; +} + +.chargeInfo-model { + flex: 1; + padding: 35rpx 30rpx; +} + +.chargeInfo-num { + margin-right: 10rpx; +} + +.chargeInfo-cost { + margin-left: 10rpx; +} + +.chargeInfo-model-title { + margin-bottom: 30rpx; +} + +.chargeInfo-model-info { + text-align: center; +} + +.model-info { + color: #777; + font-weight: bold; + font-size: 40pt; + line-height: 120%; + padding: 0 15rpx 0 20rpx; +} + +.result-specificInfo { + padding: 35rpx 30rpx; +} + +.specificInfo-item { + display: flex; + justify-content: space-between; + padding: 25rpx 0; +} + +.specificInfo-item-label { + flex: 1; +} + +.specificInfo-item-value { + color: #888; + font-weight: bold; + font-size: 12pt; + margin-right: 10rpx; +} + +.sdf-bg { + position: absolute; + width: 750rpx; + height: 90rpx; + bottom: -2rpx; + left: 0; + right: 0; +} +/* 悬浮按钮的 */ + +.round-click { + height: 120rpx; + width: 120rpx; + background-color: rgb(142, 200, 248); + border-radius: 100%; + position: fixed; + bottom: 50rpx; + right: 25rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; +} + +.round-click text { + font-size: 32rpx; + max-width: 80rpx; + color: #fff; + text-align: center; +} diff --git a/pages/tel/tel.js b/pages/tel/tel.js new file mode 100644 index 0000000..7936b05 --- /dev/null +++ b/pages/tel/tel.js @@ -0,0 +1,186 @@ +// pages/tel/departmentTel.js +var base64 = require("../../images/base64"); +Page({ + /** + * 页面的初始数据 + */ + data: { + isLoading: true, + //存储存储各部门电话的数组 + telNumber: [{ + name: '网络中心', + tel: 22410719 + }, { + name: '团委', + tel: 22410730 + }, { + name: '教务处', + tel: 22410732 + }, { + name: '财务处', + tel: 22410769 + }, { + name: '人事处', + tel: 22410768 + }, { + name: '宣传部', + tel: 22410352 + }, { + name: '基础部', + tel: 22410502 + }, { + name: '体育部', + tel: 22410422 + }, { + name: '思政部', + tel: 22410736 + }, { + name: '图书馆', + tel: 22410526 + }, { + name: '材料系', + tel: 22410516 + }, { + name: '机械系', + tel: 22410508 + }, { + name: '护理系', + tel: 22423905 + }, { + name: '信息系', + tel: 22410704 + }, { + name: '经济系', + tel: 22410721 + }, { + name: '管理系 ', + tel: 22410705 + }, { + name: '法律系', + tel: 22410391 + }, { + name: '艺术系', + tel: 22410348 + }, { + name: '外语系', + tel: 22410523 + }, { + name: '城市建设学院', + tel: 22410703 + }, { + name: '学院办公室', + tel: 22410800 + }, { + name: '学校报警电话 ', + tel: 22411110 + }, { + name: '心理咨询中心', + tel: 22410981 + }, { + name: '学生工作办公室', + tel: 22410298 + }, { + name: '国际合作交流部', + tel: 22410389 + }, { + name: '招生就业处(就业)', + tel: 22412672 + }, { + name: '招办就业处(招生)', + tel: 22410960 + }, { + name: '保卫处(户籍/宿管)', + tel: 22411900 + }, { + name: '基建后勤处资产管理中心', + tel: 22410919 + }], + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + this.setData({ + icon: base64.icon20 + }); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + var that = this; + setTimeout(function() { + that.setData({ + isLoading: false + }); + }, 400); + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function() { + + }, + + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + /** + * 点击电话号码拨出电话事件的处理函数 + */ + callPhone: function(event) { + wx.makePhoneCall({ + phoneNumber: event.target.id + }) + }, + /** + * 长按号码复制到粘贴板的处理函数 + */ + copyIt: function(event) { + wx.setClipboardData({ + data: event.target.id + }) + wx.showToast({ + title: '已复制到粘贴版', + icon: 'none', + duration: 1000 + }); + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function(res) { + if (res.from === 'button') { + // 来自页面内转发按钮 + // console.log(res.target) + } + return { + title: '北科天院各系部联系电话', + path: 'pages/tel/tel', + // imageUrl: "https://airmole.cn/wechat/wxapp/images/QueryTel.jpg" + } + } +}) \ No newline at end of file diff --git a/pages/tel/tel.json b/pages/tel/tel.json new file mode 100644 index 0000000..7fd9dfa --- /dev/null +++ b/pages/tel/tel.json @@ -0,0 +1,4 @@ +{ + "enablePullDownRefresh": true, + "backgroundColor": "#7acfa6" +} \ No newline at end of file diff --git a/pages/tel/tel.wxml b/pages/tel/tel.wxml new file mode 100644 index 0000000..56c6124 --- /dev/null +++ b/pages/tel/tel.wxml @@ -0,0 +1,37 @@ + + + + + + + + 各系部联系电话 + + 学校各系、各部门办公联系电话\n\r点击号码可以直接拨打,长按号码复制到粘贴版 + + + + + + + {{item.name}} + {{item.tel}} + + + 外地用户请加拨天津长途区号 022 + + + + + + + + + + Airmole. + + Copyright © 2020 贝壳小盒子(ShellBox) + + \ No newline at end of file diff --git a/pages/tel/tel.wxss b/pages/tel/tel.wxss new file mode 100644 index 0000000..b5c698c --- /dev/null +++ b/pages/tel/tel.wxss @@ -0,0 +1,110 @@ +/* pages/tel/departmentTel.wxss */ +@import "../common/weui.wxss"; + +Page { + background-color: #7acfa6; +} + +.page__hd { + padding: 40px; +} + +.page__bd { + padding-bottom: 40px; +} + +.page__bd_spacing { + padding-left: 15px; + padding-right: 15px; +} + +.page__ft { + padding-bottom: 10px; + text-align: center; +} + +.page__title { + text-align: left; + font-size: 20px; + font-weight: 400; +} + +.page__desc { + margin-top: 5px; + color: #888; + text-align: left; + font-size: 14px; +} + +.ads { + padding: 30rpx 15rpx 30rpx 15rpx; +} + +.btnIcon { + width: 26px; + height: 26px; + vertical-align: text-bottom; +} + +.ykt-detail-wraper { + display: flex; + flex-direction: column; + margin: 0 30rpx 30rpx; + background: rgba(255, 255, 255, 0.4); + border-radius: 25rpx; + box-shadow: 5rpx 5rpx 15rpx #ccc; +} + +.ykt-detail { + display: flex; + flex-direction: column; + padding: 0 10rpx; + overflow: hidden; +} + +.ykt-head { + display: flex; + justify-content: center; + align-items: center; + height: 120rpx; +} + +.ykt-type-name { + font-size: 11pt; +} + +.detail-list { + display: flex; + flex-direction: column; + align-items: stretch; + padding: 0 35rpx 10rpx; +} + +.detail-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 25rpx 5rpx 20rpx; + border-top: 1px solid #eee; +} + +.detail-item-label { + color: #000; + width: 180pt; +} + +.detail-item-value { + flex: 1; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 30rpx 30rpx 30rpx; +} diff --git a/pages/traffic/bus.js b/pages/traffic/bus.js deleted file mode 100644 index a6c256b..0000000 --- a/pages/traffic/bus.js +++ /dev/null @@ -1,181 +0,0 @@ -var sliderWidth = 96; // 需要设置slider的宽度,用于计算中间位置 - -Page({ - data: { - tabs: ["天津", "宝坻"], - activeIndex: 0, - sliderOffset: 0, - sliderLeft: 0, - isLoading: true, - guomaoQrcode: 'https://upload-images.jianshu.io/upload_images/4697920-f2e9f2fde02b0c09.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240', - chelaileWeappid: 'wx71d589ea01ce3321', - bus160: [ - '学院西门', - '天津财经大学珠江学院', - '军事交通学院分院东', - '军事交通学院分院西', - '玉佛宫', - '玉良庄村', - '大觉禅寺', - '京津新城管委会', - '京津新城公交站', - '凯悦大酒店', - '合生创展', - '上京顺园', - '上京康园', - '上京雍园', - '消防队', - '朱家窝', - '田家桥', - '大白庄镇第二小学', - '鸿坤原乡小镇', - '范家庄', - '锦绣香江医院', - '华北集团地铁站', - '白庙客运站' - ], - busBao13: [ - '京津新城', - '学院西门', - '天津财经大学珠江学院北门', - '周良庄', - '凯旋家园', - '怡购清华园', - '怡人购商业广场', - '天宝新苑小区', - '宝坻中医院', - '劝宝超市东门', - '宝坻客运站' - ] - }, - onLoad: function (r) { - var that = this; - that.inital(); - if (r.activeIndex) { - that.setData({ - sliderOffset: r.activeIndex * that.data.sliderOffset, - activeIndex: r.activeIndex, - }) - } - }, - inital: function () { - var that = this; - wx.getSystemInfo({ - success: function (res) { - that.setData({ - sliderLeft: (res.windowWidth / that.data.tabs.length - sliderWidth) / 2, - sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex - }); - } - }); - - wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] - }) - }, - onReady: function () { - var that = this; - setTimeout(function () { - that.setData({ - isLoading: false - }); - }, 400); - }, - tabClick: function (e) { - this.setData({ - activeIndex: e.currentTarget.dataset.id, - scrollLeft: (e.currentTarget.dataset.id - 1) * 60 - }) - }, - goJJXCStation: function () { - wx.getLocation({ - type: 'gcj02', - success(res) { - wx.openLocation({ - latitude: 39.548662, - longitude: 117.363274, - scale: 17, - name: '京津新城公交站', - address: '京津新城北京国贸商务班车' - }) - } - }) - }, - goBJGMStation: function () { - wx.getLocation({ - type: 'gcj02', // 返回可以用于wx.openLocation的经纬度 - success(res) { - wx.openLocation({ - latitude: 39.905531, - longitude: 116.461934, - scale: 17, - name: '北京国贸乘车点', - address: '北京国贸桥南艾维克酒店西门三环辅路' - }) - } - }) - }, - showBjBusQrcode: function () { - var qrcode = this.data.guomaoQrcode - wx.previewImage({ - urls: [qrcode], - }) - }, - chelaile160: function () { - const chelaileWeappid = this.data.chelaileWeappid; - wx.navigateToMiniProgram({ - appId: chelaileWeappid, - path: '/pages/linedetail2/linedetail?referer=home_favorite&targetStop={"couponFlag":0,"distanceToSp":-1,"lat":39.550400628154215,"lng":117.39601432727834,"order":1,"sId":"022-10010","sn":"北京科技大学天津学院西门"}&nextStop={}&city={"cityId":"006","cityLogoUrl":"https://image3.chelaile.net.cn/2c988cf5f09f4d19be781288ac8a49bb","cityName":"天津","cityVersion":0,"isGpsCity":0,"isHot":1,"isNewCity":0,"isSupport":1,"pinyin":"TianJin","supportSubway":1,"wechatFavoriteGray":0,"icoName":"tianjin","localCityId":"036"}&line={"lineId":"0022136478519","lineName":"160","direction":0,"lineNo":"160"}' - }) - }, - chelaileBao13: function () { - const chelaileWeappid = this.data.chelaileWeappid; - wx.navigateToMiniProgram({ - appId: chelaileWeappid, - path: '/pages/linedetail2/linedetail?referer=home_favorite&targetStop={"couponFlag":0,"distanceToSp":-1,"lat":39.550400628154215,"lng":117.39601432727834,"order":2,"sId":"022-10010","sn":"北京科技大学天津学院西门"}&nextStop={}&city={"cityId":"006","cityLogoUrl":"https://image3.chelaile.net.cn/2c988cf5f09f4d19be781288ac8a49bb","cityName":"天津","cityVersion":0,"isGpsCity":0,"isHot":1,"isNewCity":0,"isSupport":1,"pinyin":"TianJin","supportSubway":1,"wechatFavoriteGray":0,"icoName":"tianjin","localCityId":"036"}&line={"lineId":"002290094530","lineName":"宝13","direction":0,"lineNo":"宝13"}' - }) - }, - busSchedule: function (e) { - // console.log(e.currentTarget.dataset); - const busline = e.currentTarget.dataset.busline; - let pathPara = ''; - let path = `pages/timetable/timetable`; - switch (busline) { - case 'school2city': - pathPara = 'city={"cityId":"006","cityLogoUrl":"https://image3.chelaile.net.cn/2c988cf5f09f4d19be781288ac8a49bb","cityName":"天津","cityVersion":0,"isGpsCity":0,"isHot":1,"isNewCity":0,"isSupport":1,"pinyin":"TianJin","supportSubway":1,"wechatFavoriteGray":0,"icoName":"tianjin","localCityId":"036","grey":false}&line=%7B%22assistDesc%22%3A%22%E5%BB%BA%E8%AE%AE%E6%82%A8%E8%80%83%E8%99%91%E5%85%B6%E4%BB%96%E5%87%BA%E8%A1%8C%E6%96%B9%E6%A1%88%22%2C%22desc%22%3A%22%E6%9C%AC%E7%BA%BF%E8%B7%AF%E5%B7%B2%E8%BF%87%E6%9C%AB%E7%8F%AD%22%2C%22direction%22%3A0%2C%22endSn%22%3A%22%E7%99%BD%E5%BA%99%E5%85%AC%E4%BA%A4%E7%AB%99%22%2C%22firstTime%22%3A%2205%3A10%22%2C%22h5NewStyle%22%3A0%2C%22hasBusInfo%22%3Afalse%2C%22isSubway%22%3A0%2C%22ksDesc%22%3A%22%E7%AD%89%E5%BE%85%E5%8F%91%E8%BD%A6%22%2C%22lastTime%22%3A%2217%3A00%22%2C%22lineId%22%3A%220022136478519%22%2C%22lineNo%22%3A%22160%22%2C%22maxJoinOrder%22%3A0%2C%22name%22%3A%22160%22%2C%22notNeedRealData%22%3Afalse%2C%22price%22%3A%225~15%E5%85%83%22%2C%22priceExpansion%22%3A%22%5B%E5%85%B6%E4%BB%96%5D%EF%BC%9A%E5%BC%80%E5%BE%80%E5%AE%9D%E5%9D%BB%E6%96%B9%E5%90%91%EF%BC%8C19%3A00%E6%9C%AB%E7%8F%AD%E8%BD%A6%E4%B8%BA%E5%8D%8E%E5%8C%97%E9%9B%86%E5%9B%A2%E5%A7%8B%E5%8F%91%22%2C%22realCityId%22%3A%22006%22%2C%22segTimes%22%3A%5B%5B%2205%3A10%22%2C%2217%3A00%22%5D%5D%2C%22shortDesc%22%3A%22%E6%9C%AB%E7%8F%AD%E5%B7%B2%E8%BF%87%22%2C%22sortPolicy%22%3A%22flpolicy%3D0%22%2C%22startSn%22%3A%22%E5%8C%97%E4%BA%AC%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6%E5%A4%A9%E6%B4%A5%E5%AD%A6%E9%99%A2%E8%A5%BF%E9%97%A8%22%2C%22state%22%3A-3%2C%22stationsNum%22%3A43%2C%22temOperation%22%3Afalse%2C%22thirdDir%22%3A0%2C%22type%22%3A0%2C%22version%22%3A%22%22%7D'; - break; - case 'city2school': - pathPara = 'city={"cityId":"006","cityLogoUrl":"https://image3.chelaile.net.cn/2c988cf5f09f4d19be781288ac8a49bb","cityName":"天津","cityVersion":0,"isGpsCity":0,"isHot":1,"isNewCity":0,"isSupport":1,"pinyin":"TianJin","supportSubway":1,"wechatFavoriteGray":0,"icoName":"tianjin","localCityId":"036","grey":false}&line=%7B%22assistDesc%22%3A%22%22%2C%22desc%22%3A%22%22%2C%22direction%22%3A1%2C%22endSn%22%3A%22%E5%8C%97%E4%BA%AC%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6%E5%A4%A9%E6%B4%A5%E5%AD%A6%E9%99%A2%E8%A5%BF%E9%97%A8%22%2C%22firstTime%22%3A%2207%3A30%22%2C%22h5NewStyle%22%3A0%2C%22hasBusInfo%22%3Afalse%2C%22isSubway%22%3A0%2C%22lastTime%22%3A%2219%3A00%22%2C%22lineId%22%3A%220022136545543%22%2C%22lineNo%22%3A%22160%22%2C%22maxJoinOrder%22%3A0%2C%22name%22%3A%22160%22%2C%22notNeedRealData%22%3Afalse%2C%22price%22%3A%225~15%E5%85%83%22%2C%22priceExpansion%22%3A%22%5B%E5%85%B6%E4%BB%96%5D%EF%BC%9A%E5%BC%80%E5%BE%80%E5%AE%9D%E5%9D%BB%E6%96%B9%E5%90%91%EF%BC%8C19%3A00%E6%9C%AB%E7%8F%AD%E8%BD%A6%E4%B8%BA%E5%8D%8E%E5%8C%97%E9%9B%86%E5%9B%A2%E5%A7%8B%E5%8F%91%22%2C%22realCityId%22%3A%22006%22%2C%22segTimes%22%3A%5B%5B%2207%3A30%22%2C%2219%3A00%22%5D%5D%2C%22shortDesc%22%3A%22%22%2C%22sortPolicy%22%3A%22flpolicy%3D0%22%2C%22startSn%22%3A%22%E7%99%BD%E5%BA%99%E5%85%AC%E4%BA%A4%E7%AB%99%22%2C%22state%22%3A0%2C%22stationsNum%22%3A39%2C%22temOperation%22%3Afalse%2C%22thirdDir%22%3A0%2C%22type%22%3A0%2C%22version%22%3A%22%22%7D'; - break; - case 'baodi2school': - pathPara = 'city={"cityId":"006","cityLogoUrl":"https://image3.chelaile.net.cn/2c988cf5f09f4d19be781288ac8a49bb","cityName":"天津","cityVersion":0,"isGpsCity":0,"isHot":1,"isNewCity":0,"isSupport":1,"pinyin":"TianJin","supportSubway":1,"wechatFavoriteGray":0,"icoName":"tianjin","localCityId":"036","grey":false}&line=%7B%22assistDesc%22%3A%22%E5%BB%BA%E8%AE%AE%E6%82%A8%E8%80%83%E8%99%91%E5%85%B6%E4%BB%96%E5%87%BA%E8%A1%8C%E6%96%B9%E6%A1%88%22%2C%22desc%22%3A%22%E6%9C%AC%E7%BA%BF%E8%B7%AF%E5%B7%B2%E8%BF%87%E6%9C%AB%E7%8F%AD%22%2C%22direction%22%3A0%2C%22endSn%22%3A%22%E4%BA%AC%E6%B4%A5%E6%96%B0%E5%9F%8E%22%2C%22firstTime%22%3A%2206%3A30%22%2C%22h5NewStyle%22%3A0%2C%22hasBusInfo%22%3Afalse%2C%22isSubway%22%3A0%2C%22ksAssistDesc%22%3A%22%E5%BB%BA%E8%AE%AE%E8%80%83%E8%99%91%5Cn%E5%85%B6%E4%BB%96%E5%87%BA%E8%A1%8C%E6%96%B9%E6%A1%88%22%2C%22ksDesc%22%3A%22%E6%9C%AB%E7%8F%AD%E5%B7%B2%E8%BF%87%22%2C%22lastTime%22%3A%2217%3A30%22%2C%22lineId%22%3A%22002290094525%22%2C%22lineNo%22%3A%22%E5%AE%9D13%22%2C%22maxJoinOrder%22%3A0%2C%22name%22%3A%22%E5%AE%9D13%22%2C%22notNeedRealData%22%3Afalse%2C%22price%22%3A%222~6%E5%85%83%22%2C%22priceExpansion%22%3A%22%22%2C%22realCityId%22%3A%22006%22%2C%22segTimes%22%3A%5B%5B%2206%3A30%22%2C%2217%3A30%22%5D%5D%2C%22shortDesc%22%3A%22%E6%9C%AB%E7%8F%AD%E5%B7%B2%E8%BF%87%22%2C%22sortPolicy%22%3A%22flpolicy%3D0%22%2C%22startSn%22%3A%22%E5%AE%9D%E5%9D%BB%E5%AE%A2%E8%BF%90%E7%AB%99%EF%BC%88%E5%85%AC%E4%BA%A4%E5%9C%BA%E7%AB%99%EF%BC%89%22%2C%22state%22%3A-3%2C%22stationsNum%22%3A21%2C%22temOperation%22%3Afalse%2C%22thirdDir%22%3A0%2C%22type%22%3A0%2C%22version%22%3A%22%22%7D'; - break; - case 'school2baodi': - pathPara = 'city={"cityId":"006","cityLogoUrl":"https://image3.chelaile.net.cn/2c988cf5f09f4d19be781288ac8a49bb","cityName":"天津","cityVersion":0,"isGpsCity":0,"isHot":1,"isNewCity":0,"isSupport":1,"pinyin":"TianJin","supportSubway":1,"wechatFavoriteGray":0,"icoName":"tianjin","localCityId":"036","grey":false}&line=%7B%22assistDesc%22%3A%22%E5%BB%BA%E8%AE%AE%E6%82%A8%E8%80%83%E8%99%91%E5%85%B6%E4%BB%96%E5%87%BA%E8%A1%8C%E6%96%B9%E6%A1%88%22%2C%22desc%22%3A%22%E6%9C%AC%E7%BA%BF%E8%B7%AF%E5%B7%B2%E8%BF%87%E6%9C%AB%E7%8F%AD%22%2C%22direction%22%3A1%2C%22endSn%22%3A%22%E5%AE%9D%E5%9D%BB%E5%AE%A2%E8%BF%90%E7%AB%99%EF%BC%88%E5%85%AC%E4%BA%A4%E5%9C%BA%E7%AB%99%EF%BC%89%22%2C%22firstTime%22%3A%2206%3A30%22%2C%22h5NewStyle%22%3A0%2C%22hasBusInfo%22%3Afalse%2C%22isSubway%22%3A0%2C%22ksAssistDesc%22%3A%22%E5%BB%BA%E8%AE%AE%E8%80%83%E8%99%91%5Cn%E5%85%B6%E4%BB%96%E5%87%BA%E8%A1%8C%E6%96%B9%E6%A1%88%22%2C%22ksDesc%22%3A%22%E6%9C%AB%E7%8F%AD%E5%B7%B2%E8%BF%87%22%2C%22lastTime%22%3A%2217%3A30%22%2C%22lineId%22%3A%22002290094530%22%2C%22lineNo%22%3A%22%E5%AE%9D13%22%2C%22maxJoinOrder%22%3A0%2C%22name%22%3A%22%E5%AE%9D13%22%2C%22notNeedRealData%22%3Afalse%2C%22price%22%3A%222~6%E5%85%83%22%2C%22priceExpansion%22%3A%22%22%2C%22realCityId%22%3A%22006%22%2C%22segTimes%22%3A%5B%5B%2206%3A30%22%2C%2217%3A30%22%5D%5D%2C%22shortDesc%22%3A%22%E6%9C%AB%E7%8F%AD%E5%B7%B2%E8%BF%87%22%2C%22sortPolicy%22%3A%22flpolicy%3D0%22%2C%22startSn%22%3A%22%E4%BA%AC%E6%B4%A5%E6%96%B0%E5%9F%8E%22%2C%22state%22%3A-3%2C%22stationsNum%22%3A21%2C%22temOperation%22%3Afalse%2C%22thirdDir%22%3A0%2C%22type%22%3A0%2C%22version%22%3A%22%22%7D'; - break; - default: - pathPara = ''; - } - path = `${path}?${pathPara}`; - const chelaileWeappid = this.data.chelaileWeappid; - wx.navigateToMiniProgram({ - appId: chelaileWeappid, - path: path - }) - }, - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function (res) { - var that = this; - if (res.from === 'button') { - // 来自页面内转发按钮 - console.log(res.target.id) - } - return { - title: '贝壳田园到' + that.data.tabs[that.data.activeIndex] + '出行方案', - path: 'pages/traffic/bus?activeIndex=' + that.data.activeIndex, - } - } -}); \ No newline at end of file diff --git a/pages/traffic/bus.json b/pages/traffic/bus.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/traffic/bus.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/traffic/bus.wxml b/pages/traffic/bus.wxml deleted file mode 100644 index e19807f..0000000 --- a/pages/traffic/bus.wxml +++ /dev/null @@ -1,198 +0,0 @@ - - - 出行 - 贝壳小盒子 - - - - - - - - - - {{item}} - - - - - - - - - - - - - - - 京津新城 ←_→ 天津市区 - - 乘车地点:学院西门 - 票价:全程¥15元(按距离分¥5/¥10/¥15) - 京津新城至白庙:5:10~17:00,约30分/班 - 时刻表 - - 白庙至京津新城:7:30~19:00,约30分/班 - 时刻表 - - 提示:资料来源于网络搜集整理,仅供参考 - - - - - - - - 查看公交实时运行状况 - - - - - - - - 天津公交 160路 - - - 部分站点 - - - {{index+1 > 3 ? '...': index+1}}. {{item}} - - - - - - - - - - - - - - 学院 ←_→ 宝坻 (公交:宝13路) - - 运行时间:6:30~17:30 - 学院至宝坻方向: - 发车时刻表 - - 宝坻至学院方向: - 发车时刻表 - - 票价:¥2~¥6元 - 提示:资料来源于网络搜集整理,仅供参考 - - - - - - - - 查看公交实时运行状况 - - - - - - - - 天津公交 宝13路 - - - 部分站点 - - - {{index+1 > 3 ? '...': index+1}}. {{item}} - - - - - - - - - - - - - \ No newline at end of file diff --git a/pages/traffic/bus.wxss b/pages/traffic/bus.wxss deleted file mode 100644 index 7486ed9..0000000 --- a/pages/traffic/bus.wxss +++ /dev/null @@ -1,10 +0,0 @@ -/* pages/traffic/bus.wxss */ -@import "../school/calendar.wxss"; - -page{ - background-color: #7acfa6; -} - -.text-indent{ - text-indent: 2em; -} \ No newline at end of file diff --git a/pages/traffic/navi.wxml b/pages/traffic/navi.wxml deleted file mode 100644 index 7d1d80a..0000000 --- a/pages/traffic/navi.wxml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - {{placeName}} - 距离:{{distance}} ({{cost}}) - 详情 - - - 学校 - 前往 - - {{schoolAddressText}}(邮编:{{postcode}}) - - - \ No newline at end of file diff --git a/pages/webview/redpacket.js b/pages/webview/redpacket.js deleted file mode 100644 index 1cde343..0000000 --- a/pages/webview/redpacket.js +++ /dev/null @@ -1,69 +0,0 @@ -// pages/webview/redpacket.js -Page({ - - /** - * 页面的初始数据 - */ - data: { - url: '' - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad(options) { - const url = options.url ? decodeURIComponent(options.url) : '' - console.log('红包封面领取链接地址:', url) - if (url === '') wx.reLaunch({ url: '/pages/index/index' }) - this.setData({ url: url }) - }, - - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady() { - - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow() { - wx.showRedPackage({ url: this.data.url }) - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide() { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload() { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh() { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom() { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage() { - - } -}) \ No newline at end of file diff --git a/pages/webview/redpacket.json b/pages/webview/redpacket.json deleted file mode 100644 index 8835af0..0000000 --- a/pages/webview/redpacket.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "usingComponents": {} -} \ No newline at end of file diff --git a/pages/webview/redpacket.wxml b/pages/webview/redpacket.wxml deleted file mode 100644 index ff723d4..0000000 --- a/pages/webview/redpacket.wxml +++ /dev/null @@ -1 +0,0 @@ -  \ No newline at end of file diff --git a/pages/webview/redpacket.wxss b/pages/webview/redpacket.wxss deleted file mode 100644 index 496d09e..0000000 --- a/pages/webview/redpacket.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/webview/redpacket.wxss */ \ No newline at end of file diff --git a/pages/webview/webview.js b/pages/webview/webview.js deleted file mode 100644 index 701d450..0000000 --- a/pages/webview/webview.js +++ /dev/null @@ -1,73 +0,0 @@ -// pages/webview/webview.js -const defaultUrl = 'https://mp.weixin.qq.com/s/51iFkQBg89lZKz_1a7bLgw' -Page({ - - /** - * 页面的初始数据 - */ - data: { - url: defaultUrl - }, - - /** - * 生命周期函数--监听页面加载 - */ - onLoad(options) { - let url = '' - if (typeof options.url == 'undefined') { - url = defaultUrl - } else { - url = decodeURIComponent(options.url) - } - this.setData({ url: url }) - }, - - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady() { - - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow() { - - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide() { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload() { - - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh() { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom() { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage() { - - } -}) \ No newline at end of file diff --git a/pages/webview/webview.json b/pages/webview/webview.json deleted file mode 100644 index ea405d0..0000000 --- a/pages/webview/webview.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "navigationBarBackgroundColor": "#7ACFA6", - "navigationBarTextStyle": "white", - "navigationBarTitleText": "贝壳小盒子", - "backgroundColor": "#7ACFA6", - "backgroundTextStyle": "light", - "navigationStyle": "default" -} \ No newline at end of file diff --git a/pages/webview/webview.wxml b/pages/webview/webview.wxml deleted file mode 100644 index 5f6ff60..0000000 --- a/pages/webview/webview.wxml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/pages/webview/webview.wxss b/pages/webview/webview.wxss deleted file mode 100644 index 229fba5..0000000 --- a/pages/webview/webview.wxss +++ /dev/null @@ -1 +0,0 @@ -/* pages/webview/webview.wxss */ \ No newline at end of file diff --git a/pages/welcome/welcome.js b/pages/welcome/welcome.js new file mode 100644 index 0000000..e86fdf8 --- /dev/null +++ b/pages/welcome/welcome.js @@ -0,0 +1,28 @@ +var app = getApp() +Page({ + data: { + uid: "", + name: "", + classroom:"", + jsonStr: "", + hasUserInfo: 0 + }, + start: function() { + wx.reLaunch({ + url: '../bookSearch/index', + }) + }, + onLoad: function(options) { + var that = this + this.setData({ + uid: options.uid, + name: options.name, + classroom: options.classroom, + }); + }, + bindGetUserInfo: function(e) { + console.log(e); + app.globalData.nickName = e.detail.userInfo.nickName; + this.start(); + } +}) \ No newline at end of file diff --git a/pages/welcome/welcome.json b/pages/welcome/welcome.json new file mode 100644 index 0000000..0096afb --- /dev/null +++ b/pages/welcome/welcome.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "欢迎 - 贝壳小盒子" +} \ No newline at end of file diff --git a/pages/welcome/welcome.wxml b/pages/welcome/welcome.wxml new file mode 100644 index 0000000..378f6fd --- /dev/null +++ b/pages/welcome/welcome.wxml @@ -0,0 +1,40 @@ + + + + + 欢迎你,同学: + + + + + + + + + + + + + + + + + 姓名 + {{name}} + + + 班级 + {{classroom}} + + + 学号 + {{uid}} + + + + + + + \ No newline at end of file diff --git a/pages/welcome/welcome.wxss b/pages/welcome/welcome.wxss new file mode 100644 index 0000000..ed1f5e5 --- /dev/null +++ b/pages/welcome/welcome.wxss @@ -0,0 +1,206 @@ +/* pages/welcome/welcome.wxss */ +@import "../common/weui.wxss"; + +Page { + background-color: #7acfa6; +} + +.userinfo-avatar { + border-radius: 128rpx; + clip-path: circle(50% at center); + width: 160rpx; + height: 160rpx; + box-shadow: 5rpx 5rpx 15rpx #ccc; +} + +.ykt-detail-wraper { + display: flex; + flex-direction: column; + margin: 0 30rpx 30rpx; + background: rgba(255, 255, 255, 0.3); + border-radius: 3px; + box-shadow: 5rpx 5rpx 15rpx #ccc; +} + +.detail-list { + display: flex; + flex-direction: column; + align-items: stretch; + padding: 0 35rpx 10rpx; +} + +.detail-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 25rpx 5rpx 20rpx; + border-top: 1px solid #eee; +} + +.ykt-head { + display: flex; + justify-content: center; + align-items: center; + height: 120rpx; +} + +.ykt-type-name { + font-size: 11pt; +} + +.detail-item-label { + color: #000; + width: 60pt; +} + +.detail-item-value { + flex: 1; +} + +.userinfo-nickname { + margin-top: 20rpx; + font-size: 38rpx; +} + +/* page */ + +.container { + display: flex; + flex-direction: column; + min-height: 100%; + justify-content: space-between; + font-size: 32rpx; + font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif; +} + +.page-head { + text-align: center; +} + +.page-head-title { + display: inline-block; + font-size: 32rpx; + color: #bebebe; +} + +.page-head-line { + margin: 0 auto; + width: 150rpx; + height: 2rpx; + background-color: #d8d8d8; +} + +.page-head-desc { + padding-top: 20rpx; + color: #9b9b9b; + font-size: 32rpx; +} + +.page-body { + width: 100%; + flex-grow: 1; + overflow-x: hidden; +} + +.login-btn { + font-size: 13pt; + line-height: 85rpx; + height: 85rpx; + background: #04c065; + color: #fff; + text-align: center; + border-radius: 25px; + box-shadow: 5rpx 5rpx 15rpx #ccc; + margin: 0 30rpx 30rpx; +} + +.page-body-wrapper { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; +} + +.page-body-wording { + text-align: center; + padding: 200rpx 100rpx; +} + +.page-body-info { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + padding: 90rpx 0 50rpx 0; +} + +.page-body-title { + margin-bottom: 100rpx; + font-size: 40rpx; +} + +.page-body-text { + font-size: 32rpx; + line-height: 26px; + color: #ccc; +} + +.page-body-text-small { + font-size: 24rpx; + color: #000; + margin-bottom: 100rpx; +} + +.page-foot { + margin: 100rpx 0 30rpx 0; + text-align: center; + color: #1aad19; + font-size: 0; +} + +.icon-foot { + width: 152rpx; + height: 23rpx; +} + +.page-section { + width: 100%; +} + +.page-section_center { + display: flex; + flex-direction: column; + align-items: center; +} + +.page-section:last-child { + margin-bottom: 0; +} + +.page-section-gap { + box-sizing: border-box; + padding: 0 30rpx; +} + +.page-section-spacing { + box-sizing: border-box; + padding: 0 80rpx; +} + +.page-section-title { + font-size: 28rpx; + color: #999; + margin-bottom: 10rpx; + padding-left: 30rpx; + padding-right: 30rpx; +} + +.page-section-gap .page-section-title { + padding-left: 0; + padding-right: 0; +} + +.btn-area { + margin-left: 14px; + margin-right: 14px; +} diff --git a/project.config.json b/project.config.json index 02b2c51..5b9a284 100644 --- a/project.config.json +++ b/project.config.json @@ -1,70 +1,60 @@ { - "description": "项目配置文件", - "packOptions": { - "ignore": [], - "include": [] - }, - "setting": { - "urlCheck": true, - "es6": true, - "enhance": false, - "postcss": true, - "preloadBackgroundData": false, - "minified": true, - "newFeature": true, - "coverView": true, - "nodeModules": false, - "autoAudits": false, - "showShadowRootInWxmlPanel": true, - "scopeDataCheck": false, - "uglifyFileName": false, - "checkInvalidKey": true, - "checkSiteMap": true, - "uploadWithSourceMap": true, - "compileHotReLoad": false, - "useMultiFrameRuntime": false, - "useApiHook": false, - "useApiHostProcess": false, - "babelSetting": { - "ignore": [], - "disablePlugins": [], - "outputPath": "" - }, - "useIsolateContext": false, - "userConfirmedBundleSwitch": false, - "packNpmManually": false, - "packNpmRelationList": [], - "minifyWXSS": true, - "disableUseStrict": false, - "minifyWXML": true, - "showES6CompileOption": false, - "useCompilerPlugins": false, - "ignoreUploadUnusedFiles": true, - "condition": false - }, - "compileType": "miniprogram", - "libVersion": "2.15.0", - "appid": "wxf0ba93e3faff4eda", - "projectname": "shellbox-weapp", - "simulatorType": "wechat", - "simulatorPluginLibVersion": {}, - "condition": { - "search": { - "list": [] - }, - "conversation": { - "list": [] - }, - "game": { - "currentL": -1, - "list": [] - }, - "miniprogram": { - "list": [] - } - }, - "editorSetting": { - "tabIndent": "insertSpaces", - "tabSize": 2 - } + "description": "项目配置文件。", + "setting": { + "urlCheck": true, + "es6": true, + "postcss": true, + "minified": true, + "newFeature": true, + "autoAudits": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + } + }, + "compileType": "miniprogram", + "libVersion": "2.4.0", + "appid": "wxf0ba93e3faff4eda", + "projectname": "%E8%B4%9D%E5%A3%B3%E5%B0%8F%E7%9B%92%E5%AD%90", + "isGameTourist": false, + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "condition": { + "search": { + "current": -1, + "list": [] + }, + "conversation": { + "current": -1, + "list": [] + }, + "plugin": { + "current": -1, + "list": [] + }, + "game": { + "currentL": -1, + "list": [] + }, + "gamePlugin": { + "current": -1, + "list": [] + }, + "miniprogram": { + "current": -1, + "list": [ + { + "id": 0, + "name": "kb", + "pathName": "pages/classQuery/index", + "query": "", + "scene": null + } + ] + } + } } \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json deleted file mode 100644 index ef336b2..0000000 --- a/project.private.config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "setting": { - "urlCheck": false - }, - "condition": { - "miniprogram": { - "list": [ - { - "name": "movie", - "pathName": "pages/school/movie", - "query": "", - "launchMode": "default", - "scene": null - } - ] - } - }, - "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", - "libVersion": "2.33.0" -} \ No newline at end of file diff --git a/sitemap.json b/sitemap.json index ca02add..90d6e2d 100644 --- a/sitemap.json +++ b/sitemap.json @@ -1,7 +1,20 @@ { - "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", - "rules": [{ - "action": "allow", - "page": "*" - }] + "rules": [ + { + "action": "disallow", + "page": "pages/index/vcode" + },{ + "action": "disallow", + "page": "pages/welcome/welcome" + },{ + "action": "disallow", + "page": "pages/error/queryerror" + },{ + "action": "disallow", + "page": "pages/net/netfare" + },{ + "action": "disallow", + "page": "pages/net/netBind" + }, + ] } \ No newline at end of file diff --git a/sitemap33.json b/sitemap33.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/sitemap33.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/utils/amap-wx.js b/utils/amap-wx.js index fd84434..eb969c3 100644 --- a/utils/amap-wx.js +++ b/utils/amap-wx.js @@ -1 +1 @@ -function AMapWX(a){this.key=a.key,this.requestConfig={key:a.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"}}AMapWX.prototype.getWxLocation=function(a,b){wx.getLocation({type:"gcj02",success:function(a){var c=a.longitude+","+a.latitude;wx.setStorage({key:"userLocation",data:c}),b(c)},fail:function(c){wx.getStorage({key:"userLocation",success:function(a){a.data&&b(a.data)}}),a.fail({errCode:"0",errMsg:c.errMsg||""})}})},AMapWX.prototype.getRegeo=function(a){function c(c){var d=b.requestConfig;wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:b.key,location:c,extensions:"all",s:d.s,platform:d.platform,appname:b.key,sdkversion:d.sdkversion,logversion:d.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){var d,e,f,g,h,i,j,k,l;b.data.status&&"1"==b.data.status?(d=b.data.regeocode,e=d.addressComponent,f=[],g="",d&&d.roads[0]&&d.roads[0].name&&(g=d.roads[0].name+"附近"),h=c.split(",")[0],i=c.split(",")[1],d.pois&&d.pois[0]&&(g=d.pois[0].name+"附近",j=d.pois[0].location,j&&(h=parseFloat(j.split(",")[0]),i=parseFloat(j.split(",")[1]))),e.provice&&f.push(e.provice),e.city&&f.push(e.city),e.district&&f.push(e.district),e.streetNumber&&e.streetNumber.street&&e.streetNumber.number?(f.push(e.streetNumber.street),f.push(e.streetNumber.number)):(k="",d&&d.roads[0]&&d.roads[0].name&&(k=d.roads[0].name),f.push(k)),f=f.join(""),l=[{iconPath:a.iconPath,width:a.iconWidth,height:a.iconHeight,name:f,desc:g,longitude:h,latitude:i,id:0,regeocodeData:d}],a.success(l)):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}var b=this;a.location?c(a.location):b.getWxLocation(a,function(a){c(a)})},AMapWX.prototype.getWeather=function(a){function d(d){var e="base";a.type&&"forecast"==a.type&&(e="all"),wx.request({url:"https://restapi.amap.com/v3/weather/weatherInfo",data:{key:b.key,city:d,extensions:e,s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){function c(a){var b={city:{text:"城市",data:a.city},weather:{text:"天气",data:a.weather},temperature:{text:"温度",data:a.temperature},winddirection:{text:"风向",data:a.winddirection+"风"},windpower:{text:"风力",data:a.windpower+"级"},humidity:{text:"湿度",data:a.humidity+"%"}};return b}var d,e;b.data.status&&"1"==b.data.status?b.data.lives?(d=b.data.lives,d&&d.length>0&&(d=d[0],e=c(d),e["liveData"]=d,a.success(e))):b.data.forecasts&&b.data.forecasts[0]&&a.success({forecast:b.data.forecasts[0]}):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}function e(e){wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:b.key,location:e,extensions:"all",s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){var c,e;b.data.status&&"1"==b.data.status?(e=b.data.regeocode,e.addressComponent?c=e.addressComponent.adcode:e.aois&&e.aois.length>0&&(c=e.aois[0].adcode),d(c)):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}var b=this,c=b.requestConfig;a.city?d(a.city):b.getWxLocation(a,function(a){e(a)})},AMapWX.prototype.getPoiAround=function(a){function d(d){var e={key:b.key,location:d,s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion};a.querytypes&&(e["types"]=a.querytypes),a.querykeywords&&(e["keywords"]=a.querykeywords),wx.request({url:"https://restapi.amap.com/v3/place/around",data:e,method:"GET",header:{"content-type":"application/json"},success:function(b){var c,d,e,f;if(b.data.status&&"1"==b.data.status){if(b=b.data,b&&b.pois){for(c=[],d=0;d0&&(d=d[0],e=c(d),e["liveData"]=d,a.success(e))):b.data.forecasts&&b.data.forecasts[0]&&a.success({forecast:b.data.forecasts[0]}):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}function e(e){wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:b.key,location:e,extensions:"all",s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion},method:"GET",header:{"content-type":"application/json"},success:function(b){var c,e;b.data.status&&"1"==b.data.status?(e=b.data.regeocode,e.addressComponent?c=e.addressComponent.adcode:e.aois&&e.aois.length>0&&(c=e.aois[0].adcode),d(c)):a.fail({errCode:b.data.infocode,errMsg:b.data.info})},fail:function(b){a.fail({errCode:"0",errMsg:b.errMsg||""})}})}var b=this,c=b.requestConfig;a.city?d(a.city):b.getWxLocation(a,function(a){e(a)})},AMapWX.prototype.getPoiAround=function(a){function d(d){var e={key:b.key,location:d,s:c.s,platform:c.platform,appname:b.key,sdkversion:c.sdkversion,logversion:c.logversion};a.querytypes&&(e["types"]=a.querytypes),a.querykeywords&&(e["keywords"]=a.querykeywords),wx.request({url:"https://restapi.amap.com/v3/place/around",data:e,method:"GET",header:{"content-type":"application/json"},success:function(b){var c,d,e,f;if(b.data.status&&"1"==b.data.status){if(b=b.data,b&&b.pois){for(c=[],d=0;d127){(t=encodeURI(n.charAt(c)).split("%")).shift();for(var d,s=c%1;d=t[0|s];s+=.75)f=f<<8|parseInt(d,16),a+=i.charAt(63&f>>8-s%1*8);c=.75===c?0:c,c+=.75*t.length%1}else f=f<<8|r,a+=i.charAt(63&f>>8-c%1*8);return a}function t(e){var r,t=String(e),n=o.slice(0,-1),i=[6,4,2,0],f="",a=0,c=0,d="";try{for(var s=0;(r=n.indexOf(t[s]))>-1;s++)a=a<<6|r,s%4&&(c=255&a>>i[s%4],c<128?(f+=d?decodeURI(d):"",f+=String.fromCharCode(c),d=""):d+="%"+("0"+c.toString(16)).slice(-2));return f+=d?decodeURI(d):""}catch(e){throw new Error("base64 malformed!")}}var o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",n={encode:r,decode:t};if("function"==typeof define&&define.amd)define(function(){return n});else if("object"==typeof exports)for(var i in n)n.hasOwnProperty(i)&&(exports[i]=n[i]);else e.base64=n}("object"==typeof global&&global||this); \ No newline at end of file diff --git a/utils/calendar/core.js b/utils/calendar/core.js deleted file mode 100644 index d71c4e4..0000000 --- a/utils/calendar/core.js +++ /dev/null @@ -1,144 +0,0 @@ -import { dateUtil, getCalendarConfig } from './utils/index' - -/** - * 计算当前月份前后两月应占的格子 - * @param {number} year 年份 - * @param {number} month 月份 - */ -function calculateEmptyGrids(year, month, config) { - const prevMonthGrids = calculatePrevMonthGrids(year, month, config) - const nextMonthGrids = calculateNextMonthGrids(year, month, config) - return { - prevMonthGrids, - nextMonthGrids - } -} - -/** - * 计算上月应占的格子 - * @param {number} year 年份 - * @param {number} month 月份 - */ -function calculatePrevMonthGrids(year, month, config) { - let emptyGrids = [] - const prevMonthDays = dateUtil.getDatesCountOfMonth(year, month - 1) - let firstDayOfWeek = dateUtil.firstDayOfWeek(year, month) - if (config.firstDayOfWeek === 'Mon') { - if (firstDayOfWeek === 0) { - firstDayOfWeek = 6 - } else { - firstDayOfWeek -= 1 - } - } - if (firstDayOfWeek > 0) { - const len = prevMonthDays - firstDayOfWeek - const { onlyShowCurrentMonth } = config - const YMInfo = dateUtil.getPrevMonthInfo({ year, month }) - for (let i = prevMonthDays; i > len; i--) { - if (onlyShowCurrentMonth) { - emptyGrids.push('') - } else { - const week = dateUtil.getDayOfWeek(+year, +month, i) - emptyGrids.push({ - ...YMInfo, - date: i, - week - }) - } - } - emptyGrids.reverse() - } - return emptyGrids -} -/** - * 计算下一月日期是否需要多展示的日期 - * 某些月份日期为5排,某些月份6排,统一为6排 - * @param {number} year - * @param {number} month - * @param {object} config - */ -function calculateExtraEmptyDate(year, month, config) { - let extDate = 0 - if (+month === 2) { - extDate += 7 - let firstDayofMonth = dateUtil.getDayOfWeek(year, month, 1) - if (config.firstDayOfWeek === 'Mon') { - if (+firstDayofMonth === 1) extDate += 7 - } else { - if (+firstDayofMonth === 0) extDate += 7 - } - } else { - let firstDayofMonth = dateUtil.getDayOfWeek(year, month, 1) - if (config.firstDayOfWeek === 'Mon') { - if (firstDayofMonth !== 0 && firstDayofMonth < 6) { - extDate += 7 - } - } else { - if (firstDayofMonth <= 5) { - extDate += 7 - } - } - } - return extDate -} -/** - * 计算下月应占的格子 - * @param {number} year 年份 - * @param {number} month 月份 - */ -function calculateNextMonthGrids(year, month, config) { - let emptyGrids = [] - const datesCount = dateUtil.getDatesCountOfMonth(year, month) - let lastDayWeek = dateUtil.getDayOfWeek(year, month, datesCount) - if (config.firstDayOfWeek === 'Mon') { - if (lastDayWeek === 0) { - lastDayWeek = 6 - } else { - lastDayWeek -= 1 - } - } - let len = 7 - (lastDayWeek + 1) - const { onlyShowCurrentMonth } = config - if (!onlyShowCurrentMonth) { - len = len + calculateExtraEmptyDate(year, month, config) - } - const YMInfo = dateUtil.getNextMonthInfo({ year, month }) - for (let i = 1; i <= len; i++) { - const week = dateUtil.getDayOfWeek(+year, +month, i) - if (onlyShowCurrentMonth) { - emptyGrids.push('') - } else { - emptyGrids.push({ - id: i - 1, - ...YMInfo, - date: i, - week: week || 7 - }) - } - } - return emptyGrids -} -/** - * 设置日历面板数据 - * @param {number} year 年份 - * @param {number} month 月份 - * @param {number} curDate 日期 - */ -function calculateCurrentMonthDates(year, month) { - return dateUtil.calcDates(year, month) -} - -export function calcJumpData({ dateInfo, config, component }) { - dateInfo = dateInfo || dateUtil.todayFMD() - const { year, month, date } = dateInfo - const calendarConfig = config || getCalendarConfig(component) - const emptyGrids = calculateEmptyGrids(year, month, calendarConfig) - const calendar = { - curYear: year, - curMonth: month, - curDate: date, - dates: calculateCurrentMonthDates(year, month), - ...emptyGrids - } - return calendar -} diff --git a/utils/calendar/helper.js b/utils/calendar/helper.js deleted file mode 100644 index 981c452..0000000 --- a/utils/calendar/helper.js +++ /dev/null @@ -1,12 +0,0 @@ -import { dateUtil } from './utils/index' - -export function calcTargetYMInfo() { - return { - right: dateUtil.getPrevMonthInfo, - left: dateUtil.getNextMonthInfo, - prev_month: dateUtil.getPrevMonthInfo, - next_month: dateUtil.getNextMonthInfo, - prev_year: dateUtil.getPrevYearInfo, - next_year: dateUtil.getNextYearInfo - } -} diff --git a/utils/calendar/index.js b/utils/calendar/index.js deleted file mode 100644 index 269a660..0000000 --- a/utils/calendar/index.js +++ /dev/null @@ -1,257 +0,0 @@ -import plugins from './plugins/index' -import { calcJumpData } from './core' -import { renderCalendar } from './render' -import { calcTargetYMInfo } from './helper' -import { dateUtil, calendarGesture, logger } from './utils/index' - -Component({ - options: { - styleIsolation: 'apply-shared', - multipleSlots: true // 在组件定义时的选项中启用多slot支持 - }, - properties: { - config: { - type: Object, - value: {} - } - }, - lifetimes: { - attached: function() { - this.initComp() - } - }, - methods: { - initComp() { - const calendarConfig = this.setDefaultDisableDate() - this.setConfig(calendarConfig) - }, - // 禁用某天日期配置默认为今天 - setDefaultDisableDate() { - const calendarConfig = this.properties.config || {} - if (calendarConfig.disableMode && !calendarConfig.disableMode.date) { - calendarConfig.disableMode.date = dateUtil.toTimeStr( - dateUtil.todayFMD() - ) - } - return calendarConfig - }, - initCalendar(config) { - const { defaultDate } = config - let date = dateUtil.todayFMD() - if (defaultDate && typeof defaultDate === 'string') { - const dateInfo = defaultDate.split('-') - if (dateInfo.length < 3) { - return logger.warn('defaultDate配置格式应为: 2018-4-2 或 2018-04-02') - } else { - date = { - year: +dateInfo[0], - month: +dateInfo[1], - date: +dateInfo[2] - } - } - } - const waitRenderData = calcJumpData({ - dateInfo: date, - config - }) - const timestamp = dateUtil.todayTimestamp() - if (config.autoChoosedWhenJump) { - const target = waitRenderData.dates.filter( - item => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(date) - ) - if (target && target.length) { - if (!waitRenderData.selectedDates) { - waitRenderData.selectedDates = target - } else { - waitRenderData.selectedDates.push(target[0]) - } - } - } - return { - ...waitRenderData, - todayTimestamp: timestamp, - weeksCh: dateUtil.getWeekHeader(config.firstDayOfWeek) - } - }, - setConfig(config) { - if (config.markToday && typeof config.markToday === 'string') { - config.highlightToday = true - } - config.theme = config.theme || 'default' - this.setData( - { - config - }, - () => { - for (let plugin of plugins.installed) { - const [, p] = plugin - if (typeof p.install === 'function') { - p.install(this) - } - if (typeof p.methods === 'function') { - const methods = p.methods(this) - for (let fnName in methods) { - if (fnName.startsWith('__')) continue - const fn = methods[fnName] - if (typeof fn === 'function') { - if (!this.calendar) this.calendar = {} - this.calendar[fnName] = fn - } - } - } - } - const initData = this.initCalendar(config) - renderCalendar.call(this, initData, config) - } - ) - }, - tapDate(e) { - const { info } = e.currentTarget.dataset - const { date, disable } = info || {} - if (disable || !date) return - const { calendar, config } = this.data - let calendarData = calendar - let calendarConfig = config - if (config.takeoverTap) { - return this.triggerEvent('takeoverTap', info) - } - for (let plugin of plugins.installed) { - const [, p] = plugin - if (typeof p.onTapDate === 'function') { - const { - calendarData: __calendarData, - calendarConfig: __calendarConfig - } = p.onTapDate(info, calendarData, calendarConfig) - calendarData = __calendarData - calendarConfig = __calendarConfig - } - } - renderCalendar.call(this, calendarData, calendarConfig).then(() => { - this.triggerEvent('afterTapDate', info) - }) - }, - /** - * 日历滑动开始 - * @param {object} e - */ - calendarTouchstart(e) { - const t = e.touches[0] - const startX = t.clientX - const startY = t.clientY - this.swipeLock = true - this.setData({ - 'gesture.startX': startX, - 'gesture.startY': startY - }) - }, - /** - * 日历滑动中 - * @param {object} e - */ - calendarTouchmove(e) { - const { gesture } = this.data - const { preventSwipe } = this.properties.config - if (!this.swipeLock || preventSwipe) return - if (calendarGesture.isLeft(gesture, e.touches[0])) { - this.handleSwipe('left') - this.swipeLock = false - } - if (calendarGesture.isRight(gesture, e.touches[0])) { - this.handleSwipe('right') - this.swipeLock = false - } - }, - calendarTouchend(e) { - this.setData({ - 'calendar.leftSwipe': 0, - 'calendar.rightSwipe': 0 - }) - }, - handleSwipe(direction) { - let swipeKey = 'calendar.leftSwipe' - if (direction === 'right') { - swipeKey = 'calendar.rightSwipe' - } - this.setData({ - [swipeKey]: 1 - }) - const { calendar } = this.data - let calendarData = calendar - const { curYear, curMonth } = calendarData - const getMonthInfo = calcTargetYMInfo()[direction] - const target = getMonthInfo({ - year: +curYear, - month: +curMonth - }) - target.direction = direction - this.renderCalendar(target) - }, - changeDate(e) { - const { type } = e.currentTarget.dataset - const { calendar: calendarData } = this.data - const { curYear, curMonth } = calendarData - const getMonthInfo = calcTargetYMInfo()[type] - const target = getMonthInfo({ - year: +curYear, - month: +curMonth - }) - target.direction = type - this.renderCalendar(target) - }, - renderCalendar(target) { - let { calendar: calendarData, config } = this.data - const { curYear, curMonth } = calendarData || {} - for (let plugin of plugins.installed) { - const [, p] = plugin - if (typeof p.onSwitchCalendar === 'function') { - calendarData = p.onSwitchCalendar(target, calendarData, this) - } - } - return renderCalendar.call(this, calendarData, config).then(() => { - let triggerEventName = 'whenChangeMonth' - if (config.weekMode) { - triggerEventName = 'whenChangeWeek' - } - this.triggerEvent(triggerEventName, { - current: { - year: +curYear, - month: +curMonth - }, - next: target - }) - this.triggerEvent('onSwipe', { - current: { - year: +curYear, - month: +curMonth - }, - next: target, - type: triggerEventName - }) - }) - }, - doubleClickJumpToToday() { - const { multi, weekMode } = this.calendar.getCalendarConfig() || {} - if (multi || weekMode) return - if (this.count === undefined) { - this.count = 1 - } else { - this.count += 1 - } - if (this.lastClick) { - const difference = new Date().getTime() - this.lastClick - if ( - difference < 500 && - this.count >= 2 && - typeof this.calendar.jump === 'function' - ) { - const today = dateUtil.todayFMD() - this.calendar.jump(today) - } - this.count = undefined - this.lastClick = undefined - } else { - this.lastClick = new Date().getTime() - } - } - } -}) diff --git a/utils/calendar/index.json b/utils/calendar/index.json deleted file mode 100644 index 32640e0..0000000 --- a/utils/calendar/index.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "component": true -} \ No newline at end of file diff --git a/utils/calendar/index.wxml b/utils/calendar/index.wxml deleted file mode 100644 index 7a6bd7f..0000000 --- a/utils/calendar/index.wxml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - {{calendar.curYear || "--"}} 年 {{calendar.curMonth || "--"}} 月 - - - - - - - - {{item}} - - - - - - - - {{item.date}} - - - - - - - - {{config.markToday && item.isToday ? config.markToday : item.date}} - - {{item.label || item.lunar.Term || item.lunar.IDayCn}} - - - {{item.todoText}} - - - - - - - - - {{item.date}} - - - - - - diff --git a/utils/calendar/index.wxss b/utils/calendar/index.wxss deleted file mode 100644 index 61b6f2c..0000000 --- a/utils/calendar/index.wxss +++ /dev/null @@ -1,213 +0,0 @@ -@import './theme/iconfont.wxss'; -@import './theme/theme-default.wxss'; - -.b { - display: flex; -} - -.lr { - flex-direction: row; -} - -.tb { - flex-direction: column; -} - -.pc { - justify-content: center; -} - -.ac { - align-items: center; -} - -.cc { - align-items: center; - justify-content: center; -} - -.wrap { - flex-wrap: wrap; -} - -.flex { - flex-grow: 1; -} - -.bg { - background-image: linear-gradient(to bottom, #faefe7, #ffcbd7); - overflow: hidden; -} - -.white-color { - color: #fff; -} - -.fs24 { - font-size: 24rpx; -} - -.fs28 { - font-size: 28rpx; -} - -.fs32 { - font-size: 32rpx; -} - -.fs36 { - font-size: 36rpx; -} - -.calendar { - width: 100%; - box-sizing: border-box; -} - -/* 日历操作栏 */ - -.handle { - height: 80rpx; -} - -.prev-handle, -.next-handle { - padding: 20rpx; -} - -.date-in-handle { - height: 80rpx; -} - -/* 星期栏 */ - -.weeks { - height: 50rpx; - line-height: 50rpx; - opacity: 0.5; -} - -.week { - text-align: center; -} - -.grid, -.week { - width: 14.286014285714286%; -} - -.date-wrap { - width: 100%; - height: 80rpx; - position: relative; - left: 0; - top: 0; -} - -.date { - position: relative; - left: 0; - top: 0; - width: 55rpx; - height: 55rpx; - text-align: center; - line-height: 55rpx; - font-size: 26rpx; - font-weight: 350; - border-radius: 50%; - transition: all 0.3s; - animation-name: choosed; - animation-duration: 0.5s; - animation-timing-function: linear; - animation-iteration-count: 1; -} - -.date-area-mode { - width: 100%; - border-radius: 0; -} - -.date-desc { - width: 150%; - height: 32rpx; - font-size: 20rpx; - line-height: 32rpx; - position: absolute; - left: 50%; - transform: translateX(-50%); - overflow: hidden; - word-break: break-all; - text-overflow: ellipsis; - white-space: nowrap; - -webkit-line-clamp: 1; - text-align: center; -} - -@keyframes choosed { - from { - transform: scale(1); - } - - 50% { - transform: scale(0.9); - } - - to { - transform: scale(1); - } -} - -/* 日期圆圈标记 */ -.todo-circle { - border-width: 1rpx; - border-style: solid; - box-sizing: border-box; -} - -/* 待办点标记相关样式 */ -.todo-dot { - width: 10rpx; - height: 10rpx; - border-radius: 50%; - position: absolute; - left: 50%; - transform: translateX(-50%); -} - -.todo-dot-top { - top: 3rpx; -} - -.todo-dot.todo-dot-top-always { - top: -8rpx; -} - -.todo-dot.todo-dot-bottom { - bottom: 0; -} - -.todo-dot.todo-dot-bottom-always { - bottom: -10rpx; -} - -/* 日期描述文字(待办文字/农历)相关样式 */ - -.date-desc.date-desc-top { - top: -6rpx; -} - -.date-desc.date-desc-top-always { - top: -20rpx; -} - -.date-desc.date-desc-bottom { - bottom: -14rpx; -} - -.todo-circle .date-desc.date-desc-bottom { - bottom: -30rpx; -} - -.date-desc.date-desc-bottom-always { - bottom: -28rpx; -} diff --git a/utils/calendar/plugins/holidays/holidays-map.js b/utils/calendar/plugins/holidays/holidays-map.js deleted file mode 100644 index 0bc5e04..0000000 --- a/utils/calendar/plugins/holidays/holidays-map.js +++ /dev/null @@ -1,212 +0,0 @@ -/* * - @Author: drfu* - @Description: 数据来源于国务院办公厅关于2020年部分节假日安排的通知(国办发明电〔2019〕16号)_政府信息公开专栏,http://www.gov.cn/zhengce/content/2019-11/21/content_5454164.htm - @Date: 2020-10-12 14:29:45* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-16 17:38:08 -*/ - -// 节日列表 -export const festival = { - // 农历固定日期节日 - lunar: { - 1: { - 1: { - type: 'festival', - name: '春节', - label: '春节' - }, - 8: { - type: 'festival', - name: '腊八节', - label: '腊八' - }, - 15: { - type: 'festival', - name: '元宵节', - label: '元宵' - } - }, - 7: { - 7: { - type: 'festival', - name: '七夕节', - label: '七夕' - }, - 15: { - type: 'festival', - name: '中元节', - label: '中元节' - } - }, - 9: { - 9: { - type: 'festival', - name: '重阳节', - label: '重阳节' - } - } - }, - // 阳历固定日期节日 - solar: { - 2: { - 14: { - type: 'festival', - name: '情人节', - label: '情人节' - } - }, - 3: { - 12: { - type: 'festival', - name: '植树节', - label: '植树节' - } - }, - 4: { - 1: { - type: 'festival', - name: '愚人节', - label: '愚人节' - }, - 5: { - type: 'festival', - name: '清明节', - label: '清明节' - } - }, - 5: { - 1: { - type: 'festival', - name: '劳动节', - label: '劳动节' - } - }, - 6: { - 1: { - type: 'festival', - name: '儿童节', - label: '儿童节' - } - }, - 7: { - 1: { - type: 'festival', - name: '建党节', - label: '建党节' - } - }, - 8: { - 1: { - type: 'festival', - name: '建军节', - label: '建军节' - } - }, - 9: { - 10: { - type: 'festival', - name: '教师节', - label: '教师节' - } - }, - 10: { - 1: { - type: 'festival', - name: '国庆节', - label: '国庆节' - } - }, - 12: { - 25: { - type: 'festival', - name: '圣诞节', - label: '圣诞节' - } - } - } -} - -export const holidays = { - 2020: { - 1: { - 1: { - type: 'holiday', - name: '元旦', - label: '休' - }, - 19: { - type: 'work', - name: '调班', - label: '班' - }, - '24-30': { - type: 'holiday', - name: '春节', - label: '休' - } - }, - 2: { - 1: { - type: 'work', - name: '调班', - label: '班' - } - }, - 4: { - '4-6': { - type: 'holiday', - name: '清明节', - label: '休' - }, - 26: { - type: 'work', - name: '调班', - label: '班' - } - }, - 5: { - '1-5': { - type: 'holiday', - name: '劳动节', - label: '休' - }, - 9: { - type: 'work', - name: '调班', - label: '班' - } - }, - 6: { - '25-27': { - type: 'holiday', - name: '端午节', - label: '休' - }, - 28: { - type: 'work', - name: '调班', - label: '班' - } - }, - 9: { - 27: { - type: 'work', - name: '调班', - label: '班' - } - }, - 10: { - '1-8': { - type: 'holiday', - name: '国庆节/中秋节', - label: '休' - }, - 10: { - type: 'work', - name: '调班', - label: '班' - } - } - } -} diff --git a/utils/calendar/plugins/holidays/index.js b/utils/calendar/plugins/holidays/index.js deleted file mode 100644 index ee4ae77..0000000 --- a/utils/calendar/plugins/holidays/index.js +++ /dev/null @@ -1,201 +0,0 @@ -/* * - @Author: drfu* - @Description: 显示法定节假日班/休情况 - @Date: 2020-10-12 14:29:45* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-16 17:34:13 -*/ - -import { holidays, festival } from './holidays-map' -import { dateUtil, getCalendarData, logger } from '../../utils/index' - -/** - * 当前是否在休假期内 - * @param {object} { year, month } - * @param {object} { start, end, current } - * @returns - */ -function inHolidays({ year, month }, { start, end, current }) { - const getTimeStamp = dateUtil.getTimeStamp - const startTimestamp = getTimeStamp({ - year, - month, - date: start - }) - const endTimestamp = getTimeStamp({ - year, - month, - date: end - }) - const currentDateTimestamp = getTimeStamp({ - year, - month, - date: current - }) - if ( - currentDateTimestamp >= startTimestamp && - currentDateTimestamp <= endTimestamp - ) { - return true - } - return false -} - -function addSpecialFestival(date, component) { - const { convertlLunar2Solar, convertSolarLunar } = component.calendar || {} - const lunarDateInfo = convertSolarLunar(date) - const { lYear, lMonth } = lunarDateInfo || {} - // 春节 - const info = { - type: 'festival', - name: '除夕', - label: '除夕' - } - if (lMonth === 12) { - if (!festival.lunar['12']) festival.lunar['12'] = {} - if (convertlLunar2Solar(`${lYear}-12-30`) === -1) { - festival.lunar['12']['29'] = info - } else { - festival.lunar['12']['30'] = info - } - } -} - -/** - * 是否匹配到节日 - * @param {object} [dateInfo={}] - * @param {object} [component={}] - * @returns {object|boolean} 匹配到的节日数据或者false - */ -function hasFestivalDate(dateInfo = {}, component = {}) { - const { month, date } = dateInfo - let festivalDate = festival.solar[month] && festival.solar[month][date] - if (!festivalDate) { - const { convertSolarLunar } = component.calendar || {} - const lunarDateInfo = convertSolarLunar(dateInfo) - const { lMonth, lDay } = lunarDateInfo - festivalDate = festival.lunar[lMonth] && festival.lunar[lMonth][lDay] - if (!festivalDate) { - const festivalOfMonth = festival.lunar[lMonth] || {} - const festivalDateKey = Object.keys(festivalOfMonth).find(item => - item.match(new RegExp(`\\b${lDay}\\b`)) - ) - if (!festivalDateKey) { - festivalDate = false - } else { - const festivalInfo = festival.lunar[lMonth][festivalDateKey] - if (!festivalInfo) { - festivalDate = false - } else { - const { condition } = festivalInfo - if (typeof condition === 'function') { - festivalDate = condition(lunarDateInfo) - } else { - festivalDate = false - } - } - } - } - } - return festivalDate -} - -export default () => { - return { - name: 'holidays', - beforeRender(calendarData = {}, calendarConfig = {}, component) { - let { dates = [] } = calendarData - if (calendarConfig.showHolidays || calendarConfig.showFestival) { - dates = dates.map(d => { - let item = { ...d } - const { year, month, date } = item - const holidaysOfMonth = - (holidays[year] && holidays[year][month]) || {} - const holidayDate = holidaysOfMonth[date] - if (holidayDate) { - item = { - ...item, - ...holidayDate - } - } else { - const holidayKeys = Object.keys(holidaysOfMonth).filter(item => - item.includes('-') - ) - let target = '' - for (let v of holidayKeys) { - const [start, end] = v.split('-') - if (+d.date >= +start && +d.date <= +end) { - target = v - break - } - } - const [start, end] = target.split('-') - const isInHolidays = inHolidays( - { - year, - month - }, - { - start, - end, - current: date - } - ) - if (isInHolidays) { - item = { - ...item, - ...holidaysOfMonth[target] - } - } else if (calendarConfig.showFestival) { - const { convertSolarLunar, convertlLunar2Solar } = - component.calendar || {} - if ( - typeof convertSolarLunar !== 'function' || - typeof convertlLunar2Solar !== 'function' - ) { - return logger.warn( - '农历节日显示需要引入农历插件(/component/v2/plugins/solarLunar)' - ) - } - addSpecialFestival(item, component) - const festivalDate = hasFestivalDate(item, component) - if (festivalDate) { - item = { - ...item, - ...festivalDate - } - } - } - } - return item - }) - } - return { - calendarData: { - ...calendarData, - dates: dates - }, - calendarConfig - } - }, - methods(component) { - return { - getHolidaysOfCurrentYear() { - const calendar = getCalendarData('calendar', component) - const { curYear } = calendar - return this.methods(component).getHolidaysOfYear(curYear) - }, - getHolidaysOfYear(year) { - if (!year) return logger.warn('getHolidaysOfCurrentYear() 入参错误') - if (!holidays[year]) { - logger.warn('未匹配到当前年份节假日信息,请自行补充') - return { - err: 'not match' - } - } - return holidays[year] - } - } - } - } -} diff --git a/utils/calendar/plugins/index.js b/utils/calendar/plugins/index.js deleted file mode 100644 index 238425d..0000000 --- a/utils/calendar/plugins/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import preset from './preset/index' - -export default { - installed: [...preset], - use(plugin) { - if (typeof plugin !== 'function') return - const info = plugin() || {} - const { name } = info - if ( - name && - name !== 'methods' && - !this.installed.some(p => p[0] === name) - ) { - this.installed.unshift([name, info]) - } - return this - } -} diff --git a/utils/calendar/plugins/preset/base.js b/utils/calendar/plugins/preset/base.js deleted file mode 100644 index 4da26b4..0000000 --- a/utils/calendar/plugins/preset/base.js +++ /dev/null @@ -1,277 +0,0 @@ -/** - * @Author: drfu* - * @Description: 基础功能 - * @Date: 2020-10-08 21:22:09* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-11 13:28:52 - * */ - -import { calcJumpData } from '../../core' -import { renderCalendar } from '../../render' -import { - dateUtil, - getCalendarData, - setCalendarData, - getCalendarConfig -} from '../../utils/index' - -export default () => { - return { - name: 'base', - beforeRender(calendarData = {}, calendarConfig) { - const calendar = calendarData - const { selectedDates = [], dates } = calendar - let _dates = [...dates] - if (selectedDates.length) { - const selectedDatesStr = selectedDates.map(date => - dateUtil.toTimeStr(date) - ) - _dates.forEach(date => { - const dateStr = dateUtil.toTimeStr(date) - if (selectedDatesStr.includes(dateStr)) { - date.choosed = true - } - }) - } - return { - calendarData: { - ...calendarData, - dates: _dates - }, - calendarConfig - } - }, - onTapDate(tapedDate, calendarData = {}, calendarConfig = {}) { - const calendar = { - ...calendarData - } - const dateIndex = dateUtil.findDateIndexInArray( - tapedDate, - calendarData.dates - ) - const { multi, inverse } = calendarConfig - let dates = [...calendar.dates] - const { selectedDates = [] } = calendar - if (!multi) { - let preSelectedDate = {} - if (selectedDates.length) { - preSelectedDate = [...selectedDates].pop() || {} - } - const timeStr = dateUtil.toTimeStr - if (!inverse && timeStr(preSelectedDate) === timeStr(tapedDate)) { - return calendar - } - let _tapedDate = { ...tapedDate, choosed: !tapedDate.choosed } - - dates[dateIndex] = _tapedDate - if (preSelectedDate.date) { - const idx = dateUtil.findDateIndexInArray(preSelectedDate, dates) - const date = dates[idx] - if (date) { - date.choosed = false - } - } - if (dates[dateIndex].choosed) { - calendar.selectedDates = [dates[dateIndex]] - } else { - calendar.selectedDates = [] - } - } else { - dates[dateIndex] = { - ...dates[dateIndex], - choosed: !dates[dateIndex].choosed - } - if (!calendar.selectedDates) { - calendar.selectedDates = [] - } - if (dates[dateIndex].choosed) { - calendar.selectedDates.push(dates[dateIndex]) - } else { - calendar.selectedDates = calendar.selectedDates.filter( - date => - dateUtil.toTimeStr(date) !== dateUtil.toTimeStr(dates[dateIndex]) - ) - } - } - return { - calendarData: { - ...calendar, - dates - }, - calendarConfig - } - }, - onSwitchCalendar(date, calendarData = {}, component) { - const calendarConfig = getCalendarConfig(component) - if (calendarConfig.weekMode) { - return calendarData - } - const updatedRenderData = calcJumpData({ - dateInfo: date, - config: calendarConfig - }) - return { - ...calendarData, - ...updatedRenderData - } - }, - methods(component) { - return { - jump: dateInfo => { - if (Object.prototype.toString.call(dateInfo) !== '[object Object]') - return - const updatedRenderData = calcJumpData({ - dateInfo, - component - }) - const existCalendarData = getCalendarData('calendar', component) - const config = getCalendarConfig(component) - if (config.autoChoosedWhenJump) { - const target = updatedRenderData.dates[dateInfo.date - 1] - if (!updatedRenderData.selectedDates) { - updatedRenderData.selectedDates = [target] - } else { - updatedRenderData.selectedDates.push(target) - } - } - return renderCalendar.call(component, { - ...existCalendarData, - ...updatedRenderData - }) - }, - getCalendarConfig() { - return getCalendarConfig(component) - }, - setCalendarConfig(config) { - return new Promise((resolve, reject) => { - if (!component || !component.data.config) { - reject('异常:未找到组件配置信息') - return - } - let conf = { ...component.data.config, ...config } - component.data.config = conf - setCalendarData({ config: conf }, component) - .then(resolve) - .catch(reject) - }) - }, - cancelSelectedDates(cancelDates = []) { - const existCalendarData = getCalendarData('calendar', component) || {} - const { dates = [], selectedDates = [] } = existCalendarData - let updatedRenderData = {} - const config = getCalendarConfig(component) - let chooseAreaData = {} - if (config.chooseAreaMode) { - chooseAreaData = { - chooseAreaTimestamp: [], - tempChooseAreaTimestamp: [] - } - } - if (!cancelDates.length) { - dates.forEach(item => { - item.choosed = false - }) - updatedRenderData = { - dates, - selectedDates: [] - } - } else { - const cancelDatesStr = cancelDates.map(date => - dateUtil.toTimeStr(date) - ) - const filterSelectedDates = selectedDates.filter( - date => !cancelDatesStr.includes(dateUtil.toTimeStr(date)) - ) - dates.forEach(date => { - if (cancelDatesStr.includes(dateUtil.toTimeStr(date))) { - date.choosed = false - } - }) - updatedRenderData = { - dates, - selectedDates: filterSelectedDates - } - } - - return renderCalendar.call(component, { - ...existCalendarData, - ...updatedRenderData, - ...chooseAreaData - }) - }, - setSelectedDates: targetDates => { - const existCalendarData = getCalendarData('calendar', component) - let { dates, selectedDates = [] } = existCalendarData || {} - let __selectedDates = [] - let __dates = dates - if (!targetDates) { - __dates = dates.map(item => { - const date = { ...item } - date.choosed = true - if (existCalendarData.showLabelAlways && date.showTodoLabel) { - date.showTodoLabel = true - } else { - date.showTodoLabel = false - } - return date - }) - __selectedDates = dates - } else if (targetDates && targetDates.length) { - const allSelected = dateUtil.uniqueArrayByDate( - selectedDates.concat(targetDates) - ) - const allSelectedDateStr = allSelected.map(d => - dateUtil.toTimeStr(d) - ) - __dates = dates.map(item => { - const date = { ...item } - if (allSelectedDateStr.includes(dateUtil.toTimeStr(date))) { - date.choosed = true - __selectedDates.push(date) - } - if (existCalendarData.showLabelAlways && date.showTodoLabel) { - date.showTodoLabel = true - } else { - date.showTodoLabel = false - } - return date - }) - } - return renderCalendar.call(component, { - ...existCalendarData, - dates: __dates, - selectedDates: __selectedDates - }) - }, - setDateStyle: toSetDates => { - if (!Array.isArray(toSetDates)) return Promise.reject() - const existCalendarData = getCalendarData('calendar', component) - const { dates = [], specialStyleDates } = existCalendarData || {} - if (Array.isArray(specialStyleDates)) { - toSetDates = dateUtil.uniqueArrayByDate([ - ...specialStyleDates, - ...toSetDates - ]) - } - const toSetDatesStr = toSetDates.map(item => dateUtil.toTimeStr(item)) - const _dates = dates.map(item => { - const idx = toSetDatesStr.indexOf(dateUtil.toTimeStr(item)) - if (idx > -1) { - return { - ...item, - class: toSetDates[idx].class - } - } else { - return item - } - }) - return renderCalendar.call(component, { - ...existCalendarData, - dates: _dates, - specialStyleDates: toSetDates - }) - } - } - } - } -} diff --git a/utils/calendar/plugins/preset/get-calendar-data.js b/utils/calendar/plugins/preset/get-calendar-data.js deleted file mode 100644 index 463082a..0000000 --- a/utils/calendar/plugins/preset/get-calendar-data.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @Author: drfu* - * @Description: 获取日历数据 - * @Date: 2020-10-08 21:22:09* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-11 13:42:37 - * */ - -import { getCalendarData, logger, getCalendarConfig } from '../../utils/index' - -function wrapDateWithLunar(dates = [], convertFn) { - const datesWithLunar = JSON.parse(JSON.stringify(dates)).map(date => ({ - ...date, - lunar: convertFn(date) - })) - return datesWithLunar -} - -export default () => { - return { - name: 'getData', - methods(component) { - return { - getCurrentYM: () => { - const { curYear, curMonth } = getCalendarData('calendar', component) - return { - year: curYear, - month: curMonth - } - }, - getSelectedDates: (options = {}) => { - const dates = - getCalendarData('calendar.selectedDates', component) || [] - const config = getCalendarConfig(component) || {} - if (options.lunar && !config.showLunar) { - const injectedFns = component.calendar || {} - if (typeof injectedFns.convertSolarLunar === 'function') { - return wrapDateWithLunar(dates, injectedFns.convertSolarLunar) - } else { - logger.warn('获取农历信息需引入农历插件') - } - } else { - return dates - } - }, - getCalendarDates: (options = {}) => { - const config = getCalendarConfig(component) || {} - const dates = getCalendarData('calendar.dates', component) - if (options.lunar && !config.showLunar) { - const injectedFns = component.calendar || {} - if (typeof injectedFns.convertSolarLunar === 'function') { - return wrapDateWithLunar(dates, injectedFns.convertSolarLunar) - } else { - logger.warn('获取农历信息需引入农历插件') - } - } else { - return dates - } - }, - getCalendarAllData: () => { - return { - data: getCalendarData('calendar', component) || {}, - config: getCalendarConfig(component) || {} - } - } - } - } - } -} diff --git a/utils/calendar/plugins/preset/index.js b/utils/calendar/plugins/preset/index.js deleted file mode 100644 index 70cde39..0000000 --- a/utils/calendar/plugins/preset/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import base from './base' -import getCalendarData from './get-calendar-data' - -const preset = [ - ['base', base()], - ['get-calendar-data', getCalendarData()] -] - -export default preset diff --git a/utils/calendar/plugins/selectable.js b/utils/calendar/plugins/selectable.js deleted file mode 100644 index 64ab52b..0000000 --- a/utils/calendar/plugins/selectable.js +++ /dev/null @@ -1,219 +0,0 @@ -/** - * @Author: drfu* - * @Description: 禁用、启用日期选择 - * @Date: 2020-10-08 21:22:09* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-08 21:25:00 - * */ - -import { getCalendarData, dateUtil, logger } from '../utils/index' -import { renderCalendar } from '../render' - -function convertEnableAreaToTimestamp(timearea = []) { - const start = timearea[0].split('-') - const end = timearea[1].split('-') - if (start.length !== 3 || end.length !== 3) { - logger.warn('enableArea() 参数格式为: ["2018-2-1", "2018-3-1"]') - return {} - } - const startTimestamp = dateUtil - .newDate(start[0], start[1], start[2]) - .getTime() - const endTimestamp = dateUtil.newDate(end[0], end[1], end[2]).getTime() - return { - start, - end, - startTimestamp, - endTimestamp - } -} - -function isValiditeOfDateArea(dateArea) { - const { - start, - end, - startTimestamp, - endTimestamp - } = convertEnableAreaToTimestamp(dateArea) - if (!start || !end) return - const datesCountOfStart = dateUtil.getDatesCountOfMonth(start[0], start[1]) - const datesCountOfEnd = dateUtil.getDatesCountOfMonth(end[0], end[1]) - if (start[2] > datesCountOfStart || start[2] < 1) { - logger.warn('enableArea() 开始日期错误,指定日期不在指定月份天数范围内') - return false - } else if (start[1] > 12 || start[1] < 1) { - logger.warn('enableArea() 开始日期错误,月份超出1-12月份') - return false - } else if (end[2] > datesCountOfEnd || end[2] < 1) { - logger.warn('enableArea() 截止日期错误,指定日期不在指定月份天数范围内') - return false - } else if (end[1] > 12 || end[1] < 1) { - logger.warn('enableArea() 截止日期错误,月份超出1-12月份') - return false - } else if (startTimestamp > endTimestamp) { - logger.warn('enableArea()参数最小日期大于了最大日期') - return false - } else { - return true - } -} - -function handleDisableMode(calendarConfig) { - const { disableMode } = calendarConfig - if (!disableMode) return {} - const disableBound = - dateUtil.getTimeStamp(disableMode.date) || dateUtil.todayTimestamp() - return { - disableBound, - disableType: disableMode.type - } -} - -function disabledByConfig(dateInfo, currentDate, calendarConfig) { - const date = { ...dateInfo } - const { disableType, disableBound } = handleDisableMode(calendarConfig) - if ( - (disableType === 'before' && disableBound && currentDate < disableBound) || - (disableType === 'after' && disableBound && currentDate > disableBound) - ) { - date.disable = true - } else { - date.disable = false - } - return date -} - -export default () => { - return { - name: 'enable', - beforeRender(calendarData = {}, calendarConfig = {}) { - const { - dates, - enableArea, - enableDates, - disableDates, - renderCausedBy - } = calendarData - const _dates = [...dates].map(date => { - let item = { ...date } - const timeStr = dateUtil.toTimeStr(date) - const timestamp = +dateUtil.getTimeStamp(item) - if (renderCausedBy === 'enableDates') { - if (enableDates && enableDates.length) { - if (enableDates.includes(timeStr)) { - item.disable = false - } else { - item.disable = true - } - return item - } - } else if (renderCausedBy === 'enableArea') { - if (enableArea && enableArea.length) { - const [startTimestamp, endTimestamp] = enableArea || [] - const ifOutofArea = - +startTimestamp > timestamp || timestamp > +endTimestamp - item.disable = ifOutofArea - return item - } - } else if (renderCausedBy === 'disableDates') { - if (disableDates && disableDates.length) { - if (disableDates && disableDates.includes(timeStr)) { - item.disable = true - } - return item - } - } - return disabledByConfig(item, timestamp, calendarConfig) - }) - - return { - calendarData: { - ...calendarData, - dates: _dates - }, - calendarConfig - } - }, - methods(component) { - return { - enableArea: (dateArea = []) => { - if (dateArea.length === 2) { - const validate = isValiditeOfDateArea(dateArea) - if (validate) { - const existCalendarData = getCalendarData('calendar', component) - const { - startTimestamp, - endTimestamp - } = convertEnableAreaToTimestamp(dateArea) - - return renderCalendar.call(component, { - ...existCalendarData, - renderCausedBy: 'enableArea', - enableArea: [startTimestamp, endTimestamp] - }) - } - } else { - return Promise.inject( - 'enableArea()参数需为时间范围数组,形如:["2018-8-4" , "2018-8-24"]' - ) - } - }, - enableDates: (toSet = []) => { - if (!toSet.length) return - const existCalendarData = getCalendarData('calendar', component) - const { enableDates = [] } = existCalendarData || {} - let toSetDates = toSet.map(item => { - if (typeof item === 'string') { - return dateUtil.transformDateRow2Dict(item) - } - return item - }) - if (enableDates.length) { - toSetDates = dateUtil.uniqueArrayByDate([ - ...toSetDates, - ...enableDates.map(d => dateUtil.transformDateRow2Dict(d)) - ]) - } - return renderCalendar.call(component, { - ...existCalendarData, - renderCausedBy: 'enableDates', - enableDates: toSetDates.map(date => { - if (typeof date !== 'string') { - return dateUtil.toTimeStr(date) - } - return date - }) - }) - }, - disableDates: toSet => { - const existCalendarData = getCalendarData('calendar', component) - const { disableDates = [], dates = [] } = existCalendarData || {} - let toSetDates = toSet.map(item => { - let date = { ...item } - if (typeof date === 'string') { - return dateUtil.transformDateRow2Dict(item) - } - return item - }) - if (disableDates && disableDates.length) { - toSetDates = dateUtil.uniqueArrayByDate([ - ...toSetDates, - ...disableDates.map(d => dateUtil.transformDateRow2Dict(d)) - ]) - } - return renderCalendar.call(component, { - ...existCalendarData, - renderCausedBy: 'disableDates', - dates, - disableDates: toSetDates.map(date => { - if (typeof date !== 'string') { - return dateUtil.toTimeStr(date) - } - return date - }) - }) - } - } - } - } -} diff --git a/utils/calendar/plugins/solarLunar/convertSolarLunar.js b/utils/calendar/plugins/solarLunar/convertSolarLunar.js deleted file mode 100644 index 4f9141c..0000000 --- a/utils/calendar/plugins/solarLunar/convertSolarLunar.js +++ /dev/null @@ -1,1036 +0,0 @@ -/** - * @1900-2100区间内的公历、农历互转 - * @Version 1.0.3 - * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] - * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] - */ -/* 公历年月日转农历数据 返回json */ -// calendar.solar2lunar(1987,11,01); -/** 农历年月日转公历年月日 **/ -// calendar.lunar2solar(1987,9,10); -// 调用以上方法后返回类似如下object(json)具体以上就不需要解释了吧! -// c开头的是公历各属性值 l开头的自然就是农历咯 gz开头的就是天干地支纪年的数据啦~ -// { -// Animal: "兔", -// IDayCn: "初十", -// IMonthCn: "九月", -// Term: null, -// astro: "天蝎座", -// cDay: 1, -// cMonth: 11, -// cYear: 1987, -// gzDay: "甲寅", -// gzMonth: "庚戌", -// gzYear: "丁卯", -// isLeap: false, -// isTerm: false, -// isToday: false, -// lDay: 10, -// lMonth: 9, -// lYear: 1987, -// nWeek: 7, -// ncWeek: "星期日" -// } -// 该代码还有其他可以调用的方法,请自己查看代码中的详细注释 -const calendar = { - /** - * 农历1900-2100的润大小信息表 - * @Array Of Property - * @return Hex - */ - lunarInfo: [ - 0x04bd8, - 0x04ae0, - 0x0a570, - 0x054d5, - 0x0d260, - 0x0d950, - 0x16554, - 0x056a0, - 0x09ad0, - 0x055d2, // 1900-1909 - 0x04ae0, - 0x0a5b6, - 0x0a4d0, - 0x0d250, - 0x1d255, - 0x0b540, - 0x0d6a0, - 0x0ada2, - 0x095b0, - 0x14977, // 1910-1919 - 0x04970, - 0x0a4b0, - 0x0b4b5, - 0x06a50, - 0x06d40, - 0x1ab54, - 0x02b60, - 0x09570, - 0x052f2, - 0x04970, // 1920-1929 - 0x06566, - 0x0d4a0, - 0x0ea50, - 0x06e95, - 0x05ad0, - 0x02b60, - 0x186e3, - 0x092e0, - 0x1c8d7, - 0x0c950, // 1930-1939 - 0x0d4a0, - 0x1d8a6, - 0x0b550, - 0x056a0, - 0x1a5b4, - 0x025d0, - 0x092d0, - 0x0d2b2, - 0x0a950, - 0x0b557, // 1940-1949 - 0x06ca0, - 0x0b550, - 0x15355, - 0x04da0, - 0x0a5b0, - 0x14573, - 0x052b0, - 0x0a9a8, - 0x0e950, - 0x06aa0, // 1950-1959 - 0x0aea6, - 0x0ab50, - 0x04b60, - 0x0aae4, - 0x0a570, - 0x05260, - 0x0f263, - 0x0d950, - 0x05b57, - 0x056a0, // 1960-1969 - 0x096d0, - 0x04dd5, - 0x04ad0, - 0x0a4d0, - 0x0d4d4, - 0x0d250, - 0x0d558, - 0x0b540, - 0x0b6a0, - 0x195a6, // 1970-1979 - 0x095b0, - 0x049b0, - 0x0a974, - 0x0a4b0, - 0x0b27a, - 0x06a50, - 0x06d40, - 0x0af46, - 0x0ab60, - 0x09570, // 1980-1989 - 0x04af5, - 0x04970, - 0x064b0, - 0x074a3, - 0x0ea50, - 0x06b58, - 0x055c0, - 0x0ab60, - 0x096d5, - 0x092e0, // 1990-1999 - 0x0c960, - 0x0d954, - 0x0d4a0, - 0x0da50, - 0x07552, - 0x056a0, - 0x0abb7, - 0x025d0, - 0x092d0, - 0x0cab5, // 2000-2009 - 0x0a950, - 0x0b4a0, - 0x0baa4, - 0x0ad50, - 0x055d9, - 0x04ba0, - 0x0a5b0, - 0x15176, - 0x052b0, - 0x0a930, // 2010-2019 - 0x07954, - 0x06aa0, - 0x0ad50, - 0x05b52, - 0x04b60, - 0x0a6e6, - 0x0a4e0, - 0x0d260, - 0x0ea65, - 0x0d530, // 2020-2029 - 0x05aa0, - 0x076a3, - 0x096d0, - 0x04afb, - 0x04ad0, - 0x0a4d0, - 0x1d0b6, - 0x0d250, - 0x0d520, - 0x0dd45, // 2030-2039 - 0x0b5a0, - 0x056d0, - 0x055b2, - 0x049b0, - 0x0a577, - 0x0a4b0, - 0x0aa50, - 0x1b255, - 0x06d20, - 0x0ada0, // 2040-2049 - /** Add By JJonline@JJonline.Cn **/ - 0x14b63, - 0x09370, - 0x049f8, - 0x04970, - 0x064b0, - 0x168a6, - 0x0ea50, - 0x06b20, - 0x1a6c4, - 0x0aae0, // 2050-2059 - 0x0a2e0, - 0x0d2e3, - 0x0c960, - 0x0d557, - 0x0d4a0, - 0x0da50, - 0x05d55, - 0x056a0, - 0x0a6d0, - 0x055d4, // 2060-2069 - 0x052d0, - 0x0a9b8, - 0x0a950, - 0x0b4a0, - 0x0b6a6, - 0x0ad50, - 0x055a0, - 0x0aba4, - 0x0a5b0, - 0x052b0, // 2070-2079 - 0x0b273, - 0x06930, - 0x07337, - 0x06aa0, - 0x0ad50, - 0x14b55, - 0x04b60, - 0x0a570, - 0x054e4, - 0x0d160, // 2080-2089 - 0x0e968, - 0x0d520, - 0x0daa0, - 0x16aa6, - 0x056d0, - 0x04ae0, - 0x0a9d4, - 0x0a2d0, - 0x0d150, - 0x0f252, // 2090-2099 - 0x0d520 - ], // 2100 - - /** - * 公历每个月份的天数普通表 - * @Array Of Property - * @return Number - */ - solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], - - /** - * 天干地支之天干速查表 - * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] - * @return Cn string - */ - Gan: [ - '\u7532', - '\u4e59', - '\u4e19', - '\u4e01', - '\u620a', - '\u5df1', - '\u5e9a', - '\u8f9b', - '\u58ec', - '\u7678' - ], - - /** - * 天干地支之地支速查表 - * @Array Of Property - * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] - * @return Cn string - */ - Zhi: [ - '\u5b50', - '\u4e11', - '\u5bc5', - '\u536f', - '\u8fb0', - '\u5df3', - '\u5348', - '\u672a', - '\u7533', - '\u9149', - '\u620c', - '\u4ea5' - ], - - /** - * 天干地支之地支速查表<=>生肖 - * @Array Of Property - * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] - * @return Cn string - */ - Animals: [ - '\u9f20', - '\u725b', - '\u864e', - '\u5154', - '\u9f99', - '\u86c7', - '\u9a6c', - '\u7f8a', - '\u7334', - '\u9e21', - '\u72d7', - '\u732a' - ], - - /** - * 24节气速查表 - * @Array Of Property - * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] - * @return Cn string - */ - solarTerm: [ - '\u5c0f\u5bd2', - '\u5927\u5bd2', - '\u7acb\u6625', - '\u96e8\u6c34', - '\u60ca\u86f0', - '\u6625\u5206', - '\u6e05\u660e', - '\u8c37\u96e8', - '\u7acb\u590f', - '\u5c0f\u6ee1', - '\u8292\u79cd', - '\u590f\u81f3', - '\u5c0f\u6691', - '\u5927\u6691', - '\u7acb\u79cb', - '\u5904\u6691', - '\u767d\u9732', - '\u79cb\u5206', - '\u5bd2\u9732', - '\u971c\u964d', - '\u7acb\u51ac', - '\u5c0f\u96ea', - '\u5927\u96ea', - '\u51ac\u81f3' - ], - - /** - * 1900-2100各年的24节气日期速查表 - * @Array Of Property - * @return 0x string For splice - */ - sTermInfo: [ - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c3598082c95f8c965cc920f', - '97bd0b06bdb0722c965ce1cfcc920f', - 'b027097bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c359801ec95f8c965cc920f', - '97bd0b06bdb0722c965ce1cfcc920f', - 'b027097bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c359801ec95f8c965cc920f', - '97bd0b06bdb0722c965ce1cfcc920f', - 'b027097bd097c36b0b6fc9274c91aa', - '9778397bd19801ec9210c965cc920e', - '97b6b97bd19801ec95f8c965cc920f', - '97bd09801d98082c95f8e1cfcc920f', - '97bd097bd097c36b0b6fc9210c8dc2', - '9778397bd197c36c9210c9274c91aa', - '97b6b97bd19801ec95f8c965cc920e', - '97bd09801d98082c95f8e1cfcc920f', - '97bd097bd097c36b0b6fc9210c8dc2', - '9778397bd097c36c9210c9274c91aa', - '97b6b97bd19801ec95f8c965cc920e', - '97bcf97c3598082c95f8e1cfcc920f', - '97bd097bd097c36b0b6fc9210c8dc2', - '9778397bd097c36c9210c9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c3598082c95f8c965cc920f', - '97bd097bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c3598082c95f8c965cc920f', - '97bd097bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c359801ec95f8c965cc920f', - '97bd097bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c359801ec95f8c965cc920f', - '97bd097bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf97c359801ec95f8c965cc920f', - '97bd097bd07f595b0b6fc920fb0722', - '9778397bd097c36b0b6fc9210c8dc2', - '9778397bd19801ec9210c9274c920e', - '97b6b97bd19801ec95f8c965cc920f', - '97bd07f5307f595b0b0bc920fb0722', - '7f0e397bd097c36b0b6fc9210c8dc2', - '9778397bd097c36c9210c9274c920e', - '97b6b97bd19801ec95f8c965cc920f', - '97bd07f5307f595b0b0bc920fb0722', - '7f0e397bd097c36b0b6fc9210c8dc2', - '9778397bd097c36c9210c9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bd07f1487f595b0b0bc920fb0722', - '7f0e397bd097c36b0b6fc9210c8dc2', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf7f1487f595b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf7f1487f595b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf7f1487f531b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c965cc920e', - '97bcf7f1487f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b97bd19801ec9210c9274c920e', - '97bcf7f0e47f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '9778397bd097c36b0b6fc9210c91aa', - '97b6b97bd197c36c9210c9274c920e', - '97bcf7f0e47f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '9778397bd097c36b0b6fc9210c8dc2', - '9778397bd097c36c9210c9274c920e', - '97b6b7f0e47f531b0723b0b6fb0722', - '7f0e37f5307f595b0b0bc920fb0722', - '7f0e397bd097c36b0b6fc9210c8dc2', - '9778397bd097c36b0b70c9274c91aa', - '97b6b7f0e47f531b0723b0b6fb0721', - '7f0e37f1487f595b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc9210c8dc2', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f595b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '9778397bd097c36b0b6fc9274c91aa', - '97b6b7f0e47f531b0723b0787b0721', - '7f0e27f0e47f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '9778397bd097c36b0b6fc9210c91aa', - '97b6b7f0e47f149b0723b0787b0721', - '7f0e27f0e47f531b0723b0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '9778397bd097c36b0b6fc9210c8dc2', - '977837f0e37f149b0723b0787b0721', - '7f07e7f0e47f531b0723b0b6fb0722', - '7f0e37f5307f595b0b0bc920fb0722', - '7f0e397bd097c35b0b6fc9210c8dc2', - '977837f0e37f14998082b0787b0721', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e37f1487f595b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc9210c8dc2', - '977837f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '977837f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd097c35b0b6fc920fb0722', - '977837f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '977837f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '977837f0e37f14998082b0787b06bd', - '7f07e7f0e47f149b0723b0787b0721', - '7f0e27f0e47f531b0b0bb0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '977837f0e37f14998082b0723b06bd', - '7f07e7f0e37f149b0723b0787b0721', - '7f0e27f0e47f531b0723b0b6fb0722', - '7f0e397bd07f595b0b0bc920fb0722', - '977837f0e37f14898082b0723b02d5', - '7ec967f0e37f14998082b0787b0721', - '7f07e7f0e47f531b0723b0b6fb0722', - '7f0e37f1487f595b0b0bb0b6fb0722', - '7f0e37f0e37f14898082b0723b02d5', - '7ec967f0e37f14998082b0787b0721', - '7f07e7f0e47f531b0723b0b6fb0722', - '7f0e37f1487f531b0b0bb0b6fb0722', - '7f0e37f0e37f14898082b0723b02d5', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e37f1487f531b0b0bb0b6fb0722', - '7f0e37f0e37f14898082b072297c35', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e37f0e37f14898082b072297c35', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e37f0e366aa89801eb072297c35', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f149b0723b0787b0721', - '7f0e27f1487f531b0b0bb0b6fb0722', - '7f0e37f0e366aa89801eb072297c35', - '7ec967f0e37f14998082b0723b06bd', - '7f07e7f0e47f149b0723b0787b0721', - '7f0e27f0e47f531b0723b0b6fb0722', - '7f0e37f0e366aa89801eb072297c35', - '7ec967f0e37f14998082b0723b06bd', - '7f07e7f0e37f14998083b0787b0721', - '7f0e27f0e47f531b0723b0b6fb0722', - '7f0e37f0e366aa89801eb072297c35', - '7ec967f0e37f14898082b0723b02d5', - '7f07e7f0e37f14998082b0787b0721', - '7f07e7f0e47f531b0723b0b6fb0722', - '7f0e36665b66aa89801e9808297c35', - '665f67f0e37f14898082b0723b02d5', - '7ec967f0e37f14998082b0787b0721', - '7f07e7f0e47f531b0723b0b6fb0722', - '7f0e36665b66a449801e9808297c35', - '665f67f0e37f14898082b0723b02d5', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e36665b66a449801e9808297c35', - '665f67f0e37f14898082b072297c35', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e26665b66a449801e9808297c35', - '665f67f0e37f1489801eb072297c35', - '7ec967f0e37f14998082b0787b06bd', - '7f07e7f0e47f531b0723b0b6fb0721', - '7f0e27f1487f531b0b0bb0b6fb0722' - ], - - /** - * 数字转中文速查表 - * @Array Of Property - * @trans ['日','一','二','三','四','五','六','七','八','九','十'] - * @return Cn string - */ - nStr1: [ - '\u65e5', - '\u4e00', - '\u4e8c', - '\u4e09', - '\u56db', - '\u4e94', - '\u516d', - '\u4e03', - '\u516b', - '\u4e5d', - '\u5341' - ], - - /** - * 日期转农历称呼速查表 - * @Array Of Property - * @trans ['初','十','廿','卅'] - * @return Cn string - */ - nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], - - /** - * 月份转农历称呼速查表 - * @Array Of Property - * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] - * @return Cn string - */ - nStr3: [ - '\u6b63', - '\u4e8c', - '\u4e09', - '\u56db', - '\u4e94', - '\u516d', - '\u4e03', - '\u516b', - '\u4e5d', - '\u5341', - '\u51ac', - '\u814a' - ], - - /** - * 返回农历y年一整年的总天数 - * @param lunar Year - * @return Number - * @eg:var count = calendar.lYearDays(1987) ;//count=387 - */ - lYearDays: function(y) { - let i - let sum = 348 - for (i = 0x8000; i > 0x8; i >>= 1) { - sum += calendar.lunarInfo[y - 1900] & i ? 1 : 0 - } - return sum + calendar.leapDays(y) - }, - - /** - * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 - * @param lunar Year - * @return Number (0-12) - * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 - */ - leapMonth: function(y) { - // 闰字编码 \u95f0 - return calendar.lunarInfo[y - 1900] & 0xf - }, - - /** - * 返回农历y年闰月的天数 若该年没有闰月则返回0 - * @param lunar Year - * @return Number (0、29、30) - * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 - */ - leapDays: function(y) { - if (calendar.leapMonth(y)) { - return calendar.lunarInfo[y - 1900] & 0x10000 ? 30 : 29 - } - return 0 - }, - - /** - * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 - * @param lunar Year - * @return Number (-1、29、30) - * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 - */ - monthDays: function(y, m) { - if (m > 12 || m < 1) return -1 // 月份参数从1至12,参数错误返回-1 - return calendar.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29 - }, - - /** - * 返回公历(!)y年m月的天数 - * @param solar Year - * @return Number (-1、28、29、30、31) - * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 - */ - solarDays: function(y, m) { - if (m > 12 || m < 1) return -1 // 若参数错误 返回-1 - const ms = m - 1 - if (+ms === 1) { - // 2月份的闰平规律测算后确认返回28或29 - return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 ? 29 : 28 - } else { - return calendar.solarMonth[ms] - } - }, - - /** - * 农历年份转换为干支纪年 - * @param lYear 农历年的年份数 - * @return Cn string - */ - toGanZhiYear: function(lYear) { - let ganKey = (lYear - 3) % 10 - let zhiKey = (lYear - 3) % 12 - if (+ganKey === 0) ganKey = 10 // 如果余数为0则为最后一个天干 - if (+zhiKey === 0) zhiKey = 12 // 如果余数为0则为最后一个地支 - return calendar.Gan[ganKey - 1] + calendar.Zhi[zhiKey - 1] - }, - - /** - * 公历月、日判断所属星座 - * @param cMonth [description] - * @param cDay [description] - * @return Cn string - */ - toAstro: function(cMonth, cDay) { - const s = - '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' - const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] - return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7' // 座 - }, - - /** - * 传入offset偏移量返回干支 - * @param offset 相对甲子的偏移量 - * @return Cn string - */ - toGanZhi: function(offset) { - return calendar.Gan[offset % 10] + calendar.Zhi[offset % 12] - }, - - /** - * 传入公历(!)y年获得该年第n个节气的公历日期 - * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 - * @return day Number - * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 - */ - getTerm: function(y, n) { - if (y < 1900 || y > 2100) return -1 - if (n < 1 || n > 24) return -1 - const _table = calendar.sTermInfo[y - 1900] - const _info = [ - parseInt('0x' + _table.substr(0, 5)).toString(), - parseInt('0x' + _table.substr(5, 5)).toString(), - parseInt('0x' + _table.substr(10, 5)).toString(), - parseInt('0x' + _table.substr(15, 5)).toString(), - parseInt('0x' + _table.substr(20, 5)).toString(), - parseInt('0x' + _table.substr(25, 5)).toString() - ] - const _calday = [ - _info[0].substr(0, 1), - _info[0].substr(1, 2), - _info[0].substr(3, 1), - _info[0].substr(4, 2), - - _info[1].substr(0, 1), - _info[1].substr(1, 2), - _info[1].substr(3, 1), - _info[1].substr(4, 2), - - _info[2].substr(0, 1), - _info[2].substr(1, 2), - _info[2].substr(3, 1), - _info[2].substr(4, 2), - - _info[3].substr(0, 1), - _info[3].substr(1, 2), - _info[3].substr(3, 1), - _info[3].substr(4, 2), - - _info[4].substr(0, 1), - _info[4].substr(1, 2), - _info[4].substr(3, 1), - _info[4].substr(4, 2), - - _info[5].substr(0, 1), - _info[5].substr(1, 2), - _info[5].substr(3, 1), - _info[5].substr(4, 2) - ] - return parseInt(_calday[n - 1]) - }, - - /** - * 传入农历数字月份返回汉语通俗表示法 - * @param lunar month - * @return Cn string - * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' - */ - toChinaMonth: function(m) { - // 月 => \u6708 - if (m > 12 || m < 1) return -1 // 若参数错误 返回-1 - let s = calendar.nStr3[m - 1] - s += '\u6708' // 加上月字 - return s - }, - - /** - * 传入农历日期数字返回汉字表示法 - * @param lunar day - * @return Cn string - * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' - */ - toChinaDay: function(d) { - // 日 => \u65e5 - let s - switch (d) { - case 10: - s = '\u521d\u5341' - break - case 20: - s = '\u4e8c\u5341' - break - case 30: - s = '\u4e09\u5341' - break - default: - s = calendar.nStr2[Math.floor(d / 10)] - s += calendar.nStr1[d % 10] - } - return s - }, - - /** - * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” - * @param y year - * @return Cn string - * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' - */ - getAnimal: function(y) { - return calendar.Animals[(y - 4) % 12] - }, - - /** - * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON - * @param y solar year - * @param m solar month - * @param d solar day - * @return JSON object - * @eg:console.log(calendar.solar2lunar(1987,11,01)); - */ - solar2lunar: function(y, m, d) { - // 参数区间1900.1.31~2100.12.31 - // 年份限定、上限 - if (y < 1900 || y > 2100) { - return -1 // undefined转换为数字变为NaN - } - // 公历传参最下限 - if (+y === 1900 && +m === 1 && +d < 31) { - return -1 - } - // 未传参 获得当天 - let objDate - if (!y) { - objDate = new Date() - } else { - objDate = new Date(y, parseInt(m) - 1, d) - } - let i - let leap = 0 - let temp = 0 - // 修正ymd参数 - y = objDate.getFullYear() - m = objDate.getMonth() + 1 - d = objDate.getDate() - let offset = - (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - - Date.UTC(1900, 0, 31)) / - 86400000 - for (i = 1900; i < 2101 && offset > 0; i++) { - temp = calendar.lYearDays(i) - offset -= temp - } - if (offset < 0) { - offset += temp - i-- - } - - // 是否今天 - const isTodayObj = new Date() - let isToday = false - if ( - isTodayObj.getFullYear() === +y && - isTodayObj.getMonth() + 1 === +m && - isTodayObj.getDate() === +d - ) { - isToday = true - } - // 星期几 - let nWeek = objDate.getDay() - const cWeek = calendar.nStr1[nWeek] - // 数字表示周几顺应天朝周一开始的惯例 - if (+nWeek === 0) { - nWeek = 7 - } - // 农历年 - const year = i - leap = calendar.leapMonth(i) // 闰哪个月 - let isLeap = false - - // 效验闰月 - for (i = 1; i < 13 && offset > 0; i++) { - // 闰月 - if (leap > 0 && i === leap + 1 && isLeap === false) { - --i - isLeap = true - temp = calendar.leapDays(year) // 计算农历闰月天数 - } else { - temp = calendar.monthDays(year, i) // 计算农历普通月天数 - } - // 解除闰月 - if (isLeap === true && i === leap + 1) isLeap = false - offset -= temp - } - // 闰月导致数组下标重叠取反 - if (offset === 0 && leap > 0 && i === leap + 1) { - if (isLeap) { - isLeap = false - } else { - isLeap = true - --i - } - } - if (offset < 0) { - offset += temp - --i - } - // 农历月 - const month = i - // 农历日 - const day = offset + 1 - // 天干地支处理 - const sm = m - 1 - const gzY = calendar.toGanZhiYear(year) - - // 当月的两个节气 - // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` - const firstNode = calendar.getTerm(y, m * 2 - 1) // 返回当月「节」为几日开始 - const secondNode = calendar.getTerm(y, m * 2) // 返回当月「节」为几日开始 - - // 依据12节气修正干支月 - let gzM = calendar.toGanZhi((y - 1900) * 12 + m + 11) - if (d >= firstNode) { - gzM = calendar.toGanZhi((y - 1900) * 12 + m + 12) - } - - // 传入的日期的节气与否 - let isTerm = false - let Term = null - if (+firstNode === d) { - isTerm = true - Term = calendar.solarTerm[m * 2 - 2] - } - if (+secondNode === d) { - isTerm = true - Term = calendar.solarTerm[m * 2 - 1] - } - // 日柱 当月一日与 1900/1/1 相差天数 - const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 - const gzD = calendar.toGanZhi(dayCyclical + d - 1) - // 该日期所属的星座 - const astro = calendar.toAstro(m, d) - - return { - lYear: year, - lMonth: month, - lDay: day, - Animal: calendar.getAnimal(year), - IMonthCn: (isLeap ? '\u95f0' : '') + calendar.toChinaMonth(month), - IDayCn: calendar.toChinaDay(day), - cYear: y, - cMonth: m, - cDay: d, - gzYear: gzY, - gzMonth: gzM, - gzDay: gzD, - isToday: isToday, - isLeap: isLeap, - nWeek: nWeek, - ncWeek: '\u661f\u671f' + cWeek, - isTerm: isTerm, - Term: Term, - astro: astro - } - }, - - /** - * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON - * @param y lunar year - * @param m lunar month - * @param d lunar day - * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] - * @return JSON object - * @eg:console.log(calendar.lunar2solar(1987,9,10)); - */ - lunar2solar: function(y, m, d, isLeapMonth) { - // 参数区间1900.1.31~2100.12.1 - isLeapMonth = !!isLeapMonth - // let leapOffset = 0; - const leapMonth = calendar.leapMonth(y) - // let leapDay = calendar.leapDays(y); - if (isLeapMonth && leapMonth !== m) return -1 // 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 - if ( - (+y === 2100 && +m === 12 && +d > 1) || - (+y === 1900 && +m === 1 && +d < 31) - ) - return -1 // 超出了最大极限值 - const day = calendar.monthDays(y, m) - let _day = day - // bugFix 2016-9-25 - // if month is leap, _day use leapDays method - if (isLeapMonth) { - _day = calendar.leapDays(y, m) - } - if (y < 1900 || y > 2100 || d > _day) return -1 // 参数合法性效验 - - // 计算农历的时间差 - let offset = 0 - for (let i = 1900; i < y; i++) { - offset += calendar.lYearDays(i) - } - let leap = 0 - let isAdd = false - for (let i = 1; i < m; i++) { - leap = calendar.leapMonth(y) - if (!isAdd) { - // 处理闰月 - if (leap <= i && leap > 0) { - offset += calendar.leapDays(y) - isAdd = true - } - } - offset += calendar.monthDays(y, i) - } - // 转换闰月农历 需补充该年闰月的前一个月的时差 - if (isLeapMonth) offset += day - // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) - const stmap = Date.UTC(1900, 1, 30, 0, 0, 0) - const calObj = new Date((offset + d - 31) * 86400000 + stmap) - const cY = calObj.getUTCFullYear() - const cM = calObj.getUTCMonth() + 1 - const cD = calObj.getUTCDate() - - return calendar.solar2lunar(cY, cM, cD) - } -} - -const { - Gan, - Zhi, - nStr1, - nStr2, - nStr3, - Animals, - solarTerm, - lunarInfo, - sTermInfo, - solarMonth, - ...rest -} = calendar - -export default rest diff --git a/utils/calendar/plugins/solarLunar/index.js b/utils/calendar/plugins/solarLunar/index.js deleted file mode 100644 index 79ffbfd..0000000 --- a/utils/calendar/plugins/solarLunar/index.js +++ /dev/null @@ -1,59 +0,0 @@ -import { dateUtil } from '../../utils/index' -import convertSolarLunar from './convertSolarLunar' - -function getDateRow2Dict(dateInfo) { - if (!dateInfo) return dateInfo - if (typeof dateInfo === 'string' && dateInfo.includes('-')) { - dateInfo = dateUtil.transformDateRow2Dict(dateInfo) - } - return dateInfo -} - -export default () => { - return { - name: 'convertSolarLunar', - beforeRender(calendarData = {}, calendarConfig = {}) { - let { dates = [], selectedDates = [] } = calendarData - if (calendarConfig.showLunar) { - dates = dates.map(dataInfo => { - const { year, month, date } = dataInfo - return { - ...dataInfo, - lunar: convertSolarLunar.solar2lunar(year, month, date) - } - }) - selectedDates = selectedDates.map(dataInfo => { - const { year, month, date } = dataInfo - return { - ...dataInfo, - lunar: convertSolarLunar.solar2lunar(year, month, date) - } - }) - } - return { - calendarData: { - ...calendarData, - dates: dates, - selectedDates: selectedDates - }, - calendarConfig - } - }, - methods() { - return { - convertSolarLunar: dateInfo => { - dateInfo = getDateRow2Dict(dateInfo) - if (!dateInfo) return dateInfo - const { year, month, date } = dateInfo - return convertSolarLunar.solar2lunar(year, month, date) - }, - convertlLunar2Solar: (dateInfo, isLeapMonth) => { - dateInfo = getDateRow2Dict(dateInfo) - if (!dateInfo) return dateInfo - const { year, month, date } = dateInfo - return convertSolarLunar.lunar2solar(year, month, date, isLeapMonth) - } - } - } - } -} diff --git a/utils/calendar/plugins/time-range.js b/utils/calendar/plugins/time-range.js deleted file mode 100644 index 2386a85..0000000 --- a/utils/calendar/plugins/time-range.js +++ /dev/null @@ -1,309 +0,0 @@ -/** - * @Author: drfu* - * @Description: 时间区域选择 - * @Date: 2020-10-08 21:22:09* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-11 13:56:32 - * */ - -import { renderCalendar } from '../render' -import { - logger, - dateUtil, - getCalendarConfig, - getCalendarData -} from '../utils/index' - -function pusheNextMonthDateArea( - dateInfo = {}, - startTimestamp, - endTimestamp, - selectedDates = [] -) { - let tempOfSelectedDate = [...selectedDates] - const dates = dateUtil.calcDates(dateInfo.year, dateInfo.month) - let datesLen = dates.length - for (let i = 0; i < datesLen; i++) { - const date = dates[i] - const timeStamp = dateUtil.getTimeStamp(date) - if (timeStamp <= endTimestamp && timeStamp >= startTimestamp) { - tempOfSelectedDate.push({ - ...date, - choosed: true - }) - } - if (i === datesLen - 1 && timeStamp < endTimestamp) { - tempOfSelectedDate = pusheNextMonthDateArea( - dateUtil.getNextMonthInfo(date), - startTimestamp, - endTimestamp, - tempOfSelectedDate - ) - } - } - return tempOfSelectedDate -} -function pushPrevMonthDateArea( - dateInfo = {}, - startTimestamp, - endTimestamp, - selectedDates = [] -) { - let tempOfSelectedDate = [...selectedDates] - const dates = dateUtil.sortDatesByTime( - dateUtil.calcDates(dateInfo.year, dateInfo.month), - 'desc' - ) - let datesLen = dates.length - let firstDate = dateUtil.getTimeStamp(dates[0]) - for (let i = 0; i < datesLen; i++) { - const date = dates[i] - const timeStamp = dateUtil.getTimeStamp(date) - if (timeStamp >= startTimestamp && timeStamp <= endTimestamp) { - tempOfSelectedDate.push({ - ...date, - choosed: true - }) - } - if (i === datesLen - 1 && firstDate > startTimestamp) { - tempOfSelectedDate = pushPrevMonthDateArea( - dateUtil.getPrevMonthInfo(date), - startTimestamp, - endTimestamp, - tempOfSelectedDate - ) - } - } - return tempOfSelectedDate -} -/** - * 当设置日期区域非当前时保存其他月份的日期至已选日期数组 - * @param {object} info - */ -function calcDateWhenNotInOneMonth(info) { - const { firstDate, lastDate, startTimestamp, endTimestamp } = info - let { selectedDate } = info - if (dateUtil.getTimeStamp(firstDate) > startTimestamp) { - selectedDate = pushPrevMonthDateArea( - dateUtil.getPrevMonthInfo(firstDate), - startTimestamp, - endTimestamp, - selectedDate - ) - } - if (dateUtil.getTimeStamp(lastDate) < endTimestamp) { - selectedDate = pusheNextMonthDateArea( - dateUtil.getNextMonthInfo(lastDate), - startTimestamp, - endTimestamp, - selectedDate - ) - } - return [...selectedDate] -} - -/** - * 指定日期区域转时间戳 - * @param {array} timearea 时间区域 - */ -export function convertTimeRangeToTimestamp(timearea = []) { - const start = timearea[0].split('-') - const end = timearea[1].split('-') - if (start.length !== 3 || end.length !== 3) { - logger.warn('enableArea() 参数格式为: ["2018-2-1", "2018-3-1"]') - return {} - } - const startTimestamp = dateUtil - .newDate(start[0], start[1], start[2]) - .getTime() - const endTimestamp = dateUtil.newDate(end[0], end[1], end[2]).getTime() - return { - start, - end, - startTimestamp, - endTimestamp - } -} - -/** - * 校验时间区域是否合法 - * @param {array} dateArea 时间区域 - */ -function validateTimeRange(dateArea) { - const { - start, - end, - startTimestamp, - endTimestamp - } = convertTimeRangeToTimestamp(dateArea) - if (!start || !end) return - const startMonthDays = dateUtil.getDatesCountOfMonth(start[0], start[1]) - const endMonthDays = dateUtil.getDatesCountOfMonth(end[0], end[1]) - if (start[2] > startMonthDays || start[2] < 1) { - logger.warn('enableArea() 开始日期错误,指定日期不在当前月份天数范围内') - return false - } else if (start[1] > 12 || start[1] < 1) { - logger.warn('enableArea() 开始日期错误,月份超出1-12月份') - return false - } else if (end[2] > endMonthDays || end[2] < 1) { - logger.warn('enableArea() 截止日期错误,指定日期不在当前月份天数范围内') - return false - } else if (end[1] > 12 || end[1] < 1) { - logger.warn('enableArea() 截止日期错误,月份超出1-12月份') - return false - } else if (startTimestamp > endTimestamp) { - logger.warn('enableArea()参数最小日期大于了最大日期') - return false - } else { - return true - } -} - -export default () => { - return { - name: 'timeRange', - beforeRender(calendarData = {}, calendarConfig = {}) { - const { - chooseAreaTimestamp = [], - dates = [], - selectedDates = [] - } = calendarData - let __dates = dates - let __selectedDates = selectedDates - const [startDateTimestamp, endDateTimestamp] = chooseAreaTimestamp - if (chooseAreaTimestamp.length === 2) { - __selectedDates = [] - __dates = dates.map(d => { - const date = { ...d } - const dateTimeStamp = dateUtil.getTimeStamp(date) - if ( - dateTimeStamp >= startDateTimestamp && - endDateTimestamp >= dateTimeStamp - ) { - date.choosed = true - __selectedDates.push(date) - } else { - date.choosed = false - __selectedDates = __selectedDates.filter( - item => dateUtil.getTimeStamp(item) !== dateTimeStamp - ) - } - return date - }) - const { year: startYear, month: startMonth } = dateUtil.formatTimestamp( - startDateTimestamp - ) - const { year: endYear, month: endMonth } = dateUtil.formatTimestamp( - endDateTimestamp - ) - if (startMonth !== endMonth || startYear !== endYear) { - __selectedDates = calcDateWhenNotInOneMonth({ - firstDate: __dates[0], - lastDate: __dates[__dates.length - 1], - startTimestamp: startDateTimestamp, - endTimestamp: endDateTimestamp, - selectedDate: __selectedDates - }) - } - } - return { - calendarData: { - ...calendarData, - dates: __dates, - selectedDates: dateUtil.sortDatesByTime( - dateUtil.uniqueArrayByDate(__selectedDates) - ) - }, - calendarConfig - } - }, - onTapDate(tapedDate, calendarData = {}, calendarConfig = {}) { - if (!calendarConfig.chooseAreaMode) { - return { - calendarData, - calendarConfig - } - } - let { - tempChooseAreaTimestamp = [], - chooseAreaTimestamp: existChooseAreaTimestamp = [], - selectedDates = [], - dates = [] - } = calendarData - const timestamp = dateUtil.getTimeStamp(tapedDate) - let __dates = [...dates] - let __selectedDates = [...selectedDates] - if ( - tempChooseAreaTimestamp.length === 2 || - existChooseAreaTimestamp.length === 2 - ) { - tempChooseAreaTimestamp = [tapedDate] - __selectedDates = [] - __dates.forEach(d => (d.choosed = false)) - } else if (tempChooseAreaTimestamp.length === 1) { - const preChoosedDate = tempChooseAreaTimestamp[0] - const preTimestamp = dateUtil.getTimeStamp(preChoosedDate) - if (preTimestamp <= timestamp) { - tempChooseAreaTimestamp.push(tapedDate) - } else if (preTimestamp > timestamp) { - tempChooseAreaTimestamp.unshift(tapedDate) - } - } else { - tempChooseAreaTimestamp = [tapedDate] - } - let chooseAreaTimestamp = [] - if (tempChooseAreaTimestamp.length === 2) { - const [startDate, endDate] = tempChooseAreaTimestamp - const startDateTimestamp = dateUtil.getTimeStamp(startDate) - const endDateTimestamp = dateUtil.getTimeStamp(endDate) - chooseAreaTimestamp = [startDateTimestamp, endDateTimestamp] - } - return { - calendarData: { - ...calendarData, - chooseAreaTimestamp, - tempChooseAreaTimestamp, - dates: __dates, - selectedDates: __selectedDates - }, - calendarConfig: { - ...calendarConfig, - multi: true - } - } - }, - methods(component) { - return { - /** - * 设置连续日期选择区域 - * @param {array} dateArea 区域开始结束日期数组 - */ - chooseDateArea: (dateArea = []) => { - if (dateArea.length === 1) { - dateArea = dateArea.concat(dateArea) - } - if (dateArea.length !== 2) return - const isRight = validateTimeRange(dateArea) - if (!isRight) return - const config = getCalendarConfig(component) || {} - const { startTimestamp, endTimestamp } = convertTimeRangeToTimestamp( - dateArea - ) - const existCalendarData = getCalendarData('calendar', component) - return renderCalendar.call( - component, - { - ...existCalendarData, - chooseAreaTimestamp: [startTimestamp, endTimestamp] - }, - { - ...config, - multi: true, - chooseAreaMode: true - } - ) - } - } - } - } -} diff --git a/utils/calendar/plugins/todo.js b/utils/calendar/plugins/todo.js deleted file mode 100644 index 1559c6c..0000000 --- a/utils/calendar/plugins/todo.js +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @Author: drfu* - * @Description: 代办事项 - * @Date: 2020-10-08 21:22:09* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-11 14:23:02 - * */ - -import { getCalendarData, dateUtil } from '../utils/index' -import { renderCalendar } from '../render' - -function updateDatePropertyOfTodoLabel(todos, dates, showLabelAlways) { - const datesInfo = [...dates] - for (let todo of todos) { - let targetIdx = datesInfo.findIndex( - item => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(todo) - ) - let target = datesInfo[targetIdx] - if (!target) continue - if (showLabelAlways) { - target.showTodoLabel = true - } else { - target.showTodoLabel = !target.choosed - } - if (target.showTodoLabel) { - target.todoText = todo.todoText - } - target.color = todo.color - } - return datesInfo -} - -export default () => { - return { - name: 'todo', - beforeRender(calendarData = {}, calendarConfig = {}, component) { - const { todos = [], dates = [], showLabelAlways } = calendarData - const dateWithTodoInfo = updateDatePropertyOfTodoLabel( - todos, - dates, - showLabelAlways - ) - return { - calendarData: { - ...calendarData, - dates: dateWithTodoInfo - }, - calendarConfig - } - }, - methods(component) { - return { - setTodos: (options = {}) => { - const calendar = getCalendarData('calendar', component) - if (!calendar || !calendar.dates) { - return Promise.reject('请等待日历初始化完成后再调用该方法') - } - const { - circle, - dotColor = '', - pos = 'bottom', - showLabelAlways, - dates: todoDates = [] - } = options - const { todos = [] } = calendar - const tranformStr2NumOfTodo = todoDates.map(date => - dateUtil.tranformStr2NumOfDate(date) - ) - const calendarData = { - dates: calendar.dates, - todos: dateUtil.uniqueArrayByDate( - todos.concat(tranformStr2NumOfTodo) - ) - } - if (!circle) { - calendarData.todoLabelPos = pos - calendarData.todoLabelColor = dotColor - } - calendarData.todoLabelCircle = circle || false - calendarData.showLabelAlways = showLabelAlways || false - const existCalendarData = getCalendarData('calendar', component) - return renderCalendar.call(component, { - ...existCalendarData, - ...calendarData - }) - }, - deleteTodos(todos = []) { - if (!(todos instanceof Array) || !todos.length) - return Promise.reject('deleteTodos()应为入参为非空数组') - const existCalendarData = getCalendarData('calendar', component) - const allTodos = existCalendarData.todos || [] - const toDeleteTodos = todos.map(item => dateUtil.toTimeStr(item)) - const remainTodos = allTodos.filter( - item => !toDeleteTodos.includes(dateUtil.toTimeStr(item)) - ) - const { dates, curYear, curMonth } = existCalendarData - const _dates = [...dates] - const currentMonthTodos = dateUtil.filterDatesByYM( - { - year: curYear, - month: curMonth - }, - remainTodos - ) - _dates.forEach(item => { - item.showTodoLabel = false - }) - currentMonthTodos.forEach(item => { - _dates[item.date - 1].showTodoLabel = !_dates[item.date - 1].choosed - }) - return renderCalendar.call(component, { - ...existCalendarData, - dates: _dates, - todos: remainTodos - }) - }, - clearTodos() { - const existCalendarData = getCalendarData('calendar', component) - const _dates = [...existCalendarData.dates] - _dates.forEach(item => { - item.showTodoLabel = false - }) - return renderCalendar.call(component, { - ...existCalendarData, - dates: _dates, - todos: [] - }) - }, - getTodos() { - return getCalendarData('calendar.todos', component) || [] - } - } - } - } -} diff --git a/utils/calendar/plugins/week.js b/utils/calendar/plugins/week.js deleted file mode 100644 index 673fb7e..0000000 --- a/utils/calendar/plugins/week.js +++ /dev/null @@ -1,432 +0,0 @@ -/** - * @Author: drfu* - * @Description: 周视图 - * @Date: 2020-10-08 21:22:09* - * @Last Modified by: drfu - * @Last Modified time: 2020-10-12 14:39:45 - * */ - -import { renderCalendar } from '../render' -import { - getCalendarConfig, - getCalendarData, - logger, - dateUtil -} from '../utils/index' -import { calcJumpData } from '../core' - -/** - * 当月第一周所有日期 - */ -function firstWeekInMonth( - target = {}, - calendarDates = [], - calendarConfig = {} -) { - const { firstDayOfWeek } = calendarConfig - const firstDayOfWeekIsMon = firstDayOfWeek === 'Mon' - const { year, month } = target - let firstDay = dateUtil.getDayOfWeek(year, month, 1) - if (firstDayOfWeekIsMon && firstDay === 0) { - firstDay = 7 - } - const [, end] = [0, 7 - firstDay] - return calendarDates.slice(0, firstDayOfWeekIsMon ? end + 1 : end) -} - -/** - * 当月最后一周所有日期 - */ -function lastWeekInMonth(target = {}, calendarDates = [], calendarConfig = {}) { - const { firstDayOfWeek } = calendarConfig - const firstDayOfWeekIsMon = firstDayOfWeek === 'Mon' - const { year, month } = target - const lastDay = dateUtil.getDatesCountOfMonth(year, month) - let lastDayWeek = dateUtil.getDayOfWeek(year, month, lastDay) - if (firstDayOfWeekIsMon && lastDayWeek === 0) { - lastDayWeek = 7 - } - const [start, end] = [lastDay - lastDayWeek, lastDay] - return calendarDates.slice(firstDayOfWeekIsMon ? start : start - 1, end) -} - -/** - * 判断目标日期是否在某些指定日历内 - */ -function dateIsInDatesRange(target, dates) { - if (!target || !dates || !dates.length) return false - const targetDateStr = dateUtil.toTimeStr(target) - let rst = false - for (let date of dates) { - const dateStr = dateUtil.toTimeStr(date) - if (dateStr === targetDateStr) { - rst = true - return rst - } - rst = false - } - return rst -} - -function getDatesWhenTargetInFirstWeek(target, firstWeekDates) { - const { year, month } = target - const prevMonthInfo = dateUtil.getPrevMonthInfo({ year, month }) - let lastMonthDatesCount = dateUtil.getDatesCountOfMonth( - prevMonthInfo.year, - prevMonthInfo.month - ) - let dates = firstWeekDates - let firstWeekCount = firstWeekDates.length - for (let i = 0; i < 7 - firstWeekCount; i++) { - const week = dateUtil.getDayOfWeek(+year, +month, lastMonthDatesCount) - dates.unshift({ - year: prevMonthInfo.year, - month: prevMonthInfo.month, - date: lastMonthDatesCount, - week - }) - lastMonthDatesCount -= 1 - } - return dates -} - -function getDatesWhenTargetInLastWeek(target, lastWeekDates) { - const { year, month } = target - const prevMonthInfo = dateUtil.getNextMonthInfo({ year, month }) - let dates = lastWeekDates - let lastWeekCount = lastWeekDates.length - for (let i = 0; i < 7 - lastWeekCount; i++) { - const week = dateUtil.getDayOfWeek(+year, +month, i + 1) - dates.push({ - year: prevMonthInfo.year, - month: prevMonthInfo.month, - date: i + 1, - week - }) - } - return dates -} - -function getDates(target, calendarDates = [], calendarConfig = {}) { - const { year, month, date } = target - const targetDay = dateUtil.getDayOfWeek(year, month, date) - const { firstDayOfWeek } = calendarConfig - const firstDayOfWeekIsMon = firstDayOfWeek === 'Mon' - if (firstDayOfWeekIsMon) { - const startIdx = date - (targetDay || 7) - return calendarDates.splice(startIdx, 7) - } else { - const startIdx = date - targetDay - 1 - return calendarDates.splice(startIdx, 7) - } -} - -function getTargetWeekDates(target, calendarConfig) { - if (!target) return - const { year, month } = target - const calendarDates = dateUtil.calcDates(year, month) - const firstWeekDates = firstWeekInMonth(target, calendarDates, calendarConfig) - const lastWeekDates = lastWeekInMonth(target, calendarDates, calendarConfig) - if (dateIsInDatesRange(target, firstWeekDates)) { - return getDatesWhenTargetInFirstWeek(target, firstWeekDates) - } else if (dateIsInDatesRange(target, lastWeekDates)) { - return getDatesWhenTargetInLastWeek(target, lastWeekDates) - } else { - return getDates(target, calendarDates, calendarConfig) - } -} - -/** - * 计算周视图下当前这一周最后一天 - */ -function calculateLastDateOfCurrentWeek(calendarData = {}) { - const { dates = [] } = calendarData - return dates[dates.length - 1] -} -/** - * 计算周视图下当前这一周第一天 - */ -function calculateFirstDateOfCurrentWeek(calendarData = {}) { - const { dates } = calendarData - return dates[0] -} - -/** - * 计算下一周的日期 - */ -function calculateNextWeekDates(calendarData = {}) { - let { curYear, curMonth } = calendarData - let calendarDates = [] - let lastDateInThisWeek = calculateLastDateOfCurrentWeek(calendarData) - const { year: LYear, month: LMonth } = lastDateInThisWeek - if (curYear !== LYear || curMonth !== LMonth) { - calendarDates = dateUtil.calcDates(LYear, LMonth) - curYear = LYear - curMonth = LMonth - } else { - calendarDates = dateUtil.calcDates(curYear, curMonth) - } - const lastDateInThisMonth = dateUtil.getDatesCountOfMonth(curYear, curMonth) - const count = lastDateInThisMonth - lastDateInThisWeek.date - const lastDateIdx = calendarDates.findIndex( - date => dateUtil.toTimeStr(date) === dateUtil.toTimeStr(lastDateInThisWeek) - ) - const startIdx = lastDateIdx + 1 - if (count >= 7) { - return { - dates: calendarDates.splice(startIdx, 7), - year: curYear, - month: curMonth - } - } else { - const nextMonth = dateUtil.getNextMonthInfo({ - year: curYear, - month: curMonth - }) - const { year, month } = nextMonth || {} - const calendarDatesOfNextMonth = dateUtil.calcDates(year, month) - const remainDatesOfThisMonth = calendarDates.splice(startIdx) - const patchDatesOfNextMonth = calendarDatesOfNextMonth.splice( - 0, - 7 - remainDatesOfThisMonth.length - ) - return { - dates: [...remainDatesOfThisMonth, ...patchDatesOfNextMonth], - ...nextMonth - } - } -} - -/** - * 计算上一周的日期 - */ -function calculatePrevWeekDates(calendarData = {}) { - let { curYear, curMonth } = calendarData - let firstDateInThisWeek = calculateFirstDateOfCurrentWeek(calendarData) - let calendarDates = [] - const { year: FYear, month: FMonth } = firstDateInThisWeek - if (curYear !== FYear || curMonth !== FMonth) { - calendarDates = dateUtil.calcDates(FYear, FMonth) - curYear = FYear - curMonth = FMonth - } else { - calendarDates = dateUtil.calcDates(curYear, curMonth) - } - const firstDateIdx = calendarDates.findIndex( - date => dateUtil.toTimeStr(date) === dateUtil.toTimeStr(firstDateInThisWeek) - ) - if (firstDateIdx - 7 >= 0) { - const startIdx = firstDateIdx - 7 - return { - dates: calendarDates.splice(startIdx, 7), - year: curYear, - month: curMonth - } - } else { - const prevMonth = dateUtil.getPrevMonthInfo({ - year: curYear, - month: curMonth - }) - const { year, month } = prevMonth || {} - const calendarDatesOfPrevMonth = dateUtil.calcDates(year, month) - const remainDatesOfThisMonth = calendarDates.splice( - 0, - firstDateInThisWeek.date - 1 - ) - const patchDatesOfPrevMonth = calendarDatesOfPrevMonth.splice( - -(7 - remainDatesOfThisMonth.length) - ) - return { - dates: [...patchDatesOfPrevMonth, ...remainDatesOfThisMonth], - ...prevMonth - } - } -} - -export default () => { - return { - name: 'week', - beforeRender(calendarData = {}, calendarConfig = {}, component) { - const { initializedWeekMode, selectedDates } = calendarData - if (calendarConfig.weekMode && !initializedWeekMode) { - const { defaultDate } = calendarConfig - const target = - (selectedDates && selectedDates[0]) || - (defaultDate && dateUtil.transformDateRow2Dict(defaultDate)) || - dateUtil.todayFMD() - const waitRenderData = this.methods( - component - ).__calcDatesWhenSwitchView('week', target) - const { data, config } = waitRenderData || {} - const setSelectDates = this.methods( - component - ).__selectTargetDateWhenJump(target, data.dates, config) - return { - calendarData: { - ...data, - ...setSelectDates, - weeksCh: dateUtil.getWeekHeader(calendarConfig.firstDayOfWeek), - initializedWeekMode: true - }, - calendarConfig - } - } - return { - calendarData, - calendarConfig - } - }, - onSwitchCalendar(target = {}, calendarData = {}, component) { - const { direction } = target - const { curYear, curMonth } = calendarData - const calendarConfig = getCalendarConfig(component) - let waitRenderData = {} - if (calendarConfig.weekMode) { - if (direction === 'left') { - waitRenderData = calculateNextWeekDates(calendarData) - } else { - waitRenderData = calculatePrevWeekDates(calendarData) - } - const { dates, year, month } = waitRenderData - return { - ...calendarData, - dates, - curYear: year || curYear, - curMonth: month || curMonth - } - } - return calendarData - }, - methods(component) { - return { - __selectTargetDateWhenJump: (target = {}, dates = [], config = {}) => { - let selectedDate = target - const weekDates = dates.map((date, idx) => { - const tmp = { ...date } - tmp.id = idx - const isTarget = - dateUtil.toTimeStr(target) === dateUtil.toTimeStr(tmp) - if (isTarget && !target.choosed && config.autoChoosedWhenJump) { - tmp.choosed = true - selectedDate = tmp - } - return tmp - }) - return { - dates: weekDates, - selectedDates: [selectedDate] - } - }, - __calcDatesForWeekMode(target, config = {}, calendarData = {}) { - const { year, month } = target || {} - const weekDates = getTargetWeekDates(target, config) - weekDates.forEach((date, idx) => (date.id = idx)) - return { - data: { - ...calendarData, - prevMonthGrids: null, - nextMonthGrids: null, - dates: weekDates, - curYear: year, - curMonth: month - }, - config: { - ...config, - weekMode: true - } - } - }, - __calcDatesForMonthMode(target, config = {}, calendarData = {}) { - const { year, month } = target || {} - const waitRenderData = calcJumpData({ - dateInfo: target, - config - }) - return { - data: { - ...calendarData, - ...waitRenderData, - curYear: year, - curMonth: month - }, - config: { - ...config, - weekMode: false - } - } - }, - /** - * 周、月视图切换 - * @param {string} view 视图 [week, month] - * @param {object} target - */ - __calcDatesWhenSwitchView: (view, target) => { - const calendarConfig = getCalendarConfig(component) - if (calendarConfig.multi) - return logger.warn('多选模式不能切换周月视图') - const existCalendarData = getCalendarData('calendar', component) || {} - const { - selectedDates = [], - dates = [], - curYear, - curMonth - } = existCalendarData - const currentMonthSelected = selectedDates.filter( - item => curYear === +item.year || curMonth === +item.month - ) - let jumpTarget = {} - if (target) { - jumpTarget = target - } else { - if (currentMonthSelected.length) { - jumpTarget = currentMonthSelected.pop() - } else { - jumpTarget = dates[0] - } - } - if (view === 'week') { - return this.methods(component).__calcDatesForWeekMode( - jumpTarget, - calendarConfig, - existCalendarData - ) - } else { - return this.methods(component).__calcDatesForMonthMode( - jumpTarget, - calendarConfig, - existCalendarData - ) - } - }, - weekModeJump: dateInfo => { - const target = dateInfo || dateUtil.todayFMD() - const existCalendarData = getCalendarData('calendar', component) || {} - const waitRenderData = this.methods( - component - ).__calcDatesWhenSwitchView('week', target) - const { data, config } = waitRenderData || {} - const setSelectDates = this.methods( - component - ).__selectTargetDateWhenJump(target, data.dates, config) - return renderCalendar.call( - component, - { - ...existCalendarData, - ...data, - ...setSelectDates - }, - config - ) - }, - switchView: (view, target) => { - const waitRenderData = this.methods( - component - ).__calcDatesWhenSwitchView(view, target) - const { data, config } = waitRenderData || {} - if (!data) return logger.warn('当前状态不能切换为周视图') - return renderCalendar.call(component, data, config) - } - } - } - } -} diff --git a/utils/calendar/render.js b/utils/calendar/render.js deleted file mode 100644 index 0c1dd37..0000000 --- a/utils/calendar/render.js +++ /dev/null @@ -1,51 +0,0 @@ -import plugins from './plugins/index' -import { getCalendarConfig } from './utils/index' - -/** - * 渲染日历 - */ -export function renderCalendar(calendarData, calendarConfig) { - return new Promise(resolve => { - const Component = this - if (Component.firstRender === void 0) { - Component.firstRender = true - } else { - Component.firstRender = false - } - const exitData = Component.data.calendar || {} - for (let plugin of plugins.installed) { - const [, p] = plugin - if (typeof p.beforeRender === 'function') { - const { - calendarData: newData, - calendarConfig: newConfig - } = p.beforeRender( - { ...exitData, ...calendarData }, - calendarConfig || getCalendarConfig(Component), - Component - ) - calendarData = newData - calendarConfig = newConfig - } - } - - Component.setData( - { - config: calendarConfig, - calendar: calendarData - }, - () => { - const rst = { - calendar: calendarData, - config: calendarConfig, - firstRender: Component.firstRender - } - resolve(rst) - if (Component.firstRender) { - Component.triggerEvent('afterCalendarRender', rst) - Component.firstRender = false - } - } - ) - }) -} diff --git a/utils/calendar/theme/iconfont.wxss b/utils/calendar/theme/iconfont.wxss deleted file mode 100644 index 062b3c6..0000000 --- a/utils/calendar/theme/iconfont.wxss +++ /dev/null @@ -1,29 +0,0 @@ -@font-face { - font-family: 'iconfont'; - src: url(data:font/truetype;charset=utf-8;base64,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) format('truetype'); - font-weight: normal; - font-style: normal; -} - -.iconfont { - font-family: "iconfont" !important; - font-size: 16px; - font-style: normal; - -webkit-font-smoothing: antialiased; -} - -.icon-right::before { - content: "\e7eb"; -} - -.icon-left::before { - content: "\e7ec"; -} - -.icon-doubleleft::before { - content: "\e7ed"; -} - -.icon-doubleright::before { - content: "\e7ee"; -} diff --git a/utils/calendar/theme/theme-default.wxss b/utils/calendar/theme/theme-default.wxss deleted file mode 100644 index 442e9b2..0000000 --- a/utils/calendar/theme/theme-default.wxss +++ /dev/null @@ -1,61 +0,0 @@ - -/* 日历主要颜色相关样式 */ - -.default_color, -.default_weekend-color, -.default_handle-color, -.default_week-color { - color: #333; -} - -.default_today { - color: #fff; - background-color: #874fb4; -} - -.default_choosed { - color: #fff; - background-color: #7ACFA6; -} - -.default_date-disable { - color: #c7c7c7; -} - -.default_choosed.default_date-disable { - color: #e2e2e2; - background-color: #c2afb6; -} - -.default_prev-month-date, -.default_next-month-date { - color: #e2e2e2; -} - -.default_normal-date { - color: #333; -} - -.default_todo-circle { - border-color: #88d2ac; -} - -.default_todo-dot { - background-color: #e54d42; -} - -.default_date-desc { - color: #c2c2c2; -} - -.default_date-desc-lunar { - color: #e54d42; -} - -.default_date-desc-disable { - color: #e2e2e2; -} - -.default_festival { - color: #c2c2c2; -} diff --git a/utils/calendar/utils/index.js b/utils/calendar/utils/index.js deleted file mode 100644 index 0dbf369..0000000 --- a/utils/calendar/utils/index.js +++ /dev/null @@ -1,284 +0,0 @@ -import Logger from './logger' -import WxData from './wxData' - -let systemInfo -export function getSystemInfo() { - if (systemInfo) return systemInfo - systemInfo = wx.getSystemInfoSync() - return systemInfo -} - -export function isIos() { - const sys = getSystemInfo() - return /iphone|ios/i.test(sys.platform) -} - -class Gesture { - /** - * 左滑 - * @param {object} e 事件对象 - * @returns {boolean} 布尔值 - */ - isLeft(gesture = {}, touche = {}) { - const { startX, startY } = gesture - const deltaX = touche.clientX - startX - const deltaY = touche.clientY - startY - if (deltaX < -60 && deltaY < 20 && deltaY > -20) { - return true - } else { - return false - } - } - /** - * 右滑 - * @param {object} e 事件对象 - * @returns {boolean} 布尔值 - */ - isRight(gesture = {}, touche = {}) { - const { startX, startY } = gesture - const deltaX = touche.clientX - startX - const deltaY = touche.clientY - startY - - if (deltaX > 60 && deltaY < 20 && deltaY > -20) { - return true - } else { - return false - } - } -} - -class DateUtil { - newDate(year, month, date) { - let cur = `${+year}-${+month}-${+date}` - if (isIos()) { - cur = `${+year}/${+month}/${+date}` - } - return new Date(cur) - } - /** - * 计算指定日期时间戳 - * @param {object} date - */ - getTimeStamp(dateInfo) { - if (typeof dateInfo === 'string') { - dateInfo = this.transformDateRow2Dict(dateInfo) - } - if (Object.prototype.toString.call(dateInfo) !== '[object Object]') return - const dateUtil = new DateUtil() - return dateUtil - .newDate(dateInfo.year, dateInfo.month, dateInfo.date) - .getTime() - } - /** - * 计算指定月份共多少天 - * @param {number} year 年份 - * @param {number} month 月份 - */ - getDatesCountOfMonth(year, month) { - return new Date(Date.UTC(year, month, 0)).getUTCDate() - } - /** - * 计算指定月份第一天星期几 - * @param {number} year 年份 - * @param {number} month 月份 - */ - firstDayOfWeek(year, month) { - return new Date(Date.UTC(year, month - 1, 1)).getUTCDay() - } - /** - * 计算指定日期星期几 - * @param {number} year 年份 - * @param {number} month 月份 - * @param {number} date 日期 - */ - getDayOfWeek(year, month, date) { - return new Date(Date.UTC(year, month - 1, date)).getUTCDay() - } - formatTimestamp(timestamp) { - const date = new Date(timestamp) - return { - year: date.getFullYear(), - month: date.getMonth() + 1, - date: date.getDate() - } - } - todayTimestamp() { - return new Date().getTime() - } - todayFMD() { - const timestamp = this.todayTimestamp() - return this.formatTimestamp(timestamp) - } - toTimeStr(dateInfo = {}) { - return `${+dateInfo.year}-${+dateInfo.month}-${+dateInfo.date}` - } - transformDateRow2Dict(dateStr) { - if (typeof dateStr === 'string' && dateStr.includes('-')) { - const [year, month, date] = dateStr.split('-') - return this.tranformStr2NumOfDate({ - year, - month, - date - }) - } - return {} - } - tranformStr2NumOfDate(date = {}) { - const target = { ...date } - // 可能传入字符串 - target.year = +target.year - target.month = +target.month - target.date = +target.date - return target - } - sortDatesByTime(dates = [], sortType) { - return dates.sort((a, b) => { - const at = this.getTimeStamp(a) - const bt = this.getTimeStamp(b) - if (at < bt && sortType !== 'desc') { - return -1 - } else { - return 1 - } - }) - } - getPrevMonthInfo(date = {}) { - const prevMonthInfo = - Number(date.month) > 1 - ? { - year: +date.year, - month: Number(date.month) - 1 - } - : { - year: Number(date.year) - 1, - month: 12 - } - return prevMonthInfo - } - getNextMonthInfo(date = {}) { - const nextMonthInfo = - Number(date.month) < 12 - ? { - year: +date.year, - month: Number(date.month) + 1 - } - : { - year: Number(date.year) + 1, - month: 1 - } - return nextMonthInfo - } - getPrevYearInfo(date = {}) { - return { - year: Number(date.year) - 1, - month: +date.month - } - } - getNextYearInfo(date = {}) { - return { - year: Number(date.year) + 1, - month: +date.month - } - } - findDateIndexInArray(target, dates) { - return dates.findIndex( - item => dateUtil.toTimeStr(item) === dateUtil.toTimeStr(target) - ) - } - calcDates(year, month) { - const datesCount = this.getDatesCountOfMonth(year, month) - const dates = [] - const today = dateUtil.todayFMD() - for (let i = 1; i <= datesCount; i++) { - const week = dateUtil.getDayOfWeek(+year, +month, i) - const date = { - year: +year, - id: i - 1, - month: +month, - date: i, - week, - isToday: - +today.year === +year && +today.month === +month && i === +today.date - } - dates.push(date) - } - return dates - } - /** - * 日期数组根据日期去重 - * @param {array} array 数组 - */ - uniqueArrayByDate(array = []) { - let uniqueObject = {} - let uniqueArray = [] - array.forEach(item => { - uniqueObject[dateUtil.toTimeStr(item)] = item - }) - for (let i in uniqueObject) { - uniqueArray.push(uniqueObject[i]) - } - return uniqueArray - } - /** - * 筛选指定年月日期 - * @param {object} target 指定年月 - * @param {array} dates 待筛选日期 - */ - filterDatesByYM(target, dates) { - if (target) { - const { year, month } = target - const _dates = dates.filter( - item => +item.year === +year && +item.month === +month - ) - return _dates - } - return dates - } - getWeekHeader(firstDayOfWeek) { - let weeksCh = ['日', '一', '二', '三', '四', '五', '六'] - if (firstDayOfWeek === 'Mon') { - weeksCh = ['一', '二', '三', '四', '五', '六', '日'] - } - return weeksCh - } -} - -/** - * 获取当前页面实例 - */ -export function getCurrentPage() { - const pages = getCurrentPages() || [] - const last = pages.length - 1 - return pages[last] || {} -} - -export function getComponentById(componentId) { - const logger = new Logger() - let page = getCurrentPage() || {} - if (page.selectComponent && typeof page.selectComponent === 'function') { - if (componentId) { - return page.selectComponent(componentId) - } else { - logger.warn('请传入组件ID') - } - } else { - logger.warn('该基础库暂不支持多个小程序日历组件') - } -} - -export const logger = new Logger() -export const calendarGesture = new Gesture() -export const dateUtil = new DateUtil() -export const getCalendarData = (key, component) => - new WxData(component).getData(key) -export const setCalendarData = (data, component) => - new WxData(component).setData(data) -export const getCalendarConfig = component => - getCalendarData('config', component) -export const setCalendarConfig = (config, component) => - setCalendarData( - { - config - }, - component - ) diff --git a/utils/calendar/utils/logger.js b/utils/calendar/utils/logger.js deleted file mode 100644 index b440ba6..0000000 --- a/utils/calendar/utils/logger.js +++ /dev/null @@ -1,23 +0,0 @@ -export default class Logger { - info(msg) { - console.log( - '%cInfo: %c' + msg, - 'color:#FF0080;font-weight:bold', - 'color: #FF509B' - ) - } - warn(msg) { - console.log( - '%cWarn: %c' + msg, - 'color:#FF6600;font-weight:bold', - 'color: #FF9933' - ) - } - tips(msg) { - console.log( - '%cTips: %c' + msg, - 'color:#00B200;font-weight:bold', - 'color: #00CC33' - ) - } -} diff --git a/utils/calendar/utils/wxData.js b/utils/calendar/utils/wxData.js deleted file mode 100644 index 43b254d..0000000 --- a/utils/calendar/utils/wxData.js +++ /dev/null @@ -1,30 +0,0 @@ -class WxData { - constructor(component) { - this.Component = component - } - getData(key) { - const data = this.Component.data - if (!key) return data - if (key.includes('.')) { - let keys = key.split('.') - const tmp = keys.reduce((prev, next) => { - return prev[next] - }, data) - return tmp - } else { - return this.Component.data[key] - } - } - setData(data) { - return new Promise((resolve, reject) => { - if (!data) return reject('no data to set') - if (typeof data === 'object') { - this.Component.setData(data, () => { - resolve(data) - }) - } - }) - } -} - -export default WxData diff --git a/utils/canvasdrawer/canvasdrawer.js b/utils/canvasdrawer/canvasdrawer.js index 6ed708c..dfcb1aa 100644 --- a/utils/canvasdrawer/canvasdrawer.js +++ b/utils/canvasdrawer/canvasdrawer.js @@ -1,5 +1,4 @@ /* global Component wx */ - Component({ properties: { painting: { @@ -89,7 +88,7 @@ Component({ }, startPainting () { const { tempFileList, painting: { views } } = this.data - console.log(tempFileList) + console.log(tempFileList); for (let i = 0, imageIndex = 0; i < views.length; i++) { if (views[i].type === 'image') { this.drawImage({ @@ -284,4 +283,4 @@ Component({ }, this) } } -}) \ No newline at end of file +}) diff --git a/utils/iconfont.wxss b/utils/iconfont.wxss deleted file mode 100644 index 50c7e41..0000000 --- a/utils/iconfont.wxss +++ /dev/null @@ -1,134 +0,0 @@ -@font-face { - font-family: 'iconfont'; /* Project id 2595220 */ - src: url('//at.alicdn.com/t/c/font_2595220_zeufk5pdrnb.woff2?t=1681224149963') format('woff2'), - url('//at.alicdn.com/t/c/font_2595220_zeufk5pdrnb.woff?t=1681224149963') format('woff'), - url('//at.alicdn.com/t/c/font_2595220_zeufk5pdrnb.ttf?t=1681224149963') format('truetype'); -} - -.iconfont { - font-family: "iconfont" !important; - font-size: 16px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-yu:before { - content: "\e607"; -} - -.icon-biye:before { - content: "\e605"; -} - -.icon-plane:before { - content: "\e627"; -} - -.icon-tel:before { - content: "\e606"; -} - -.icon-dianfei:before { - content: "\e622"; -} - -.icon-diqiu:before { - content: "\e600"; -} - -.icon-zhengjian:before { - content: "\e60a"; -} - -.icon-tushuguan:before { - content: "\e78e"; -} - -.icon-qiankuanjiesuan:before { - content: "\e630"; -} - -.icon-jiaoshikebiao:before { - content: "\e623"; -} - -.icon-banjikebiao:before { - content: "\e631"; -} - -.icon-dushuma:before { - content: "\e845"; -} - -.icon-chengji:before { - content: "\e601"; -} - -.icon-bangdan:before { - content: "\e610"; -} - -.icon-CET:before { - content: "\e603"; -} - -.icon-wodekebiao:before { - content: "\ef0b"; -} - -.icon-xiaoli:before { - content: "\e625"; -} - -.icon-gongrenhuamingce:before { - content: "\e672"; -} - -.icon-wangluo:before { - content: "\e640"; -} - -.icon-tubiao_ditu:before { - content: "\e68a"; -} - -.icon-xiaoai:before { - content: "\e608"; -} - -.icon-daba:before { - content: "\e604"; -} - -.icon-tuijian:before { - content: "\e602"; -} - -.icon-lost:before { - content: "\e632"; -} - -.icon-runsteps:before { - content: "\e637"; -} - -.icon-finance:before { - content: "\e668"; -} - -.icon-card:before { - content: "\e6c6"; -} - -.icon-booksearch:before { - content: "\eb58"; -} - -.icon-cabinet:before { - content: "\e77a"; -} - -.icon-movie:before { - content: "\e70d"; -} diff --git a/utils/time.js b/utils/time.js new file mode 100644 index 0000000..e27d315 --- /dev/null +++ b/utils/time.js @@ -0,0 +1,42 @@ +function formatTime(date) { + var year = date.getFullYear() + var month = date.getMonth() + 1 + var day = date.getDate() + var hour = date.getHours() + var minute = date.getMinutes() + + var d = new Date() + var weekday = new Array(7) + weekday[0] = "星期日" + weekday[1] = "星期一" + weekday[2] = "星期二" + weekday[3] = "星期三" + weekday[4] = "星期四" + weekday[5] = "星期五" + weekday[6] = "星期六" + + return year + "年" + month + "月" + day + "日" + " " + weekday[d.getDay()] + ' ' + hour + "点" +} + +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} + +function CompareDate(t1, t2) { + var date = new Date(); + var t1Arr = t1.split(':'); + var t2Arr = t2.split(':'); + if (t1Arr[0] - t2Arr[0] < 0) { + return true; + } else if (t1Arr[0] == t2Arr[0]) { + if (t1Arr[1] - t2Arr[1] < 0) + return true; + } else { + return false; + } +} +module.exports = { + formatTime: formatTime, + CompareDate: CompareDate +} \ No newline at end of file diff --git a/utils/util.js b/utils/util.js index 0bbc2f4..7b616fb 100644 --- a/utils/util.js +++ b/utils/util.js @@ -1,3 +1,21 @@ +function networkStatus() { + wx.getNetworkType({ + success: function(res) { + if (res.errMsg !== 'getNetworkType:ok') { + wx.showModal({ + content: '获取网络状态失败' + }) + return false; + } + if (res.networkType === 'none') { + wx.showModal({ + content: '当前网络不可用,请检查网络设置' + }) + return false; + } + } + }) +} const formatTime = date => { const year = date.getFullYear() const month = date.getMonth() + 1 @@ -13,94 +31,62 @@ const formatNumber = n => { n = n.toString() return n[1] ? n : '0' + n } - //格式化时间 -function wecquFormatTime(date, t) { +function formatTimes(date, t) { var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); var hour = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); - if(t === 'h:m') { return [hour, minute].map(formatNumber).join(':'); } - else { return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':'); } -} - -function CompareDate(t1, t2) { - var date = new Date(); - var t1Arr = t1.split(':'); - var t2Arr = t2.split(':'); - if (t1Arr[0] - t2Arr[0] < 0) { - return true; - } else if (t1Arr[0] == t2Arr[0]) { - if (t1Arr[1] - t2Arr[1] < 0) - return true; + if (t === 'h:m') { + return [hour, minute].map(formatNumber).join(':'); } else { - return false; + return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':'); } } -function formatDateTime(inputTime, type) { - var date = new Date(inputTime); - var y = date.getFullYear(); - var m = date.getMonth() + 1; - m = m < 10 ? ('0' + m) : m; - var d = date.getDate(); - d = d < 10 ? ('0' + d) : d; - var h = date.getHours(); - h = h < 10 ? ('0' + h) : h; - var minute = date.getMinutes(); - var second = date.getSeconds(); - minute = minute < 10 ? ('0' + minute) : minute; - second = second < 10 ? ('0' + second) : second; - if(type) { - return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second;//2017-12-12 12:23:34 +function needThisWeekGo(thisweek, weekStr) { + console.log(thisweek) + var thisweek = thisweek; + const pattern1 = /\d{1,2}\-\d{1,2},\d{1,2}\-\d{1,2}\(周\)/; + const pattern2 = /\d{1,2}\-\d{1,2}\(周\)/; + const pattern3 = /\d{1,2}\(周\)/; + var p1Arr = weekStr.match(/\d{1,2}-\d{1,2}/g); + var p2Arr = weekStr.match(pattern2); + var p3Arr = weekStr.match(pattern3); + console.log(p2Arr) + + // console.log(weekStr.match(pattern3)) + if (weekStr.search(pattern1) > -1) { + let p1Arr1 = p1Arr[0].split('-'); + let p1Arr2 = p1Arr[1].split('-'); + if ((thisweek >= p1Arr1[0] && thisweek <= p1Arr1[1]) || (thisweek >= p1Arr2[0] && thisweek <= p1Arr2[1])) { + return true; } else { - return y + '-' + m + '-' + d; //2017-12-12 + return false; } + } else if (weekStr.search(pattern2) > -1) { + let p2Arr1 = p2Arr[0].split('-'); + if (thisweek >= p2Arr1[0] && thisweek <= p2Arr1[1]) { + return true; + } else { + return false; + } + } else if (weekStr.search(pattern3) > -1) { + let p3Arr1 = p3Arr[0].split('('); + if (thisweek == p3Arr1[0]) { + return true; + } else { + return false; + } + } else { + console.log('util.js无法处理传入的参数'); + console.log(weekStr.search(pattern1)); + } } - -//格局化日期:yyyy-MM-dd -function formatDate(date) { - var myyear = date.getFullYear(); - var mymonth = date.getMonth()+1; - var myweekday = date.getDate(); - - if(mymonth < 10){ - mymonth = "0" + mymonth; - } - if(myweekday < 10){ - myweekday = "0" + myweekday; - } - return (myyear+"-"+mymonth + "-" + myweekday); -} - -function getCourseNoticeTimestamp (whichDayOfWeek, clocktime) { - clocktime = clocktime.length < 5 ? '0' + clocktime : clocktime; - var now = new Date(); //当前日期 - var nowDayOfWeek = now.getDay(); //今天本周的第几天 - var nowDay = now.getDate(); //当前日 - var nowMonth = now.getMonth(); //当前月 - var nowYear = now.getYear(); //当前年 - nowYear += (nowYear < 2000) ? 1900 : 0; - var weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1); - var en_dayWeek_array = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday','sunday']; - var whichDayOfWeekIndex = en_dayWeek_array.indexOf(whichDayOfWeek) ? en_dayWeek_array.indexOf(whichDayOfWeek) : 0; - var targetDayDate = formatDateTime(weekStartDate.getTime() + whichDayOfWeekIndex*3600000*24); - var finalDatetime = targetDayDate + ' ' + clocktime + ':00.0'; - // console.log(finalDatetime) - finalDatetime = finalDatetime.substring(0,19); - finalDatetime = finalDatetime.replace(/-/g,'/'); - var result = new Date(finalDatetime).getTime().toString().slice(0, -3); - // console.log(result) - return result; -} - module.exports = { + formatTimes: formatTimes, formatTime: formatTime, - wecquFormatTime: wecquFormatTime, - CompareDate: CompareDate, - getCourseNoticeTimestamp: getCourseNoticeTimestamp, - formatDate: formatDate, - formatDateTime: formatDateTime -} + needThisWeekGo: needThisWeekGo, +} \ No newline at end of file