Commit aa2980c5e3f9c3732d64d07aca3d57f9bd319cd8
0 parents
Exists in
master
feat:创建应用
Showing
70 changed files
with
2230 additions
and
0 deletions
Show diff stats
| 1 | +++ a/api/request.js | |
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +import { | |
| 2 | + host | |
| 3 | +} from '../config.js' | |
| 4 | +const request = options => { | |
| 5 | + return new Promise((resolve, reject) => { | |
| 6 | + const { | |
| 7 | + data, | |
| 8 | + method, | |
| 9 | + url, | |
| 10 | + header | |
| 11 | + } = options | |
| 12 | + if (data && method !== 'get'&&!header) { | |
| 13 | + options.data = JSON.stringify(data) | |
| 14 | + } | |
| 15 | + options.url = `${host}` + url | |
| 16 | + wx.request({ | |
| 17 | + header: header?header:{ | |
| 18 | + 'Content-Type': 'application/json' | |
| 19 | + }, | |
| 20 | + ...options, | |
| 21 | + success: function (res) { | |
| 22 | + // console.log(res); | |
| 23 | + // wx.request成功发出了请求,无论返回什么http状态码,都会走success | |
| 24 | + if (res.statusCode === 200) { | |
| 25 | + resolve(res.data) | |
| 26 | + } else { | |
| 27 | + // reject(res.data) | |
| 28 | + wx.showToast({ | |
| 29 | + title: res.data.error, | |
| 30 | + icon: 'none', | |
| 31 | + duration: 2000 | |
| 32 | + }) | |
| 33 | + } | |
| 34 | + }, | |
| 35 | + fail: function (res) { | |
| 36 | + // 遇到断网,域名解析有问题,或者尤其是我们去调用restful api时,可能会在url格式,参数类型上出些问题,这些情况下才会调用到fail | |
| 37 | + reject(res.data) | |
| 38 | + wx.hideLoading() | |
| 39 | + wx.showToast({ | |
| 40 | + title: '接口调用失败', | |
| 41 | + icon: 'none', | |
| 42 | + duration: 2000 | |
| 43 | + }) | |
| 44 | + } | |
| 45 | + }) | |
| 46 | + }) | |
| 47 | +} | |
| 48 | +export default request | |
| 0 | 49 | \ No newline at end of file | ... | ... |
| 1 | +++ a/app.js | |
| ... | ... | @@ -0,0 +1,126 @@ |
| 1 | +App({ | |
| 2 | + onLaunch: function () { | |
| 3 | + let that = this; | |
| 4 | + wx.getSystemInfo({ | |
| 5 | + success: res => { | |
| 6 | + let modelmes = res.model; | |
| 7 | + if (modelmes.search('iPhone X') != -1 || modelmes.search('iPhone 11') != -1 || modelmes.search('iPhone 12') != -1 || modelmes.search('iPhone 13') != -1 || modelmes.search('iPhone 14') != -1) { | |
| 8 | + that.globalData.isIphoneX = true | |
| 9 | + } | |
| 10 | + } | |
| 11 | + }) | |
| 12 | + this.overShare() | |
| 13 | + const { | |
| 14 | + model, | |
| 15 | + system, | |
| 16 | + statusBarHeight | |
| 17 | + } = wx.getSystemInfoSync() | |
| 18 | + let headHeight | |
| 19 | + if (/iphone\s{0,}x/i.test(model)) { | |
| 20 | + headHeight = 88 | |
| 21 | + } else if (system.indexOf('Android') !== -1) { | |
| 22 | + headHeight = 68 | |
| 23 | + } else { | |
| 24 | + headHeight = 64 | |
| 25 | + } | |
| 26 | + this.globalData.headerHeight = headHeight | |
| 27 | + this.globalData.statusBarHeight = statusBarHeight | |
| 28 | + this.autoUpdate() | |
| 29 | + }, | |
| 30 | + //重写分享方法 | |
| 31 | + overShare: function (options) { | |
| 32 | + //监听路由切换 | |
| 33 | + wx.onAppRoute(function (res) { | |
| 34 | + let userInfo = wx.getStorageSync('userInfo') | |
| 35 | + let name = "您的好友" | |
| 36 | + if (userInfo) { | |
| 37 | + name = userInfo.userName; | |
| 38 | + } | |
| 39 | + //获取加载的页面 | |
| 40 | + let pages = getCurrentPages(), | |
| 41 | + //获取当前页面的对象 | |
| 42 | + view = pages[pages.length - 1] | |
| 43 | + if (view) { | |
| 44 | + view.onShareAppMessage = function () { | |
| 45 | + //你的分享配置 | |
| 46 | + return { | |
| 47 | + title: name + '推荐大家都在用的升学大数据宝典', | |
| 48 | + path: '/pages/index/index', | |
| 49 | + imageUrl: 'https://proxy.shunzhi.net:51315/mp_share2.jpg', | |
| 50 | + }; | |
| 51 | + } | |
| 52 | + } | |
| 53 | + }) | |
| 54 | + }, | |
| 55 | + autoUpdate: function () { | |
| 56 | + var self = this | |
| 57 | + // 获取小程序更新机制兼容 | |
| 58 | + if (wx.canIUse('getUpdateManager')) { | |
| 59 | + const updateManager = wx.getUpdateManager() | |
| 60 | + //1. 检查小程序是否有新版本发布 | |
| 61 | + updateManager.onCheckForUpdate(function (res) { | |
| 62 | + // 请求完新版本信息的回调 | |
| 63 | + if (res.hasUpdate) { | |
| 64 | + //检测到新版本,需要更新,给出提示 | |
| 65 | + wx.showModal({ | |
| 66 | + title: '更新提示', | |
| 67 | + content: '检测到新版本,是否下载新版本并重启小程序?', | |
| 68 | + success: function (res) { | |
| 69 | + if (res.confirm) { | |
| 70 | + //2. 用户确定下载更新小程序,小程序下载及更新静默进行 | |
| 71 | + self.downLoadAndUpdate(updateManager) | |
| 72 | + } else if (res.cancel) { | |
| 73 | + //用户点击取消按钮的处理,如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了 | |
| 74 | + wx.showModal({ | |
| 75 | + title: '温馨提示~', | |
| 76 | + content: '本次版本更新涉及到新的功能添加,旧版本无法正常访问的哦~', | |
| 77 | + showCancel: false, //隐藏取消按钮 | |
| 78 | + confirmText: "确定更新", //只保留确定更新按钮 | |
| 79 | + success: function (res) { | |
| 80 | + if (res.confirm) { | |
| 81 | + //下载新版本,并重新应用 | |
| 82 | + self.downLoadAndUpdate(updateManager) | |
| 83 | + } | |
| 84 | + } | |
| 85 | + }) | |
| 86 | + } | |
| 87 | + } | |
| 88 | + }) | |
| 89 | + } | |
| 90 | + }) | |
| 91 | + } else { | |
| 92 | + // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示 | |
| 93 | + wx.showModal({ | |
| 94 | + title: '提示', | |
| 95 | + content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。' | |
| 96 | + }) | |
| 97 | + } | |
| 98 | + }, | |
| 99 | + /** | |
| 100 | + * 下载小程序新版本并重启应用 | |
| 101 | + */ | |
| 102 | + downLoadAndUpdate: function (updateManager) { | |
| 103 | + var self = this | |
| 104 | + wx.showLoading(); | |
| 105 | + //静默下载更新小程序新版本 | |
| 106 | + updateManager.onUpdateReady(function () { | |
| 107 | + wx.hideLoading() | |
| 108 | + //新的版本已经下载好,调用 applyUpdate 应用新版本并重启 | |
| 109 | + updateManager.applyUpdate() | |
| 110 | + }) | |
| 111 | + updateManager.onUpdateFailed(function () { | |
| 112 | + // 新的版本下载失败 | |
| 113 | + wx.showModal({ | |
| 114 | + title: '已经有新版本了哟~', | |
| 115 | + content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~', | |
| 116 | + }) | |
| 117 | + }) | |
| 118 | + }, | |
| 119 | + | |
| 120 | + | |
| 121 | + globalData: { | |
| 122 | + isIphoneX: false, | |
| 123 | + headerHeight: 0, | |
| 124 | + statusBarHeight: 0, | |
| 125 | + } | |
| 126 | +}) | |
| 0 | 127 | \ No newline at end of file | ... | ... |
| 1 | +++ a/app.json | |
| ... | ... | @@ -0,0 +1,40 @@ |
| 1 | +{ | |
| 2 | + "pages": [ | |
| 3 | + "pages/index/index", | |
| 4 | + "pages/index/rank/rank", | |
| 5 | + "pages/index/punchDetail/punchDetail", | |
| 6 | + "pages/index/newPunch/newPunch", | |
| 7 | + "pages/login/codeLogin/codeLogin", | |
| 8 | + "pages/login/protocol/protocol", | |
| 9 | + "pages/login/policy/policy", | |
| 10 | + "pages/mine/index", | |
| 11 | + "pages/mine/record/record", | |
| 12 | + "pages/webview/webview" | |
| 13 | + ], | |
| 14 | + "window": { | |
| 15 | + "backgroundTextStyle": "dark", | |
| 16 | + "navigationBarBackgroundColor": "#fff", | |
| 17 | + "navigationBarTitleText": "计划管家", | |
| 18 | + "navigationBarTextStyle": "black" | |
| 19 | + }, | |
| 20 | + "tabBar": { | |
| 21 | + "color": "#909090", | |
| 22 | + "selectedColor": "#5B97F2", | |
| 23 | + "borderStyle": "white", | |
| 24 | + "list": [ | |
| 25 | + { | |
| 26 | + "pagePath": "pages/index/index", | |
| 27 | + "text": "首页", | |
| 28 | + "iconPath": "./img/tab_home_normat.png", | |
| 29 | + "selectedIconPath": "./img/tab_home_selected.png" | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "pagePath": "pages/mine/index", | |
| 33 | + "text": "我的", | |
| 34 | + "iconPath": "./img/tab_mine_normat.png", | |
| 35 | + "selectedIconPath": "./img/tab_mine_selected.png" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + "sitemapLocation": "sitemap.json" | |
| 40 | +} | |
| 0 | 41 | \ No newline at end of file | ... | ... |
| 1 | +++ a/app.wxss | |
| ... | ... | @@ -0,0 +1,28 @@ |
| 1 | +/* @import "/miniprogram_npm/@vant/weapp/common/index.wxss"; */ | |
| 2 | +page{ | |
| 3 | + background: #fff; | |
| 4 | +} | |
| 5 | +/* 二级页面顶部统一返回按钮,位置可能需要根据机型调整 */ | |
| 6 | +.navigation_back{ | |
| 7 | + width: 80rpx; | |
| 8 | + height: 80rpx; | |
| 9 | + border: 1px solid rgb(255, 207, 105); | |
| 10 | + position: absolute; | |
| 11 | + top: 80rpx; | |
| 12 | + left: 0; | |
| 13 | + z-index: 99; | |
| 14 | + display: flex; | |
| 15 | + align-items: center; | |
| 16 | + justify-content: center; | |
| 17 | +} | |
| 18 | +/* 临时文件,设计稿图 */ | |
| 19 | +.temporary{ | |
| 20 | + width: 100%; | |
| 21 | + position: absolute; | |
| 22 | + top: 0; | |
| 23 | + left: 0; | |
| 24 | +} | |
| 25 | +.temporary_box{ | |
| 26 | + border: 1px solid rgb(255, 207, 105); | |
| 27 | + z-index: 98; | |
| 28 | +} | |
| 0 | 29 | \ No newline at end of file | ... | ... |
| 1 | +++ a/config.js | |
| ... | ... | @@ -0,0 +1,12 @@ |
| 1 | +//域名要在小程序的管理平台配置好,如果出现调用时报错,无效的域名,可在微信开发工具左边点项目-》配置信息-》看一下配置的域名【request合法域名】有没有刷新下来,没有的话就点下面的刷新 | |
| 2 | + | |
| 3 | +let host = 'https://proxy.shunzhi.net/'; //正式 | |
| 4 | + | |
| 5 | +let file = 'https://wxsxh.myjxt.com:51314/file-center/'; //图片上传 | |
| 6 | + | |
| 7 | +let config = { | |
| 8 | + host, | |
| 9 | + file, | |
| 10 | +}; | |
| 11 | +//对外把对象config返回 | |
| 12 | +module.exports = config | |
| 0 | 13 | \ No newline at end of file | ... | ... |
38.8 KB
40 KB
177 KB
106 KB
65.7 KB
129 KB
39.4 KB
73.8 KB
38.6 KB
39 KB
66.2 KB
114 KB
451 Bytes
454 Bytes
450 Bytes
445 Bytes
| 1 | +++ a/package-lock.json | |
| ... | ... | @@ -0,0 +1,28 @@ |
| 1 | +{ | |
| 2 | + "name": "sxhClockIn", | |
| 3 | + "version": "2.0.0", | |
| 4 | + "lockfileVersion": 2, | |
| 5 | + "requires": true, | |
| 6 | + "packages": { | |
| 7 | + "": { | |
| 8 | + "name": "sxhClockIn", | |
| 9 | + "version": "2.0.0", | |
| 10 | + "license": "ISC", | |
| 11 | + "dependencies": { | |
| 12 | + "@vant/weapp": "^1.10.5" | |
| 13 | + } | |
| 14 | + }, | |
| 15 | + "node_modules/@vant/weapp": { | |
| 16 | + "version": "1.10.5", | |
| 17 | + "resolved": "https://registry.npmmirror.com/@vant/weapp/-/weapp-1.10.5.tgz", | |
| 18 | + "integrity": "sha512-bAHp9r0ZiRsOqPOLzQHI/ZvkAlXzol1/TFhM70MyghuxkzJTjcDUd8RIfLkCN3c1MCK/PfBGw2an8/afygftCg==" | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "dependencies": { | |
| 22 | + "@vant/weapp": { | |
| 23 | + "version": "1.10.5", | |
| 24 | + "resolved": "https://registry.npmmirror.com/@vant/weapp/-/weapp-1.10.5.tgz", | |
| 25 | + "integrity": "sha512-bAHp9r0ZiRsOqPOLzQHI/ZvkAlXzol1/TFhM70MyghuxkzJTjcDUd8RIfLkCN3c1MCK/PfBGw2an8/afygftCg==" | |
| 26 | + } | |
| 27 | + } | |
| 28 | +} | ... | ... |
| 1 | +++ a/package.json | |
| ... | ... | @@ -0,0 +1,18 @@ |
| 1 | +{ | |
| 2 | + "name": "sxh_clock_in", | |
| 3 | + "version": "1.0.0", | |
| 4 | + "description": "计划管家", | |
| 5 | + "main": "app.js", | |
| 6 | + "dependencies": { | |
| 7 | + "@vant/weapp": "^1.10.5" | |
| 8 | + }, | |
| 9 | + "scripts": { | |
| 10 | + "test": "echo \"Error: no test specified\" && exit 1" | |
| 11 | + }, | |
| 12 | + "repository": { | |
| 13 | + "type": "git", | |
| 14 | + "url": "http://git.shunzhi.net/sxhgroup/sxhClockIn.git" | |
| 15 | + }, | |
| 16 | + "author": "ShunZhi Inc.", | |
| 17 | + "license": "ISC" | |
| 18 | +} | ... | ... |
| 1 | +++ a/pages/index/index.js | |
| ... | ... | @@ -0,0 +1,68 @@ |
| 1 | +//获取应用实例 | |
| 2 | +var app = getApp(); | |
| 3 | +import request from '../../api/request.js' | |
| 4 | + | |
| 5 | +Page({ | |
| 6 | + data: { | |
| 7 | + showAdd: false, //新建打卡 | |
| 8 | + // bannerList: [], // 轮播图 | |
| 9 | + }, | |
| 10 | + /** | |
| 11 | + * 生命周期函数--监听页面加载 | |
| 12 | + */ | |
| 13 | + onLoad: function (options) { | |
| 14 | + // this.getBannerList() //获取banner | |
| 15 | + }, | |
| 16 | + // 排行榜 | |
| 17 | + handleRank(){ | |
| 18 | + wx.navigateTo({ | |
| 19 | + url: '/pages/index/rank/rank', | |
| 20 | + }) | |
| 21 | + }, | |
| 22 | + handleAdd() { | |
| 23 | + this.setData({ | |
| 24 | + showAdd: true | |
| 25 | + }) | |
| 26 | + }, | |
| 27 | + closeAdd() { | |
| 28 | + this.setData({ | |
| 29 | + showAdd: false | |
| 30 | + }) | |
| 31 | + }, | |
| 32 | + // 去打卡 | |
| 33 | + handleDetail(){ | |
| 34 | + wx.navigateTo({ | |
| 35 | + url: '/pages/index/punchDetail/punchDetail', | |
| 36 | + }) | |
| 37 | + }, | |
| 38 | + // 自定义模板 | |
| 39 | + handleNewPunch(){ | |
| 40 | + wx.navigateTo({ | |
| 41 | + url: '/pages/index/newPunch/newPunch', | |
| 42 | + }) | |
| 43 | + }, | |
| 44 | + // 获取banner图 | |
| 45 | + // getBannerList() { | |
| 46 | + // request({ | |
| 47 | + // url: `admin/Voluntary/GetBannerList`, | |
| 48 | + // method: 'post', | |
| 49 | + // data: { | |
| 50 | + // bannerType: 1, | |
| 51 | + // page: 1, | |
| 52 | + // pageSize: 10 | |
| 53 | + // }, | |
| 54 | + // }).then(res => { | |
| 55 | + // if (res.success) { | |
| 56 | + // this.setData({ | |
| 57 | + // bannerList: res.data.list, | |
| 58 | + // }) | |
| 59 | + // } | |
| 60 | + // }) | |
| 61 | + // }, | |
| 62 | + /** | |
| 63 | + * 用户点击右上角分享 | |
| 64 | + */ | |
| 65 | + onShareAppMessage: function () { | |
| 66 | + | |
| 67 | + }, | |
| 68 | +}) | |
| 0 | 69 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/index.wxml | |
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +<view class="main"> | |
| 2 | + <image class="temporary" src="/img/_index1.png" mode="widthFix" alt="" /> | |
| 3 | + <!-- 排行榜 --> | |
| 4 | + <text class="temporary_box" style="width: 370rpx;height: 100rpx;position: absolute;top: 192rpx;left: 20rpx;" bindtap="handleRank"></text> | |
| 5 | + <!-- 去打卡 --> | |
| 6 | + <text class="temporary_box" style="width: 370rpx;height: 100rpx;position: absolute;top: 1000rpx;right: 20rpx;" bindtap="handleDetail"></text> | |
| 7 | + <!-- 新建打卡 --> | |
| 8 | + <text class="temporary_box" style="width: 120rpx;height: 120rpx;position: absolute;top: 1200rpx;right: 20rpx;" bindtap="handleAdd"></text> | |
| 9 | + <van-popup show="{{ showAdd }}" position="bottom" custom-style="height: 80%;" bind:close="closeAdd"> | |
| 10 | + <image class="temporary" src="/img/_index2.png" mode="widthFix" alt="" /> | |
| 11 | + <!-- 自定义模板 --> | |
| 12 | + <text class="temporary_box" style="width: 180rpx;height: 220rpx;position: absolute;top: 364rpx;left: 20rpx;" bindtap="handleNewPunch"></text> | |
| 13 | + </van-popup> | |
| 14 | +</view> | |
| 0 | 15 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/index.wxss | ... | ... |
| 1 | +++ a/pages/index/newPunch/newPunch.js | |
| ... | ... | @@ -0,0 +1,33 @@ |
| 1 | +// pages/index/rank/rank.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + }, | |
| 9 | + | |
| 10 | + /** | |
| 11 | + * 生命周期函数--监听页面加载 | |
| 12 | + */ | |
| 13 | + onLoad(options) { | |
| 14 | + | |
| 15 | + }, | |
| 16 | + // 创建完成 | |
| 17 | + handleCreate(){ | |
| 18 | + // console.log(111) | |
| 19 | + wx.switchTab({ | |
| 20 | + url: '/pages/index/index', | |
| 21 | + }) | |
| 22 | + }, | |
| 23 | + // 统一返回 | |
| 24 | + handleBack() { | |
| 25 | + wx.navigateBack() | |
| 26 | + }, | |
| 27 | + /** | |
| 28 | + * 用户点击右上角分享 | |
| 29 | + */ | |
| 30 | + onShareAppMessage() { | |
| 31 | + | |
| 32 | + } | |
| 33 | +}) | |
| 0 | 34 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/newPunch/newPunch.wxml | |
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +<!--pages/index/rank/rank.wxml--> | |
| 2 | +<view class="punch_detail"> | |
| 3 | + <!-- 顶部统一返回 --> | |
| 4 | + <view class="navigation_back" bindtap="handleBack"> | |
| 5 | + <van-icon name="arrow-left" /> | |
| 6 | + </view> | |
| 7 | + <image class="temporary" src="/img/_new_punch.png" mode="widthFix" alt="" /> | |
| 8 | + <!-- 创建完成返回首页 --> | |
| 9 | + <text class="temporary_box" style="width: 700rpx;height: 100rpx;position: absolute;top: 2392rpx;right: 32rpx;" bindtap="handleCreate"></text> | |
| 10 | + | |
| 11 | +</view> | |
| 0 | 12 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/punchDetail/punchDetail.js | |
| ... | ... | @@ -0,0 +1,47 @@ |
| 1 | +// pages/index/punchDetail/punchDetail.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + showEdit: false, //确认打卡 | |
| 9 | + Clocked: false, //已打卡状态,只是为了演示用 | |
| 10 | + }, | |
| 11 | + | |
| 12 | + /** | |
| 13 | + * 生命周期函数--监听页面加载 | |
| 14 | + */ | |
| 15 | + onLoad(options) { | |
| 16 | + | |
| 17 | + }, | |
| 18 | + // 打开打卡信息填写 | |
| 19 | + handleEdit() { | |
| 20 | + console.log(111) | |
| 21 | + this.setData({ | |
| 22 | + showEdit: true | |
| 23 | + }) | |
| 24 | + }, | |
| 25 | + // 关闭打卡信息填写 | |
| 26 | + closeEdit() { | |
| 27 | + this.setData({ | |
| 28 | + showEdit: false | |
| 29 | + }) | |
| 30 | + }, | |
| 31 | + // 提交打卡信息,跳转打卡成功页面 | |
| 32 | + handleSubmit() { | |
| 33 | + this.setData({ | |
| 34 | + Clocked: true, | |
| 35 | + showEdit: false, | |
| 36 | + }) | |
| 37 | + }, | |
| 38 | + handleBack() { | |
| 39 | + wx.navigateBack() | |
| 40 | + }, | |
| 41 | + /** | |
| 42 | + * 用户点击右上角分享 | |
| 43 | + */ | |
| 44 | + onShareAppMessage() { | |
| 45 | + | |
| 46 | + } | |
| 47 | +}) | |
| 0 | 48 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/punchDetail/punchDetail.wxml | |
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | +<!--pages/index/punchDetail/punchDetail.wxml--> | |
| 2 | +<view class="punch_detail"> | |
| 3 | + <!-- 顶部统一返回 --> | |
| 4 | + <view class="navigation_back" bindtap="handleBack"> | |
| 5 | + <van-icon name="arrow-left" /> | |
| 6 | + </view> | |
| 7 | + <!-- 已打卡 --> | |
| 8 | + <image class="temporary" wx:if="{{Clocked}}" src="/img/_check_in3.png" mode="widthFix" alt="" /> | |
| 9 | + <!-- 未打卡 --> | |
| 10 | + <image class="temporary" wx:else src="/img/_check_in1.png" mode="widthFix" alt="" /> | |
| 11 | + <text class="temporary_box" wx:if="{{!Clocked}}" style="width: 308rpx;height: 100rpx;position: absolute;top: 1412rpx;right: 32rpx;" bindtap="handleEdit"></text> | |
| 12 | + <van-popup show="{{ showEdit }}" position="bottom" custom-style="height: 80%;" bind:close="closeEdit"> | |
| 13 | + <image class="temporary" src="/img/_check_in2.png" mode="widthFix" alt="" /> | |
| 14 | + <text class="temporary_box" style="width: 700rpx;height: 100rpx;position: absolute;top: 1452rpx;right: 32rpx;" bindtap="handleSubmit"></text> | |
| 15 | + </van-popup> | |
| 16 | +</view> | |
| 0 | 17 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/rank/rank.js | |
| ... | ... | @@ -0,0 +1,26 @@ |
| 1 | +// pages/index/rank/rank.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + }, | |
| 9 | + | |
| 10 | + /** | |
| 11 | + * 生命周期函数--监听页面加载 | |
| 12 | + */ | |
| 13 | + onLoad(options) { | |
| 14 | + | |
| 15 | + }, | |
| 16 | + // 统一返回 | |
| 17 | + handleBack() { | |
| 18 | + wx.navigateBack() | |
| 19 | + }, | |
| 20 | + /** | |
| 21 | + * 用户点击右上角分享 | |
| 22 | + */ | |
| 23 | + onShareAppMessage() { | |
| 24 | + | |
| 25 | + } | |
| 26 | +}) | |
| 0 | 27 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/index/rank/rank.wxml | |
| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | +<!--pages/index/rank/rank.wxml--> | |
| 2 | +<view class="punch_detail"> | |
| 3 | + <!-- 顶部统一返回 --> | |
| 4 | + <view class="navigation_back" bindtap="handleBack"> | |
| 5 | + <van-icon name="arrow-left" /> | |
| 6 | + </view> | |
| 7 | + <image class="temporary" src="/img/_rank.png" mode="widthFix" alt="" /> | |
| 8 | + | |
| 9 | +</view> | |
| 0 | 10 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/codeLogin/codeLogin.js | |
| ... | ... | @@ -0,0 +1,406 @@ |
| 1 | +// pages/login/codeLogin/codeLogin.js | |
| 2 | +var app = getApp(); | |
| 3 | +var util = require('../../../utils/md5.js') | |
| 4 | +import request from '../../../api/request.js' | |
| 5 | +Page({ | |
| 6 | + | |
| 7 | + /** | |
| 8 | + * 页面的初始数据 | |
| 9 | + */ | |
| 10 | + data: { | |
| 11 | + pageShow: false, //是否显示登录页面内容 | |
| 12 | + codeCont: '获取验证码', | |
| 13 | + code: '', | |
| 14 | + loginCode: '', //wx.login获取到的code | |
| 15 | + userName: '', | |
| 16 | + session_key: '', | |
| 17 | + encryptedData: '', | |
| 18 | + iv: '', | |
| 19 | + canClick: true, // 节流 | |
| 20 | + clockTimer: null, // 定时器 | |
| 21 | + path: '', //登录后跳转页面 | |
| 22 | + modelShow: false, //完善信息 | |
| 23 | + phone: '', //getUserInfo获取到的手机号 | |
| 24 | + }, | |
| 25 | + onLoad: function (options) { | |
| 26 | + console.log('登录页options:', options) | |
| 27 | + if (options.path) { | |
| 28 | + this.setData({ | |
| 29 | + path: options.path | |
| 30 | + }) | |
| 31 | + } | |
| 32 | + let userInfo = wx.getStorageSync('userInfo') | |
| 33 | + if (userInfo) { //如果有路径,并且缓存有数据,直接跳转 | |
| 34 | + if (userInfo.userName && userInfo.graduateSchool) { | |
| 35 | + this.loginSuccess() | |
| 36 | + // console.log('已完善信息,允许登录'); | |
| 37 | + return; | |
| 38 | + } | |
| 39 | + if (userInfo.phone) { | |
| 40 | + this.setData({ | |
| 41 | + phone: userInfo.phone | |
| 42 | + }, () => { | |
| 43 | + this.getUserInfo() | |
| 44 | + }) | |
| 45 | + } | |
| 46 | + } | |
| 47 | + this.setData({ | |
| 48 | + pageShow: true | |
| 49 | + }) | |
| 50 | + wx.login({ | |
| 51 | + success: (res) => { | |
| 52 | + if (res.code) { | |
| 53 | + this.setData({ | |
| 54 | + loginCode: res.code | |
| 55 | + }) | |
| 56 | + this.getOpenId() | |
| 57 | + } else { | |
| 58 | + console.log('登录失败!' + res.errMsg) | |
| 59 | + } | |
| 60 | + } | |
| 61 | + }) | |
| 62 | + }, | |
| 63 | + login() { | |
| 64 | + if (!this.data.encryptedData || !this.data.session_key || !this.data.iv) { | |
| 65 | + wx.showToast({ | |
| 66 | + title: '一键登陆失败,请重试', | |
| 67 | + icon: 'none', | |
| 68 | + duration: 2000 | |
| 69 | + }) | |
| 70 | + } | |
| 71 | + request({ | |
| 72 | + url: `h5/user/Oneclicklogin`, | |
| 73 | + method: 'get', | |
| 74 | + data: { | |
| 75 | + "encryptedData": this.data.encryptedData, | |
| 76 | + "session_key": this.data.session_key, | |
| 77 | + "iv": this.data.iv, | |
| 78 | + }, | |
| 79 | + }).then(res => { | |
| 80 | + if (res.success) { | |
| 81 | + if (res.data) { | |
| 82 | + this.setData({ | |
| 83 | + phone: res.data.phone | |
| 84 | + }, () => { | |
| 85 | + this.getUserInfo() | |
| 86 | + }) | |
| 87 | + } else { | |
| 88 | + wx.showToast({ | |
| 89 | + title: '一键登陆失败,请重试', | |
| 90 | + icon: 'none', | |
| 91 | + duration: 2000 | |
| 92 | + }) | |
| 93 | + } | |
| 94 | + } | |
| 95 | + }) | |
| 96 | + }, | |
| 97 | + loginSuccess() { | |
| 98 | + if (this.data.path) { | |
| 99 | + // 获取三位一体的数据 | |
| 100 | + if (this.data.path == 'trinity') { | |
| 101 | + let userInfo = wx.getStorageSync('userInfo'); | |
| 102 | + wx.showLoading({ | |
| 103 | + title: '加载中...', | |
| 104 | + mask: true | |
| 105 | + }) | |
| 106 | + wx.request({ | |
| 107 | + url: api + 'h5/MyVoluntary/GetTrinity', | |
| 108 | + data: { | |
| 109 | + userId: userInfo.id | |
| 110 | + }, | |
| 111 | + method: "GET", | |
| 112 | + header: { | |
| 113 | + 'content-type': 'application/json' | |
| 114 | + }, | |
| 115 | + success: function (res) { | |
| 116 | + wx.hideLoading() | |
| 117 | + if (res.data.success) { | |
| 118 | + if (res.data.data) { | |
| 119 | + wx.setStorageSync('trinity_id', res.data.data.id) | |
| 120 | + wx.redirectTo({ | |
| 121 | + url: '/pages/trinity/recommend/recommend?id=' + res.data.data.id | |
| 122 | + }) | |
| 123 | + } else { | |
| 124 | + wx.setStorageSync('trinity_id', null) | |
| 125 | + wx.redirectTo({ | |
| 126 | + url: '/pages/trinity/trinity' | |
| 127 | + }) | |
| 128 | + } | |
| 129 | + } | |
| 130 | + } | |
| 131 | + }) | |
| 132 | + | |
| 133 | + } else if (this.data.path == 'riskSetting') { | |
| 134 | + wx.redirectTo({ | |
| 135 | + url: '/pages/OrdinaryVolunteer/riskSetting/riskSetting' | |
| 136 | + }) | |
| 137 | + | |
| 138 | + } else { | |
| 139 | + wx.redirectTo({ | |
| 140 | + url: this.data.path, | |
| 141 | + }) | |
| 142 | + } | |
| 143 | + | |
| 144 | + } else { | |
| 145 | + wx.switchTab({ | |
| 146 | + url: '/pages/index/index' | |
| 147 | + }) | |
| 148 | + } | |
| 149 | + }, | |
| 150 | + getUserInfo() { | |
| 151 | + let that = this | |
| 152 | + request({ | |
| 153 | + url: `h5/user/getuserInfoNew`, | |
| 154 | + method: 'get', | |
| 155 | + data: { | |
| 156 | + // PhoneName: '13355752969' | |
| 157 | + PhoneName: this.data.phone | |
| 158 | + }, | |
| 159 | + }).then((res) => { | |
| 160 | + if (res.success) { | |
| 161 | + if (res.data) { | |
| 162 | + if (res.data.userName && res.data.graduateSchool) { | |
| 163 | + wx.setStorageSync('userInfo', res.data) | |
| 164 | + wx.setStorageSync('showModal', '') | |
| 165 | + app.globalData.userInfo = res.data; | |
| 166 | + } else { | |
| 167 | + wx.setStorageSync('userInfo', res.data) | |
| 168 | + that.setData({ | |
| 169 | + modelShow: true | |
| 170 | + }) | |
| 171 | + } | |
| 172 | + } | |
| 173 | + } | |
| 174 | + }) | |
| 175 | + }, | |
| 176 | + getOpenId() { | |
| 177 | + return request({ | |
| 178 | + url: `h5/MyVoluntary/GetOpenId`, | |
| 179 | + method: 'get', | |
| 180 | + data: { | |
| 181 | + code: this.data.loginCode | |
| 182 | + }, | |
| 183 | + }).then(res2 => { | |
| 184 | + // console.log(res2.data); | |
| 185 | + this.setData({ | |
| 186 | + session_key: JSON.parse(res2.data).session_key | |
| 187 | + }) | |
| 188 | + }) | |
| 189 | + }, | |
| 190 | + bindUserName: function (e) { | |
| 191 | + this.setData({ | |
| 192 | + userName: e.detail.value | |
| 193 | + }) | |
| 194 | + }, | |
| 195 | + bindCode: function (e) { | |
| 196 | + this.setData({ | |
| 197 | + code: e.detail.value | |
| 198 | + }) | |
| 199 | + }, | |
| 200 | + // 点击下一步 | |
| 201 | + next() { | |
| 202 | + var username = this.data.userName; | |
| 203 | + var code = this.data.code; | |
| 204 | + if (!username) { | |
| 205 | + wx.showToast({ | |
| 206 | + title: '请填写手机号', | |
| 207 | + icon: 'none', | |
| 208 | + duration: 1500 | |
| 209 | + }) | |
| 210 | + return false; | |
| 211 | + } | |
| 212 | + if (!code) { | |
| 213 | + wx.showToast({ | |
| 214 | + title: '请填写验证码', | |
| 215 | + icon: 'none', | |
| 216 | + duration: 1500 | |
| 217 | + }) | |
| 218 | + return false; | |
| 219 | + } | |
| 220 | + // 然后判断手机号码是否正确 | |
| 221 | + if (this.checkPhone(this.data.userName)) { | |
| 222 | + wx.showToast({ | |
| 223 | + title: '请输入正确的手机号', | |
| 224 | + icon: 'none', | |
| 225 | + duration: 2000 | |
| 226 | + }) | |
| 227 | + return | |
| 228 | + } | |
| 229 | + wx.showLoading({ | |
| 230 | + title: '请求中', | |
| 231 | + }) | |
| 232 | + wx.request({ | |
| 233 | + url: api + 'h5/MyVoluntary/CheckCodeIsRight', | |
| 234 | + data: { | |
| 235 | + captcha: code, | |
| 236 | + mobile: username | |
| 237 | + }, | |
| 238 | + method: 'get', | |
| 239 | + success: (res) => { | |
| 240 | + wx.hideLoading(); | |
| 241 | + if (res.data.success) { | |
| 242 | + if (res.data.data) { | |
| 243 | + this.setData({ | |
| 244 | + phone: res.data.data.phone | |
| 245 | + }, () => { | |
| 246 | + this.getUserInfo() | |
| 247 | + }) | |
| 248 | + } else { | |
| 249 | + wx.setStorage({ | |
| 250 | + key: "phone", | |
| 251 | + data: username, | |
| 252 | + success: function () { | |
| 253 | + wx.navigateTo({ | |
| 254 | + url: '/pages/login/loginInfo/loginInfo?phone=' + username, | |
| 255 | + }) | |
| 256 | + } | |
| 257 | + }) | |
| 258 | + | |
| 259 | + } | |
| 260 | + } else { | |
| 261 | + wx.showToast({ | |
| 262 | + title: res.data.message, | |
| 263 | + icon: 'none', | |
| 264 | + duration: 1000 | |
| 265 | + }) | |
| 266 | + } | |
| 267 | + }, | |
| 268 | + fail: function () { | |
| 269 | + wx.hideLoading(); | |
| 270 | + wx.showToast({ | |
| 271 | + title: '请求失败', | |
| 272 | + icon: 'none', | |
| 273 | + duration: 1000 | |
| 274 | + }) | |
| 275 | + } | |
| 276 | + }) | |
| 277 | + }, | |
| 278 | + checkPhone(phone) { | |
| 279 | + if (!(/^1[3456789]\d{9}$/.test(phone))) { | |
| 280 | + return true | |
| 281 | + } else { | |
| 282 | + return false | |
| 283 | + } | |
| 284 | + }, | |
| 285 | + getCode() { | |
| 286 | + if (!this.data.canClick) return // 节流 防止频繁访问接口 | |
| 287 | + this.setData({ | |
| 288 | + canClick: false | |
| 289 | + }) | |
| 290 | + var codeCont = this.data.codeCont; | |
| 291 | + // 获取验证码的时候 先判断是否输入的手机号 | |
| 292 | + if (!this.data.userName) { | |
| 293 | + wx.showToast({ | |
| 294 | + title: '请输入手机号', | |
| 295 | + icon: 'none', | |
| 296 | + duration: 2000 | |
| 297 | + }) | |
| 298 | + return | |
| 299 | + } | |
| 300 | + // 然后判断手机号码是否正确 | |
| 301 | + if (this.checkPhone(this.data.userName)) { | |
| 302 | + wx.showToast({ | |
| 303 | + title: '请输入正确的手机号', | |
| 304 | + icon: 'none', | |
| 305 | + duration: 2000 | |
| 306 | + }) | |
| 307 | + return | |
| 308 | + } | |
| 309 | + if (codeCont == '获取验证码') { | |
| 310 | + wx.showLoading({ | |
| 311 | + title: '请求中', | |
| 312 | + }) | |
| 313 | + wx.request({ | |
| 314 | + url: api + 'h5/MyVoluntary/AddVerificationCode', | |
| 315 | + // util.hex_md5 | |
| 316 | + header: { | |
| 317 | + sign: util.hex_md5("1" + this.data.userName + "206") | |
| 318 | + }, | |
| 319 | + data: { | |
| 320 | + code: 206, | |
| 321 | + mobile: this.data.userName, | |
| 322 | + type: 1, //写死 | |
| 323 | + }, | |
| 324 | + method: 'get', | |
| 325 | + success: (res) => { | |
| 326 | + wx.hideLoading(); | |
| 327 | + if (res.data.success) { | |
| 328 | + var num = 60; | |
| 329 | + this.data.clockTimer = setInterval(() => { | |
| 330 | + num--; | |
| 331 | + if (num < 0) { | |
| 332 | + clearInterval(this.data.clockTimer); | |
| 333 | + this.setData({ | |
| 334 | + canClick: true, | |
| 335 | + codeCont: '获取验证码' | |
| 336 | + }) | |
| 337 | + } else { | |
| 338 | + this.setData({ | |
| 339 | + codeCont: num | |
| 340 | + }) | |
| 341 | + } | |
| 342 | + }, 1000) | |
| 343 | + } | |
| 344 | + }, | |
| 345 | + fail: function () { | |
| 346 | + wx.hideLoading(); | |
| 347 | + wx.showToast({ | |
| 348 | + title: '请求失败', | |
| 349 | + icon: 'none', | |
| 350 | + duration: 1000 | |
| 351 | + }) | |
| 352 | + } | |
| 353 | + }) | |
| 354 | + } | |
| 355 | + }, | |
| 356 | + getPhoneNumber(e) { | |
| 357 | + // console.log(e.detail) | |
| 358 | + if (e.detail.errMsg == 'getPhoneNumber:ok') { | |
| 359 | + this.setData({ | |
| 360 | + encryptedData: e.detail.encryptedData, | |
| 361 | + iv: e.detail.iv, | |
| 362 | + }, () => { | |
| 363 | + this.login() | |
| 364 | + }) | |
| 365 | + } | |
| 366 | + | |
| 367 | + }, | |
| 368 | + //去查看协议 | |
| 369 | + toProtocol() { | |
| 370 | + wx.navigateTo({ | |
| 371 | + url: '../protocol/protocol', | |
| 372 | + }) | |
| 373 | + }, | |
| 374 | + //去查看政策 | |
| 375 | + toPolicy() { | |
| 376 | + wx.navigateTo({ | |
| 377 | + url: '../policy/policy', | |
| 378 | + }) | |
| 379 | + }, | |
| 380 | + goIndex() { | |
| 381 | + wx.switchTab({ | |
| 382 | + url: '/pages/index/index', | |
| 383 | + }) | |
| 384 | + }, | |
| 385 | + | |
| 386 | + /** | |
| 387 | + * 生命周期函数--监听页面隐藏 | |
| 388 | + */ | |
| 389 | + onHide: function () { | |
| 390 | + clearInterval(this.data.clockTimer); | |
| 391 | + }, | |
| 392 | + | |
| 393 | + /** | |
| 394 | + * 生命周期函数--监听页面卸载 | |
| 395 | + */ | |
| 396 | + onUnload: function () { | |
| 397 | + clearInterval(this.data.clockTimer); | |
| 398 | + }, | |
| 399 | + | |
| 400 | + /** | |
| 401 | + * 用户点击右上角分享 | |
| 402 | + */ | |
| 403 | + onShareAppMessage: function () { | |
| 404 | + | |
| 405 | + } | |
| 406 | +}) | |
| 0 | 407 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/codeLogin/codeLogin.wxml | |
| ... | ... | @@ -0,0 +1,38 @@ |
| 1 | +<!-- pages/login/login.wxml --> | |
| 2 | +<block wx:if="{{pageShow}}"> | |
| 3 | + <image class="bg" src="https://proxy.shunzhi.net:51315/bg_login.png" mode="aspectFit|aspectFill|widthFix" | |
| 4 | + lazy-load="false" binderror="" bindload="" /> | |
| 5 | + | |
| 6 | + <view class="title_box"> | |
| 7 | + <text class="title" selectable="false" space="false" decode="false">欢迎登录</text> | |
| 8 | + </view> | |
| 9 | + <view class="tips_box"> | |
| 10 | + <text class="tips" selectable="false" space="false" decode="false">请输入登录资料</text> | |
| 11 | + </view> | |
| 12 | + <view class='cont-box'> | |
| 13 | + <view class="phoneBox"> | |
| 14 | + <input type='number' placeholder='请输入手机号' bindinput="bindUserName" /> | |
| 15 | + </view> | |
| 16 | + <view class="codeBox"> | |
| 17 | + <input type='number' class="codeInput" placeholder='请输入短信验证码' bindinput="bindCode" /> | |
| 18 | + <view class="getCode" bindtap="getCode">{{codeCont}}</view> | |
| 19 | + </view> | |
| 20 | + <view class="btnBox"> | |
| 21 | + <text class="next button" bindtap='next'>登 录</text> | |
| 22 | + <!-- <navigator url="/pages/login/login" class="vipLogin button">微信登陆</navigator> --> | |
| 23 | + <button class="one_click_btn" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">微信一键登陆</button> | |
| 24 | + </view> | |
| 25 | + <view class="noLoginBox" wx:if="{{!path}}"> | |
| 26 | + <text class="noLogin" bindtap="goIndex">不登录,先看看</text> | |
| 27 | + </view> | |
| 28 | + | |
| 29 | + | |
| 30 | + </view> | |
| 31 | + <view class="footer"> | |
| 32 | + <view class="footer_tips"><text>点击登录即表示已阅读并同意</text> | |
| 33 | + <navigator url="../protocol/protocol"><text class="blue">《升学汇用户协议》</text></navigator><text>与</text> | |
| 34 | + <navigator url="../policy/policy"><text class="blue">《升学汇隐私政策》</text></navigator> | |
| 35 | + </view> | |
| 36 | + </view> | |
| 37 | +</block> | |
| 38 | +<PerfectInfo show="{{modelShow}}" bind:loginSuccess="loginSuccess"/> | |
| 0 | 39 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/codeLogin/codeLogin.wxss | |
| ... | ... | @@ -0,0 +1,129 @@ |
| 1 | +.bg { | |
| 2 | + width: 100%; | |
| 3 | + position: absolute; | |
| 4 | + left: 0; | |
| 5 | + right: 0; | |
| 6 | + top: 0; | |
| 7 | + bottom: 0; | |
| 8 | + z-index: -100; | |
| 9 | +} | |
| 10 | + | |
| 11 | +.title_box { | |
| 12 | + padding: 192rpx 54rpx 0; | |
| 13 | +} | |
| 14 | + | |
| 15 | +.tips_box { | |
| 16 | + padding: 37rpx 54rpx 45rpx; | |
| 17 | +} | |
| 18 | + | |
| 19 | +.title_box>.title { | |
| 20 | + font-size: 36rpx; | |
| 21 | + font-family: PingFang SC; | |
| 22 | + font-weight: bold; | |
| 23 | + color: rgba(255, 255, 255, 1); | |
| 24 | +} | |
| 25 | + | |
| 26 | +.tips_box>.tips { | |
| 27 | + font-size: 30rpx; | |
| 28 | + font-family: PingFang SC; | |
| 29 | + font-weight: 500; | |
| 30 | + color: rgba(255, 255, 255, 1); | |
| 31 | +} | |
| 32 | + | |
| 33 | +.cont-box { | |
| 34 | + width: 642rpx; | |
| 35 | + margin: 0 auto; | |
| 36 | + background-color: white; | |
| 37 | + border-radius: 10rpx; | |
| 38 | +} | |
| 39 | + | |
| 40 | +.cont-box input { | |
| 41 | + padding: 35rpx 0 35rpx 10rpx; | |
| 42 | + margin-left: 25rpx; | |
| 43 | + display: inline-block; | |
| 44 | + border-bottom: 1px solid #EEEEEE; | |
| 45 | + width: 90%; | |
| 46 | + color: #909090; | |
| 47 | + font-size: 30rpx; | |
| 48 | + line-height: 28rpx; | |
| 49 | +} | |
| 50 | + | |
| 51 | +/* 验证码的box */ | |
| 52 | +.codeBox { | |
| 53 | + position: relative; | |
| 54 | +} | |
| 55 | + | |
| 56 | +/* 获取验证码 */ | |
| 57 | +.cont-box .getCode { | |
| 58 | + position: absolute; | |
| 59 | + top: 0; | |
| 60 | + right: 0; | |
| 61 | + font-size: 30rpx; | |
| 62 | + font-family: PingFang SC; | |
| 63 | + font-weight: 500; | |
| 64 | + color: rgba(91, 151, 242, 1); | |
| 65 | + z-index: 100; | |
| 66 | + padding: 35rpx; | |
| 67 | +} | |
| 68 | + | |
| 69 | +.button { | |
| 70 | + display: block; | |
| 71 | + width: 575rpx; | |
| 72 | + height: 88rpx; | |
| 73 | + text-align: center; | |
| 74 | + line-height: 80rpx; | |
| 75 | + font-size: 36rpx; | |
| 76 | + border-radius: 44rpx; | |
| 77 | + color: white; | |
| 78 | + margin: 35rpx; | |
| 79 | +} | |
| 80 | + | |
| 81 | +.next { | |
| 82 | + background-color: #649DFB | |
| 83 | +} | |
| 84 | + | |
| 85 | +.noLoginBox { | |
| 86 | + text-align: center; | |
| 87 | +} | |
| 88 | + | |
| 89 | +.noLoginBox .noLogin { | |
| 90 | + font-size: 28rpx; | |
| 91 | + font-family: PingFang SC; | |
| 92 | + font-weight: 500; | |
| 93 | + color: rgba(91, 151, 242, 1); | |
| 94 | +} | |
| 95 | + | |
| 96 | +.one_click_btn { | |
| 97 | + display: block; | |
| 98 | + width: 575rpx; | |
| 99 | + height: 88rpx; | |
| 100 | + text-align: center; | |
| 101 | + line-height: 80rpx; | |
| 102 | + font-size: 36rpx; | |
| 103 | + border-radius: 44rpx; | |
| 104 | + color: white; | |
| 105 | + margin: 35rpx; | |
| 106 | + background-color: #07C060 | |
| 107 | +} | |
| 108 | + | |
| 109 | +.footer { | |
| 110 | + position: fixed; | |
| 111 | + bottom: 75rpx; | |
| 112 | + left: 60rpx; | |
| 113 | + display: flex; | |
| 114 | +} | |
| 115 | + | |
| 116 | +.footer .footer_tips { | |
| 117 | + font-size: 20rpx; | |
| 118 | + font-family: PingFang SC; | |
| 119 | + font-weight: 500; | |
| 120 | + color: rgba(58, 58, 58, 1); | |
| 121 | +} | |
| 122 | + | |
| 123 | +.blue { | |
| 124 | + color: rgba(91, 151, 242, 1); | |
| 125 | +} | |
| 126 | + | |
| 127 | +.footer_tips navigator { | |
| 128 | + display: inline-flex; | |
| 129 | +} | |
| 0 | 130 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/policy/policy.js | |
| ... | ... | @@ -0,0 +1,66 @@ |
| 1 | +// pages/login/policy/policy.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + | |
| 9 | + }, | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * 生命周期函数--监听页面加载 | |
| 13 | + */ | |
| 14 | + onLoad: function (options) { | |
| 15 | + | |
| 16 | + }, | |
| 17 | + | |
| 18 | + /** | |
| 19 | + * 生命周期函数--监听页面初次渲染完成 | |
| 20 | + */ | |
| 21 | + onReady: function () { | |
| 22 | + | |
| 23 | + }, | |
| 24 | + | |
| 25 | + /** | |
| 26 | + * 生命周期函数--监听页面显示 | |
| 27 | + */ | |
| 28 | + onShow: function () { | |
| 29 | + | |
| 30 | + }, | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * 生命周期函数--监听页面隐藏 | |
| 34 | + */ | |
| 35 | + onHide: function () { | |
| 36 | + | |
| 37 | + }, | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 生命周期函数--监听页面卸载 | |
| 41 | + */ | |
| 42 | + onUnload: function () { | |
| 43 | + | |
| 44 | + }, | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * 页面相关事件处理函数--监听用户下拉动作 | |
| 48 | + */ | |
| 49 | + onPullDownRefresh: function () { | |
| 50 | + | |
| 51 | + }, | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * 页面上拉触底事件的处理函数 | |
| 55 | + */ | |
| 56 | + onReachBottom: function () { | |
| 57 | + | |
| 58 | + }, | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * 用户点击右上角分享 | |
| 62 | + */ | |
| 63 | + onShareAppMessage: function () { | |
| 64 | + | |
| 65 | + } | |
| 66 | +}) | |
| 0 | 67 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/policy/policy.wxml | |
| ... | ... | @@ -0,0 +1,79 @@ |
| 1 | +<view class="main"> | |
| 2 | + <text class="content"> | |
| 3 | +<text class="title">隐私政策</text> | |
| 4 | + 引言 | |
| 5 | + 杭州顺治科技股份有限公司重视用户的隐私,隐私权是您重要的权利。您在使用我们的服务时,可能会收集和使用您的相关信息。我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。本《隐私政策》与您所使用的其明服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。本《隐私政策》中涉及的相关技术词汇,我们尽量以简明扼要的表述以便您的理解。 | |
| 6 | + 您使用或继续使用相关服务,即意味着同意杭州顺治科技股份有限公司按照本《隐私政策》收集、使用、储存和分享您的相关信息。 | |
| 7 | + 如对本《隐私政策》或相关事宜有任何问题,请通过客服热线400-826-2468与我们联系。 | |
| 8 | + | |
| 9 | + 我们可能收集的信息 | |
| 10 | + 我们提供服务时,可能会收集、储存和使用下列与您有关的信息。如果您不提供相关信息,可能无法注册成为我们的用户或无法享受我们提供的某些服务,或者无法达到相关服务拟达到的效果。 | |
| 11 | + 您提供的信息 | |
| 12 | + 您在注册账户或使用我们的服务时,向我们提供的相关个人信息,例如姓名、电话号码、电子邮件或银行卡号等; | |
| 13 | + 您通过我们的服务向其他方提供的共享信息,以及您使用我们的服务时所储存的信息。 | |
| 14 | + 其他方分享的您的信息 | |
| 15 | + 其他方使用我们的服务时所提供有关您的共享信息。 | |
| 16 | + 我们获取的您的信息 | |
| 17 | + 您使用服务时我们可能收集如下信息: | |
| 18 | + 日志信息,指您使用我们的服务时,系统可能通过cookies、web beacon或其他方式自动采集的技术信息,包括:设备或软件信息,例如您的移动设备、网页浏览器或用于接入我们服务的其他程序所提供的配置信息、您的IP地址和移动设备所用的版本和设备识别码; | |
| 19 | + 在使用我们服务时浏览的信息,例如您使用的搜索词语、访问的社交媒体页url地址,以及您在使用我们服务时浏览或要求提供的其他信息和内容详情;有关您曾使用的移动应用(APP)和其他软件的信息,以及您曾经使用该等移动应用和软件的信息; | |
| 20 | + 您通过我们的服务进行通讯的信息,例如本产品的账号,以及通讯时间、数据; | |
| 21 | + 位置信息,指您开启设备定位功能并使用我们基于位置提供的相关服务时,收集的有关您位置的信息,包括: | |
| 22 | + 您通过具有定位功能的移动设备使用我们的服务时,通过GPS或WiFi等方式收集的您的地理位置信息; | |
| 23 | + 您或其他用户提供的包含您所处地理位置的实时信息,例如您提供的账户信息中包含的您所在地区信息,您或其他人上传的显示您当前或曾经所处地理位置的共享信息,您或其他人共享的照片包含的地理标记信息; | |
| 24 | + 您可以通过关闭定位功能,停止对您的地理位置信息的收集。 | |
| 25 | + 我们可能如何使用信息 | |
| 26 | + 我们可能将在向您提供服务的过程之中所收集的信息用作下列用途: | |
| 27 | + 向您提供服务; | |
| 28 | + 在我们提供服务时,用于身份验证、客户服务、安全防范、诈骗监测、存档和备份用途,确保我们向您提供的产品和服务的安全性; | |
| 29 | + 帮助我们设计新服务,改善我们现有服务;使我们更加了解您如何接入和使用我们的服务,从而针对性地回应您的个性化需求,例如语言设定、 位置设定、个性化的帮助服务和指示,或对您和其他用户作出其他方面的回应; | |
| 30 | + 为了让您有更好的体验、改善我们的服务或您同意的其他用途,在符合相关法律法规的前提下,我们可能将通过某一项服务所收集的信息,以汇集信息或者个性化的方式,用于我们的其他服务。例如,在您使用我们的一项服务时所收集的信息,可能在另一服务中用于向您提供特定内容,或向您展示与您相关的、非普遍推送的信息。如果我们在相关服务中提供了相应选项,您也可以授权我们将该服务所提供和储存的信息用于我们的其他服务。 | |
| 31 | + 您如何访问和控制自己的个人信息 | |
| 32 | + 我们将尽一切可能采取适当的技术手段,保证您可以访问、更新和更正自己的注册信息或使用我们的服务时提供的其他个人信息。在访问、更新、更正和删除前述信息时,我们可能会要求您进行身份验证,以保障账户安全。 | |
| 33 | + 我们可能分享的信息 | |
| 34 | + 除以下情形外,未经您同意,我们以及我们的关联公司不会与任何第三方分享您的个人信息。 | |
| 35 | + 我们以及我们的关联公司,可能将您的个人信息与我们的关联公司、合作伙伴及第三方服务供应商、承包商及代理(例如代表我们发出电子邮件或推送通知的通讯服务提供商、为我们提供位置数据的地图服务供应商)分享(他们可能并非位于您所在的法域),用作下列用途: | |
| 36 | + 向您提供我们的服务; | |
| 37 | + 实现“我们可能如何使用信息”部分所述目的; | |
| 38 | + 履行我们在本《隐私政策》中的义务和行使我们的权利; | |
| 39 | + 理解、维护和改善我们的服务。 | |
| 40 | + 如我们或我们的关联公司与任何上述第三方分享您的个人信息,我们将努力确保该等第三方在使用您的个人信息时遵守本《隐私政策》及我们要求其遵守的其他适当的保密和安全措施。 | |
| 41 | + 随着我们业务的持续发展,我们以及我们的关联公司有可能进行合并、收购、资产转让或类似的交易,您的个人信息有可能作为此类交易的一部分而被转移。我们将在转移前通知您。 | |
| 42 | + 我们或我们的关联公司还可能为以下需要而保留、保存或披露您的个人信息: | |
| 43 | + 遵守适用的法律法规; | |
| 44 | + 遵守法院命令或其他法律程序的规定; | |
| 45 | + 遵守相关政府机关的要求。 | |
| 46 | + 为遵守适用的法律法规、维护社会公共利益,或保护我们的客户、我们或我们的集团公司、其他用户或雇员的人身和财产安全或合法权益所合理必需的用途。 | |
| 47 | + 信息安全 | |
| 48 | + 我们仅在本《隐私政策》所述目的所必需的期间和法律法规要求的时限内保留您的个人信息。 | |
| 49 | + 我们使用各种安全技术和程序,以防信息的丢失、不当使用、未经授权阅览或披露。例如,在某些服务中,我们将利用加密技术(例如SSL)来保护您提供的个人信息。但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。 | |
| 50 | + 您分享的信息 | |
| 51 | + 我们的多项服务,可让您不仅与自己的社交网络,也与使用该服务的所有用户公开分享您的相关信息,例如,您在我们的服务中所上传或发布的信息(包括您公开的个人信息、您建立的名单)、您对其他人上传或发布的信息作出的回应,以及包括与这些信息有关的位置数据和日志信息。使用我们服务的其他用户也有可能分享与您有关的信息(包括位置数据和日志信息)。 | |
| 52 | + 因此,请您谨慎考虑通过我们的服务上传、发布和交流的信息内容。在一些情况下,您可通过我们某些服务的隐私设定来控制有权浏览您共享信息的用户范围。如要求从我们的服务中删除您的相关信息,请通过该等特别服务条款提供的方式操作。 | |
| 53 | + 您分享的敏感个人信息 | |
| 54 | + 某些个人信息因其特殊性可能被认为是敏感个人信息,例如您的种族、宗教、个人健康和医疗信息等。相比其他个人信息,敏感个人信息受到更加严格的保护。 | |
| 55 | + 请注意,您在使用我们的服务时所提供、上传或发布的内容和信息(例如有关您社交活动的照片等信息),可能会泄露您的敏感个人信息。您需要谨慎地考虑,是否在使用我们的服务时披露相关敏感个人信息。 | |
| 56 | + 您同意按本《隐私政策》所述的目的和方式来处理您的敏感个人信息。 | |
| 57 | + 我们可能如何收集信息 | |
| 58 | + 我们或我们的第三方合作伙伴,可能通过cookies和web beacon收集和使用您的信息,并将该等信息储存为日志信息。 | |
| 59 | + 我们使用自己的cookies和web beacon,目的是为您提供更个性化的用户体验和服务,并用于以下用途: | |
| 60 | + 记住您的身份。例如:cookies和web beacon有助于我们辨认您作为我们的注册用户的身份,或保存您向我们提供的相关信息。 | |
| 61 | + 分析您使用我们服务的情况。例如,我们可利用cookies和web beacon来了解您使用我们的服务进行什么活动,或哪些界面或服务最受您的欢迎; | |
| 62 | + 我们的产品和服务上可能会有其他合作方放置的cookies和web beacon。这些cookies和web beacon可能会收集与您相关的非个人身份信息,以用于分析用户如何使用该等服务或用于评估相关产品的效果。这些第三方cookies和web beacon收集和使用该等信息,不受本《隐私政策》约束,而是受相关使用者的隐私政策约束,我们不对第三方的cookies或web beacon承担责任。 | |
| 63 | + 您可以通过浏览器设置拒绝或管理cookies或web beacon。但请注意,如果停用cookies或web beacon,您有可能无法享受最佳的服务体验,某些服务也可能无法正常使用。 | |
| 64 | + | |
| 65 | + 我们可能向您发送的信息 | |
| 66 | + 信息推送 | |
| 67 | + 您在使用我们的服务时,我们可能使用您的信息向您的设备发送推送通知。如您不希望收到这些信息,可以按照我们的相关提示,在设备上选择取消订阅。 | |
| 68 | + | |
| 69 | + 与服务有关的公告 | |
| 70 | + 我们可能在必要时(例如因系统维护而暂停某一项服务时)向您发出与服务有关的公告。您可能无法取消这些与服务有关、性质不属于推广的公告。 | |
| 71 | + | |
| 72 | + 隐私政策的适用范围 | |
| 73 | + 请您注意,本《隐私政策》不适用于以下情况: | |
| 74 | + 通过我们的服务而接入的第三方服务(包括任何第三方网站)收集的信息; | |
| 75 | + 通过在我们服务中进行广告服务的其他公司或机构所收集的信息。 | |
| 76 | + 变更 | |
| 77 | + 我们可能适时修订本《隐私政策》的条款,该等修订构成本《隐私政策》的一部分。如该等修订造成您在本《隐私政策》下权利的实质减少,我们将在修订生效前通过在主页上显著位置提示或向您发送推送消息或以其他方式通知您。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本《隐私政策》的约束。 | |
| 78 | + </text> | |
| 79 | +</view> | |
| 0 | 80 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/policy/policy.wxss | |
| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | +.main { | |
| 2 | + padding: 32rpx; | |
| 3 | +} | |
| 4 | + | |
| 5 | +.content { | |
| 6 | + font-size: 28rpx; | |
| 7 | + font-family: PingFang SC; | |
| 8 | + font-weight: 500; | |
| 9 | + color: rgba(58, 58, 58, 1); | |
| 10 | +} | |
| 11 | + | |
| 12 | +.title { | |
| 13 | + font-size: 36rpx; | |
| 14 | + font-family: PingFang SC; | |
| 15 | + font-weight: 500; | |
| 16 | + color: rgba(58, 58, 58, 1); | |
| 17 | +} | |
| 0 | 18 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/protocol/protocol.js | |
| ... | ... | @@ -0,0 +1,66 @@ |
| 1 | +// pages/login/protocol/protocol.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + | |
| 9 | + }, | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * 生命周期函数--监听页面加载 | |
| 13 | + */ | |
| 14 | + onLoad: function (options) { | |
| 15 | + | |
| 16 | + }, | |
| 17 | + | |
| 18 | + /** | |
| 19 | + * 生命周期函数--监听页面初次渲染完成 | |
| 20 | + */ | |
| 21 | + onReady: function () { | |
| 22 | + | |
| 23 | + }, | |
| 24 | + | |
| 25 | + /** | |
| 26 | + * 生命周期函数--监听页面显示 | |
| 27 | + */ | |
| 28 | + onShow: function () { | |
| 29 | + | |
| 30 | + }, | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * 生命周期函数--监听页面隐藏 | |
| 34 | + */ | |
| 35 | + onHide: function () { | |
| 36 | + | |
| 37 | + }, | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 生命周期函数--监听页面卸载 | |
| 41 | + */ | |
| 42 | + onUnload: function () { | |
| 43 | + | |
| 44 | + }, | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * 页面相关事件处理函数--监听用户下拉动作 | |
| 48 | + */ | |
| 49 | + onPullDownRefresh: function () { | |
| 50 | + | |
| 51 | + }, | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * 页面上拉触底事件的处理函数 | |
| 55 | + */ | |
| 56 | + onReachBottom: function () { | |
| 57 | + | |
| 58 | + }, | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * 用户点击右上角分享 | |
| 62 | + */ | |
| 63 | + onShareAppMessage: function () { | |
| 64 | + | |
| 65 | + } | |
| 66 | +}) | |
| 0 | 67 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/login/protocol/protocol.wxml | |
| ... | ... | @@ -0,0 +1,81 @@ |
| 1 | +<view class="main"> | |
| 2 | + <text class="content"> | |
| 3 | +1. 特别提示 | |
| 4 | +1.1 | |
| 5 | +杭州顺治科技股份有限公司(以下简称“顺治”)同意按照本协议的规定及其不时发布的操作规则向用户提供相关服务。为获得服务,产品服务使用人(以下称"用户")需在认真阅读及独立思考的基础上认可、同意本协议的全部条款,并按照页面上的提示完成全部的注册程序。用户在进行注册过程中点击"同意" 按钮即表示用户完全接受本服务协议。如用户对本服务协议或协议的任何部分存有任何异议,应终止相关顺治产品程序(或停止使用相关产品服务)。 | |
| 6 | +1.2 | |
| 7 | +用户注册成功后,顺治将为用户基于使用产品服务的客观需要而在申请、注册产品服务时,按照注册要求提供的账号开通相关产品服务,用户有权在顺治为其开通并同意向其提供服务的基础上使用产品服务。同时,用户同意: | |
| 8 | +1.2.1 用户应妥善保管相关产品账号及密码。 | |
| 9 | +1.2.2 未经顺治同意,用户不得擅自买卖、转让、出租任何账号。 | |
| 10 | +1.2.3 用户使用顺治产品服务过程中,须对自身使用产品的行为,对任何由用户通过顺治产品发布、公开的信息,及对由此产生的任何后果承担全部责任。 | |
| 11 | +1.3 | |
| 12 | +用户使用顺治产品服务过程中,对自身使用顺治产品的行为以及通过顺治产品发布、公开的任何信息享有合法权利,承担相应法律责任。 | |
| 13 | +1.4 | |
| 14 | +在法律法规允许的范围内,用户同意并授权顺治就侵犯用户合法权益的行为(包括但不限于私自复制、使用、编辑、抄袭等行为)采取任何形式的法律行动,包括但不限于投诉、诉讼等必要的维权措施。 | |
| 15 | +1.5 | |
| 16 | +顺治有权直接将本服务或本协议项下权利义务委托给其关联公司或其他第三方公司进行运营、管理及履行,顺治无需就此向用户另行获取授权。顺治将竭尽避免前述委托或变更给用户使用产品服务造成的不便,顺治届时将尽量及时通过网站、平台、私信、邮件等方式进行通知。本协议中,关联公司是指控制某一方的、或被某一方所控制的、或与某一方共同受控制于同一实体的任何企业。控制是指直接或间接拥有该企业百分之五十(50%)以上的股权、投票权或管理权。 | |
| 17 | +1.6 | |
| 18 | +为提高用户的产品服务使用感受和满意度,用户同意顺治可以对用户数据进行调查研究和分析,从而进一步优化产品服务。 | |
| 19 | +2. 服务内容 | |
| 20 | +2.1 | |
| 21 | +顺治产品的具体内容由顺治根据实际情况提供。 | |
| 22 | +2.2 | |
| 23 | +顺治产品提供的部分服务为收费网络服务,用户使用收费网络服务需要向顺治支付一定的费用。对于收费的网络服务,顺治会在用户使用之前给予用户明确的提示,只有用户根据提示确认其愿意支付相关费用,用户才能使用该等收费网络服务。如用户拒绝支付相关费用,则顺治有权不向用户提供该等收费网络服务。 | |
| 24 | +2.3 | |
| 25 | +用户理解,顺治仅提供与产品相关的技术服务,除此之外与相关网络服务有关的设备(如个人电脑、手机、及其他与接入互联网或移动网有关的装置)及所需的费用(如为接入互联网而支付的电话费及上网费、为使用移动网络而支付的手机费)均由用户自行负担。 | |
| 26 | +3. 服务变更、中断或终止 | |
| 27 | +3.1 | |
| 28 | +鉴于网络服务的特殊性(包括但不限于服务器的稳定性问题、恶意的网络攻击等行为的存在及其他顺治无法控制的情形),用户同意顺治有权随时中断或终止部分或全部的产品服务(包括收费网络服务),若发生该等情形,顺治将尽可能及时通过网页公告、系统通知、私信、短信提醒或其他合理方式通知受到影响的用户并在合理时间内恢复相关产品服务。 | |
| 29 | +3.2 | |
| 30 | +用户理解,顺治需要定期或不定期地对提供产品服务的平台(如互联网网站、应用程序等)或相关的设备进行检修或者维护,如因此类情况而造成服务在合理时间内的中断,顺治无需为此承担任何责任,但顺治应尽可能事先进行通告。 | |
| 31 | +3.3 | |
| 32 | +如发生下列任何一种情形,顺治有权随时中断或终止向用户提供本协议项下的产品服务(包括收费服务和免费服务)而无需对用户或任何第三方承担任何责任,由此造成的损失由用户自行独立承担: | |
| 33 | +3.3.1 用户提供的个人资料不真实; | |
| 34 | +3.3.2 用户违反法律法规国家政策或本协议中规定的使用规则; | |
| 35 | +3.3.3 用户在使用收费服务时未按规定为其所使用的收费服务支付相关服务费用; | |
| 36 | +3.3.4 用户侵犯个人、企业事业单位或社会团体的合法权益,包括但不限于专利权、著作权、商标权,或姓名权、名称权、名誉权、荣誉权、肖像权、隐私权等; | |
| 37 | +3.3.5 用户损害监管部门、国家机关及政府形象; | |
| 38 | +3.3.6 用户以任何方式损害顺治及其关联公司的商誉或信誉等合法权益; | |
| 39 | +3.3.7 顺治有其他合理理由认为需要中断或终止向用户提供产品服务的。 | |
| 40 | +4. 隐私保护 | |
| 41 | +4.1 | |
| 42 | +保护用户隐私和其他个人信息是顺治的一项基本政策,具体内容详见顺治个人信息相关保护政策。 | |
| 43 | +5. 免责声明 | |
| 44 | +5.1 | |
| 45 | +用户在使用顺治产品服务的过程中应遵守国家法律法规及政策规定,因其使用产品服务而产生的行为后果由用户自行承担。 | |
| 46 | +5.2 | |
| 47 | +顺治产品服务发布的任何信息及产品服务传递的任何观点仅作为参考,不对学生高考志愿填报及学校录取等结果负责。用户对于可能会在产品上接触到的所有信息应自行做出判断并对相关行为产生的结果负责。 | |
| 48 | +5.3 | |
| 49 | +鉴于外部链接指向的网页内容非顺治实际控制,因此顺治无法保证为向用户提供便利而设置的外部链接的准确性和完整性。 | |
| 50 | +5.4 | |
| 51 | +对于因不可抗力或顺治不能控制的原因造成的产品服务中断或其它缺陷,顺治不承担任何责任,但将尽力减少因此而给用户造成的损失和影响。 | |
| 52 | +5.5 | |
| 53 | +顺治对其向用户所提供的产品及服务依法承担相关责任,但法律另有规定或另有约定的除外。 | |
| 54 | +5.6 | |
| 55 | +用户知悉并同意,顺治可能会与第三方合作向用户提供产品(包括但不限于游戏、第三方应用等)并由第三方向用户提供该产品的升级、维护、客服等后续工作,由该等第三方对该产品的质量问题或其本身的原因导致的一切纠纷或用户损失承担责任,用户在此同意将向该第三方主张与此有关的一切权利和损失。 | |
| 56 | +5.7 | |
| 57 | +除另有约定外,顺治提供的产品或服务(包括但不限于虚拟物品及道具),如未标明使用期限、或者其标明的使用期限为“永久”、“无限期”或“无限制”的,则其使用期限为自用户开始使用该产品或服务至该产品或服务在顺治相关产品下线之日为止。 | |
| 58 | +6. 违约责任 | |
| 59 | +6.1 | |
| 60 | +如因顺治违反有关法律、法规或本协议项下的任何条款而给用户造成损失的,因此给用户造成的损害赔偿责任由顺治承担。 | |
| 61 | +6.2 | |
| 62 | +用户同意保障和维护顺治及其关联公司及其他用户的合法权益,如因用户违反有关法律、法规或本协议项下的任何条款而给顺治及其关联公司或任何其他任何第三方造成损失,用户同意承担由此造成的损害赔偿责任。 | |
| 63 | + | |
| 64 | +7. 协议修改 | |
| 65 | +7.1 | |
| 66 | +顺治有权随时修改本协议的任何条款,一旦本协议的内容发生变动,顺治将会在全部产品平台上公布修改之后的协议内容,顺治也可选择通过其他适当方式(比如系统通知)向用户通知修改内容。 | |
| 67 | +7.2 | |
| 68 | +如果不同意顺治对本协议相关条款所做的修改,用户有权停止使用相关产品服务。如果用户继续使用相关产品服务,则视为用户接受顺治对本协议相关条款所做的修改。 | |
| 69 | +8. 法律适用 | |
| 70 | +8.1 | |
| 71 | +本协议的订立、执行和解释及争议的解决均应适用中华人民共和国大陆地区法律。 | |
| 72 | +8.2 | |
| 73 | +如双方就本协议内容或其执行发生任何争议,双方应尽量友好协商解决;协商不成时,任何一方均可向杭州市上城区人民法院提起诉讼。 | |
| 74 | +9. 其他规定 | |
| 75 | +9.1 | |
| 76 | +如本协议中的任何条款无论因何种原因完全或部分无效或不具有执行力,本协议的其余条款仍应有效并且有约束力。 | |
| 77 | +9.2 | |
| 78 | +本协议中的标题仅为方便而设,在解释本协议时应被忽略,不能作为本协议条款解释的依据。 | |
| 79 | + | |
| 80 | +</text> | |
| 81 | +</view> | |
| 0 | 82 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/mine/index.js | |
| ... | ... | @@ -0,0 +1,23 @@ |
| 1 | +var app = getApp(); | |
| 2 | +var util = require('../../utils/md5.js') | |
| 3 | +import request from '../../api/request.js' | |
| 4 | +Page({ | |
| 5 | + /** | |
| 6 | + * 页面的初始数据 | |
| 7 | + */ | |
| 8 | + data: { | |
| 9 | + | |
| 10 | + }, | |
| 11 | +// 打卡记录 | |
| 12 | + handleRecord(){ | |
| 13 | + wx.navigateTo({ | |
| 14 | + url: '/pages/mine/record/record', | |
| 15 | + }) | |
| 16 | + }, | |
| 17 | + /** | |
| 18 | + * 用户点击右上角分享 | |
| 19 | + */ | |
| 20 | + onShareAppMessage: function () { | |
| 21 | + | |
| 22 | + }, | |
| 23 | +}) | |
| 0 | 24 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/mine/index.wxml | |
| ... | ... | @@ -0,0 +1,6 @@ |
| 1 | +<view class="mine"> | |
| 2 | + <image class="temporary" src="../../img/_mine.png" mode="widthFix" alt="" /> | |
| 3 | + <!-- 打卡记录 --> | |
| 4 | + <text class="temporary_box" style="width: 340rpx;height: 160rpx;position: absolute;top: 340rpx;left: 32rpx;" bindtap="handleRecord"></text> | |
| 5 | + | |
| 6 | +</view> | ... | ... |
| 1 | +++ a/pages/mine/index.wxss | ... | ... |
| 1 | +++ a/pages/mine/record/record.js | |
| ... | ... | @@ -0,0 +1,37 @@ |
| 1 | +// pages/index/record/record.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + tabindex: 1 | |
| 9 | + }, | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * 生命周期函数--监听页面加载 | |
| 13 | + */ | |
| 14 | + onLoad(options) { | |
| 15 | + | |
| 16 | + }, | |
| 17 | + handleTab1() { | |
| 18 | + this.setData({ | |
| 19 | + tabindex: 1 | |
| 20 | + }) | |
| 21 | + }, | |
| 22 | + handleTab2() { | |
| 23 | + this.setData({ | |
| 24 | + tabindex: 2 | |
| 25 | + }) | |
| 26 | + }, | |
| 27 | + // 统一返回 | |
| 28 | + handleBack() { | |
| 29 | + wx.navigateBack() | |
| 30 | + }, | |
| 31 | + /** | |
| 32 | + * 用户点击右上角分享 | |
| 33 | + */ | |
| 34 | + onShareAppMessage() { | |
| 35 | + | |
| 36 | + } | |
| 37 | +}) | |
| 0 | 38 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/mine/record/record.wxml | |
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +<!--pages/index/record/record.wxml--> | |
| 2 | +<view class="punch_detail"> | |
| 3 | + <!-- 顶部统一返回 --> | |
| 4 | + <view class="navigation_back" bindtap="handleBack"> | |
| 5 | + <van-icon name="arrow-left" /> | |
| 6 | + </view> | |
| 7 | + <!-- 两个tab --> | |
| 8 | + <text class="temporary_box" style="width: 320rpx;height: 80rpx;position: absolute;top: 160rpx;left: 32rpx;" bindtap="handleTab1"></text> | |
| 9 | + <text class="temporary_box" style="width: 320rpx;height: 80rpx;position: absolute;top: 160rpx;right: 32rpx;" bindtap="handleTab2"></text> | |
| 10 | + | |
| 11 | + <image class="temporary" hidden="{{tabindex==2}}" src="/img/_my_punch1.png" mode="widthFix" alt="" /> | |
| 12 | + <image class="temporary" hidden="{{tabindex==1}}" src="/img/_my_punch2.png" mode="widthFix" alt="" /> | |
| 13 | + | |
| 14 | +</view> | |
| 0 | 15 | \ No newline at end of file | ... | ... |
| 1 | +++ a/pages/webview/webview.js | |
| ... | ... | @@ -0,0 +1,71 @@ |
| 1 | +// pages/webview/webview.js | |
| 2 | +Page({ | |
| 3 | + | |
| 4 | + /** | |
| 5 | + * 页面的初始数据 | |
| 6 | + */ | |
| 7 | + data: { | |
| 8 | + link:'' | |
| 9 | + }, | |
| 10 | + | |
| 11 | + /** | |
| 12 | + * 生命周期函数--监听页面加载 | |
| 13 | + */ | |
| 14 | + onLoad: function (options) { | |
| 15 | + console.log(options) | |
| 16 | + if(options.link){ | |
| 17 | + this.setData({ | |
| 18 | + link:decodeURIComponent(options.link) | |
| 19 | + }) | |
| 20 | + } | |
| 21 | + }, | |
| 22 | + | |
| 23 | + /** | |
| 24 | + * 生命周期函数--监听页面初次渲染完成 | |
| 25 | + */ | |
| 26 | + onReady: function () { | |
| 27 | + | |
| 28 | + }, | |
| 29 | + | |
| 30 | + /** | |
| 31 | + * 生命周期函数--监听页面显示 | |
| 32 | + */ | |
| 33 | + onShow: function () { | |
| 34 | + | |
| 35 | + }, | |
| 36 | + | |
| 37 | + /** | |
| 38 | + * 生命周期函数--监听页面隐藏 | |
| 39 | + */ | |
| 40 | + onHide: function () { | |
| 41 | + | |
| 42 | + }, | |
| 43 | + | |
| 44 | + /** | |
| 45 | + * 生命周期函数--监听页面卸载 | |
| 46 | + */ | |
| 47 | + onUnload: function () { | |
| 48 | + | |
| 49 | + }, | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * 页面相关事件处理函数--监听用户下拉动作 | |
| 53 | + */ | |
| 54 | + onPullDownRefresh: function () { | |
| 55 | + | |
| 56 | + }, | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * 页面上拉触底事件的处理函数 | |
| 60 | + */ | |
| 61 | + onReachBottom: function () { | |
| 62 | + | |
| 63 | + }, | |
| 64 | + | |
| 65 | + /** | |
| 66 | + * 用户点击右上角分享 | |
| 67 | + */ | |
| 68 | + onShareAppMessage: function () { | |
| 69 | + | |
| 70 | + } | |
| 71 | +}) | |
| 0 | 72 | \ No newline at end of file | ... | ... |
| 1 | +++ a/project.config.json | |
| ... | ... | @@ -0,0 +1,62 @@ |
| 1 | +{ | |
| 2 | + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", | |
| 3 | + "packOptions": { | |
| 4 | + "ignore": [], | |
| 5 | + "include": [] | |
| 6 | + }, | |
| 7 | + "setting": { | |
| 8 | + "urlCheck": true, | |
| 9 | + "es6": false, | |
| 10 | + "enhance": true, | |
| 11 | + "postcss": true, | |
| 12 | + "preloadBackgroundData": false, | |
| 13 | + "minified": true, | |
| 14 | + "newFeature": false, | |
| 15 | + "coverView": true, | |
| 16 | + "nodeModules": false, | |
| 17 | + "autoAudits": false, | |
| 18 | + "showShadowRootInWxmlPanel": true, | |
| 19 | + "scopeDataCheck": false, | |
| 20 | + "uglifyFileName": false, | |
| 21 | + "checkInvalidKey": true, | |
| 22 | + "checkSiteMap": true, | |
| 23 | + "uploadWithSourceMap": true, | |
| 24 | + "compileHotReLoad": false, | |
| 25 | + "lazyloadPlaceholderEnable": false, | |
| 26 | + "useMultiFrameRuntime": true, | |
| 27 | + "useApiHook": true, | |
| 28 | + "useApiHostProcess": true, | |
| 29 | + "babelSetting": { | |
| 30 | + "ignore": [], | |
| 31 | + "disablePlugins": [], | |
| 32 | + "outputPath": "" | |
| 33 | + }, | |
| 34 | + "enableEngineNative": false, | |
| 35 | + "useIsolateContext": true, | |
| 36 | + "userConfirmedBundleSwitch": false, | |
| 37 | + "packNpmManually": false, | |
| 38 | + "packNpmRelationList": [ | |
| 39 | + { | |
| 40 | + "packageJsonPath": "./package.json", | |
| 41 | + "miniprogramNpmDistDir": "./" | |
| 42 | + } | |
| 43 | + ], | |
| 44 | + "minifyWXSS": true, | |
| 45 | + "disableUseStrict": false, | |
| 46 | + "minifyWXML": true, | |
| 47 | + "showES6CompileOption": false, | |
| 48 | + "useCompilerPlugins": false, | |
| 49 | + "useStaticServer": true | |
| 50 | + }, | |
| 51 | + "compileType": "miniprogram", | |
| 52 | + "libVersion": "2.23.2", | |
| 53 | + "appid": "wxd055a716238e1bd7", | |
| 54 | + "projectname": "%E5%8D%87%E5%AD%A6%E6%B1%87", | |
| 55 | + "simulatorType": "wechat", | |
| 56 | + "simulatorPluginLibVersion": {}, | |
| 57 | + "condition": {}, | |
| 58 | + "editorSetting": { | |
| 59 | + "tabIndent": "insertSpaces", | |
| 60 | + "tabSize": 4 | |
| 61 | + } | |
| 62 | +} | |
| 0 | 63 | \ No newline at end of file | ... | ... |
| 1 | +++ a/project.private.config.json | |
| ... | ... | @@ -0,0 +1,7 @@ |
| 1 | +{ | |
| 2 | + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", | |
| 3 | + "projectname": "%E5%8D%87%E5%AD%A6%E6%B1%87", | |
| 4 | + "setting": { | |
| 5 | + "compileHotReLoad": true | |
| 6 | + } | |
| 7 | +} | |
| 0 | 8 | \ No newline at end of file | ... | ... |
| 1 | +++ a/utils/md5.js | |
| ... | ... | @@ -0,0 +1,514 @@ |
| 1 | +/* | |
| 2 | + | |
| 3 | +* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message | |
| 4 | + | |
| 5 | +* Digest Algorithm, as defined in RFC 1321. | |
| 6 | + | |
| 7 | +* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. | |
| 8 | + | |
| 9 | +* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | |
| 10 | + | |
| 11 | +* Distributed under the BSD License | |
| 12 | + | |
| 13 | +* See http://pajhome.org.uk/crypt/md5 for more info. | |
| 14 | + | |
| 15 | +*/ | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | +/* | |
| 20 | + | |
| 21 | +* Configurable variables. You may need to tweak these to be compatible with | |
| 22 | + | |
| 23 | +* the server-side, but the defaults work in most cases. | |
| 24 | + | |
| 25 | +*/ | |
| 26 | + | |
| 27 | +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ | |
| 28 | + | |
| 29 | +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ | |
| 30 | + | |
| 31 | +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | +/* | |
| 36 | + | |
| 37 | +* These are the functions you'll usually want to call | |
| 38 | + | |
| 39 | +* They take string arguments and return either hex or base-64 encoded strings | |
| 40 | + | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +function hex_md5(s) { | |
| 44 | + return binl2hex(core_md5(str2binl(s), s.length * chrsz)); | |
| 45 | +} | |
| 46 | + | |
| 47 | +function b64_md5(s) { | |
| 48 | + return binl2b64(core_md5(str2binl(s), s.length * chrsz)); | |
| 49 | +} | |
| 50 | + | |
| 51 | +function str_md5(s) { | |
| 52 | + return binl2str(core_md5(str2binl(s), s.length * chrsz)); | |
| 53 | +} | |
| 54 | + | |
| 55 | +function hex_hmac_md5(key, data) { | |
| 56 | + return binl2hex(core_hmac_md5(key, data)); | |
| 57 | +} | |
| 58 | + | |
| 59 | +function b64_hmac_md5(key, data) { | |
| 60 | + return binl2b64(core_hmac_md5(key, data)); | |
| 61 | +} | |
| 62 | + | |
| 63 | +function str_hmac_md5(key, data) { | |
| 64 | + return binl2str(core_hmac_md5(key, data)); | |
| 65 | +} | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | +/* | |
| 70 | + | |
| 71 | +* Perform a simple self-test to see if the VM is working | |
| 72 | + | |
| 73 | +*/ | |
| 74 | + | |
| 75 | +function md5_vm_test() | |
| 76 | + | |
| 77 | +{ | |
| 78 | + return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; | |
| 79 | + | |
| 80 | +} | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | +/* | |
| 85 | + | |
| 86 | +* Calculate the MD5 of an array of little-endian words, and a bit length | |
| 87 | + | |
| 88 | +*/ | |
| 89 | + | |
| 90 | +function core_md5(x, len) | |
| 91 | + | |
| 92 | +{ | |
| 93 | + /* append padding */ | |
| 94 | + | |
| 95 | + x[len >> 5] |= 0x80 << ((len) % 32); | |
| 96 | + | |
| 97 | + x[(((len + 64) >>> 9) << 4) + 14] = len; | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + var a = 1732584193; | |
| 102 | + | |
| 103 | + var b = -271733879; | |
| 104 | + | |
| 105 | + var c = -1732584194; | |
| 106 | + | |
| 107 | + var d = 271733878; | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + for (var i = 0; i < x.length; i += 16) | |
| 112 | + | |
| 113 | + { | |
| 114 | + var olda = a; | |
| 115 | + | |
| 116 | + var oldb = b; | |
| 117 | + | |
| 118 | + var oldc = c; | |
| 119 | + | |
| 120 | + var oldd = d; | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); | |
| 125 | + | |
| 126 | + d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); | |
| 127 | + | |
| 128 | + c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); | |
| 129 | + | |
| 130 | + b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); | |
| 131 | + | |
| 132 | + a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); | |
| 133 | + | |
| 134 | + d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); | |
| 135 | + | |
| 136 | + c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); | |
| 137 | + | |
| 138 | + b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); | |
| 139 | + | |
| 140 | + a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); | |
| 141 | + | |
| 142 | + d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); | |
| 143 | + | |
| 144 | + c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); | |
| 145 | + | |
| 146 | + b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); | |
| 147 | + | |
| 148 | + a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); | |
| 149 | + | |
| 150 | + d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); | |
| 151 | + | |
| 152 | + c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); | |
| 153 | + | |
| 154 | + b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); | |
| 159 | + | |
| 160 | + d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); | |
| 161 | + | |
| 162 | + c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); | |
| 163 | + | |
| 164 | + b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); | |
| 165 | + | |
| 166 | + a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); | |
| 167 | + | |
| 168 | + d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); | |
| 169 | + | |
| 170 | + c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); | |
| 171 | + | |
| 172 | + b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); | |
| 173 | + | |
| 174 | + a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); | |
| 175 | + | |
| 176 | + d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); | |
| 177 | + | |
| 178 | + c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); | |
| 179 | + | |
| 180 | + b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); | |
| 181 | + | |
| 182 | + a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); | |
| 183 | + | |
| 184 | + d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); | |
| 185 | + | |
| 186 | + c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); | |
| 187 | + | |
| 188 | + b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); | |
| 193 | + | |
| 194 | + d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); | |
| 195 | + | |
| 196 | + c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); | |
| 197 | + | |
| 198 | + b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); | |
| 199 | + | |
| 200 | + a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); | |
| 201 | + | |
| 202 | + d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); | |
| 203 | + | |
| 204 | + c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); | |
| 205 | + | |
| 206 | + b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); | |
| 207 | + | |
| 208 | + a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); | |
| 209 | + | |
| 210 | + d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); | |
| 211 | + | |
| 212 | + c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); | |
| 213 | + | |
| 214 | + b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); | |
| 215 | + | |
| 216 | + a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); | |
| 217 | + | |
| 218 | + d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); | |
| 219 | + | |
| 220 | + c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); | |
| 221 | + | |
| 222 | + b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); | |
| 227 | + | |
| 228 | + d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); | |
| 229 | + | |
| 230 | + c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); | |
| 231 | + | |
| 232 | + b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); | |
| 233 | + | |
| 234 | + a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); | |
| 235 | + | |
| 236 | + d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); | |
| 237 | + | |
| 238 | + c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); | |
| 239 | + | |
| 240 | + b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); | |
| 241 | + | |
| 242 | + a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); | |
| 243 | + | |
| 244 | + d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); | |
| 245 | + | |
| 246 | + c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); | |
| 247 | + | |
| 248 | + b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); | |
| 249 | + | |
| 250 | + a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); | |
| 251 | + | |
| 252 | + d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); | |
| 253 | + | |
| 254 | + c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); | |
| 255 | + | |
| 256 | + b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + a = safe_add(a, olda); | |
| 261 | + | |
| 262 | + b = safe_add(b, oldb); | |
| 263 | + | |
| 264 | + c = safe_add(c, oldc); | |
| 265 | + | |
| 266 | + d = safe_add(d, oldd); | |
| 267 | + | |
| 268 | + } | |
| 269 | + | |
| 270 | + return Array(a, b, c, d); | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | +} | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | +/* | |
| 279 | + | |
| 280 | +* These functions implement the four basic operations the algorithm uses. | |
| 281 | + | |
| 282 | +*/ | |
| 283 | + | |
| 284 | +function md5_cmn(q, a, b, x, s, t) | |
| 285 | + | |
| 286 | +{ | |
| 287 | + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); | |
| 288 | + | |
| 289 | +} | |
| 290 | + | |
| 291 | +function md5_ff(a, b, c, d, x, s, t) | |
| 292 | + | |
| 293 | +{ | |
| 294 | + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); | |
| 295 | + | |
| 296 | +} | |
| 297 | + | |
| 298 | +function md5_gg(a, b, c, d, x, s, t) | |
| 299 | + | |
| 300 | +{ | |
| 301 | + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); | |
| 302 | + | |
| 303 | +} | |
| 304 | + | |
| 305 | +function md5_hh(a, b, c, d, x, s, t) | |
| 306 | + | |
| 307 | +{ | |
| 308 | + return md5_cmn(b ^ c ^ d, a, b, x, s, t); | |
| 309 | + | |
| 310 | +} | |
| 311 | + | |
| 312 | +function md5_ii(a, b, c, d, x, s, t) | |
| 313 | + | |
| 314 | +{ | |
| 315 | + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); | |
| 316 | + | |
| 317 | +} | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | +/* | |
| 322 | + | |
| 323 | +* Calculate the HMAC-MD5, of a key and some data | |
| 324 | + | |
| 325 | +*/ | |
| 326 | + | |
| 327 | +function core_hmac_md5(key, data) | |
| 328 | + | |
| 329 | +{ | |
| 330 | + var bkey = str2binl(key); | |
| 331 | + | |
| 332 | + if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + var ipad = Array(16), | |
| 337 | + opad = Array(16); | |
| 338 | + | |
| 339 | + for (var i = 0; i < 16; i++) | |
| 340 | + | |
| 341 | + { | |
| 342 | + ipad[i] = bkey[i] ^ 0x36363636; | |
| 343 | + | |
| 344 | + opad[i] = bkey[i] ^ 0x5C5C5C5C; | |
| 345 | + | |
| 346 | + } | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); | |
| 351 | + | |
| 352 | + return core_md5(opad.concat(hash), 512 + 128); | |
| 353 | + | |
| 354 | +} | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | +/* | |
| 359 | + | |
| 360 | +* Add integers, wrapping at 2^32. This uses 16-bit operations internally | |
| 361 | + | |
| 362 | +* to work around bugs in some JS interpreters. | |
| 363 | + | |
| 364 | +*/ | |
| 365 | + | |
| 366 | +function safe_add(x, y) | |
| 367 | + | |
| 368 | +{ | |
| 369 | + var lsw = (x & 0xFFFF) + (y & 0xFFFF); | |
| 370 | + | |
| 371 | + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); | |
| 372 | + | |
| 373 | + return (msw << 16) | (lsw & 0xFFFF); | |
| 374 | + | |
| 375 | +} | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | +/* | |
| 380 | + | |
| 381 | +* Bitwise rotate a 32-bit number to the left. | |
| 382 | + | |
| 383 | +*/ | |
| 384 | + | |
| 385 | +function bit_rol(num, cnt) | |
| 386 | + | |
| 387 | +{ | |
| 388 | + return (num << cnt) | (num >>> (32 - cnt)); | |
| 389 | + | |
| 390 | +} | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | +/* | |
| 395 | + | |
| 396 | +* Convert a string to an array of little-endian words | |
| 397 | + | |
| 398 | +* If chrsz is ASCII, characters >255 have their hi-byte silently ignored. | |
| 399 | + | |
| 400 | +*/ | |
| 401 | + | |
| 402 | +function str2binl(str) | |
| 403 | + | |
| 404 | +{ | |
| 405 | + var bin = Array(); | |
| 406 | + | |
| 407 | + var mask = (1 << chrsz) - 1; | |
| 408 | + | |
| 409 | + for (var i = 0; i < str.length * chrsz; i += chrsz) | |
| 410 | + | |
| 411 | + bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); | |
| 412 | + | |
| 413 | + return bin; | |
| 414 | + | |
| 415 | +} | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | +/* | |
| 420 | + | |
| 421 | +* Convert an array of little-endian words to a string | |
| 422 | + | |
| 423 | +*/ | |
| 424 | + | |
| 425 | +function binl2str(bin) | |
| 426 | + | |
| 427 | +{ | |
| 428 | + var str = ""; | |
| 429 | + | |
| 430 | + var mask = (1 << chrsz) - 1; | |
| 431 | + | |
| 432 | + for (var i = 0; i < bin.length * 32; i += chrsz) | |
| 433 | + | |
| 434 | + str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask); | |
| 435 | + | |
| 436 | + return str; | |
| 437 | + | |
| 438 | +} | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | +/* | |
| 443 | + | |
| 444 | +* Convert an array of little-endian words to a hex string. | |
| 445 | + | |
| 446 | +*/ | |
| 447 | + | |
| 448 | +function binl2hex(binarray) | |
| 449 | + | |
| 450 | +{ | |
| 451 | + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; | |
| 452 | + | |
| 453 | + var str = ""; | |
| 454 | + | |
| 455 | + for (var i = 0; i < binarray.length * 4; i++) | |
| 456 | + | |
| 457 | + { | |
| 458 | + str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + | |
| 459 | + | |
| 460 | + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF); | |
| 461 | + | |
| 462 | + } | |
| 463 | + | |
| 464 | + return str; | |
| 465 | + | |
| 466 | +} | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | +/* | |
| 471 | + | |
| 472 | +* Convert an array of little-endian words to a base-64 string | |
| 473 | + | |
| 474 | +*/ | |
| 475 | + | |
| 476 | +function binl2b64(binarray) | |
| 477 | + | |
| 478 | +{ | |
| 479 | + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |
| 480 | + | |
| 481 | + var str = ""; | |
| 482 | + | |
| 483 | + for (var i = 0; i < binarray.length * 4; i += 3) | |
| 484 | + | |
| 485 | + { | |
| 486 | + var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) | |
| 487 | + | |
| 488 | + | | |
| 489 | + (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) | |
| 490 | + | |
| 491 | + | | |
| 492 | + ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); | |
| 493 | + | |
| 494 | + for (var j = 0; j < 4; j++) | |
| 495 | + | |
| 496 | + { | |
| 497 | + if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; | |
| 498 | + | |
| 499 | + else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); | |
| 500 | + | |
| 501 | + } | |
| 502 | + | |
| 503 | + } | |
| 504 | + | |
| 505 | + return str; | |
| 506 | + | |
| 507 | +} | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | +module.exports = { | |
| 513 | + hex_md5: hex_md5, | |
| 514 | +} | |
| 0 | 515 | \ No newline at end of file | ... | ... |
| 1 | +++ a/升学汇打卡小程序-计划管家 | ... | ... |