├── README.md
├── app.js
├── app.json
├── app.wxss
├── images
├── blonze_cup.png
├── complete.png
├── currentNumber.png
├── days.png
├── detail.png
├── detail_g.png
├── end.png
├── gold_cup.png
├── homePage.png
├── homePage_g.png
├── next.png
├── pre.png
├── robot.png
├── robot_g.png
├── sign.png
├── signNumber.png
├── sign_g.png
├── silver_cup.png
├── totalNumber.png
├── zone.png
└── zone_g.png
├── pages
├── Activities
│ ├── Activities.js
│ ├── Activities.json
│ ├── Activities.wxml
│ └── Activities.wxss
├── ActivityDetail
│ ├── ActivityDetail.js
│ ├── ActivityDetail.json
│ ├── ActivityDetail.wxml
│ └── ActivityDetail.wxss
├── Calendar
│ ├── Calendar.js
│ ├── Calendar.json
│ ├── Calendar.wxml
│ └── Calendar.wxss
├── ChangeActivity
│ ├── ChangeActivity.js
│ ├── ChangeActivity.json
│ ├── ChangeActivity.wxml
│ └── ChangeActivity.wxss
├── ChangeTask
│ ├── ChangeTask.js
│ ├── ChangeTask.json
│ ├── ChangeTask.wxml
│ └── ChangeTask.wxss
├── Chat
│ ├── Chat.js
│ ├── Chat.json
│ ├── Chat.wxml
│ └── Chat.wxss
├── Cover
│ ├── Cover.js
│ ├── Cover.json
│ ├── Cover.wxml
│ └── Cover.wxss
├── CreateTask
│ ├── CreateTask.js
│ ├── CreateTask.json
│ ├── CreateTask.wxml
│ └── CreateTask.wxss
├── Detail
│ ├── Detail.js
│ ├── Detail.json
│ ├── Detail.wxml
│ └── Detail.wxss
├── Login
│ ├── Login.js
│ ├── Login.json
│ ├── Login.wxml
│ └── Login.wxss
├── Main
│ ├── Main.js
│ ├── Main.json
│ ├── Main.wxml
│ └── Main.wxss
├── ManageActivity
│ ├── ManageActivity.js
│ ├── ManageActivity.json
│ ├── ManageActivity.wxml
│ └── ManageActivity.wxss
├── ManageTask
│ ├── ManageTask.js
│ ├── ManageTask.json
│ ├── ManageTask.wxml
│ └── ManageTask.wxss
├── Range
│ ├── Range.js
│ ├── Range.json
│ ├── Range.wxml
│ └── Range.wxss
├── Register
│ ├── Register.js
│ ├── Register.json
│ ├── Register.wxml
│ └── Register.wxss
├── Robot
│ ├── Robot.js
│ ├── Robot.json
│ ├── Robot.wxml
│ └── Robot.wxss
├── Sign
│ ├── Sign.js
│ ├── Sign.json
│ ├── Sign.wxml
│ └── Sign.wxss
├── Suggest
│ ├── Suggest.js
│ ├── Suggest.json
│ ├── Suggest.wxml
│ └── Suggest.wxss
├── TaskDetail
│ ├── TaskDetail.js
│ ├── TaskDetail.json
│ ├── TaskDetail.wxml
│ └── TaskDetail.wxss
├── TaskRange
│ ├── TaskRange.js
│ ├── TaskRange.json
│ ├── TaskRange.wxml
│ └── TaskRange.wxss
├── Zone
│ ├── Zone.js
│ ├── Zone.json
│ ├── Zone.wxml
│ └── Zone.wxss
└── logs
│ ├── logs.js
│ ├── logs.json
│ ├── logs.wxml
│ └── logs.wxss
├── project.config.json
└── utils
├── QR.js
├── bmob.js
├── bmobSocketIo.js
├── common.js
├── underscore.js
└── util.js
/README.md:
--------------------------------------------------------------------------------
1 | # Association
2 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | //app.js
2 | var Bmob = require('utils/bmob.js');
3 | Bmob.initialize("ddfac8f81437ec07a4c4dfdde798d8c3", "d301adcb62e67bfe5cd5fd6bc97e7a91");
4 | App({
5 | onLaunch: function () {
6 | // 展示本地存储能力
7 | var logs = wx.getStorageSync('logs') || []
8 | logs.unshift(Date.now())
9 | wx.setStorageSync('logs', logs)
10 |
11 | },
12 | globalData: {
13 | userInfo: null
14 | },
15 | req: function (method, url, arg) {
16 | let domian = 'http://www.tuling123.com', data = { 'key': 'dc0c5c7ff7624a97a844b6dc84448459' }, dataType = 'json';
17 | let header = { 'content-type': 'application/x-www-form-urlencoded' };
18 | if (arg.data) {
19 | data = Object.assign(data, arg.data);
20 | }
21 | if (arg.header) {
22 | header = Object.assign(header, arg.header);
23 | }
24 | if (arg.dataType) {
25 | dataType = arg.dataType;
26 | }
27 | let request = {
28 | method: method.toUpperCase(),
29 | url: domian + url,
30 | data: data,
31 | dataType: dataType,
32 | header: header,
33 | success: function (resp) {
34 | console.log('response content:', resp.data);
35 | let data = resp.data;
36 | typeof arg.success == "function" && arg.success(data);
37 | },
38 | fail: function () {
39 | wx.showToast({
40 | title: '请求失败,请稍后再试',
41 | icon: 'success',
42 | duration: 2000
43 | });
44 | typeof arg.fail == "function" && arg.fail();
45 | },
46 | complete: function () {
47 | typeof arg.complete == "function" && arg.complete();
48 | }
49 | };
50 | wx.request(request);
51 | }
52 | })
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages":[
3 | "pages/Cover/Cover",
4 | "pages/Main/Main",
5 | "pages/ManageTask/ManageTask",
6 | "pages/Sign/Sign",
7 | "pages/Calendar/Calendar",
8 | "pages/CreateTask/CreateTask",
9 | "pages/TaskRange/TaskRange",
10 | "pages/Range/Range",
11 | "pages/TaskDetail/TaskDetail",
12 | "pages/ManageActivity/ManageActivity",
13 | "pages/Detail/Detail",
14 | "pages/Zone/Zone",
15 | "pages/Activities/Activities",
16 | "pages/Suggest/Suggest",
17 | "pages/ChangeActivity/ChangeActivity",
18 | "pages/ChangeTask/ChangeTask",
19 | "pages/Register/Register",
20 | "pages/Login/Login",
21 | "pages/ActivityDetail/ActivityDetail",
22 | "pages/logs/logs"
23 | ],
24 | "window":{
25 | "backgroundTextStyle":"light",
26 | "navigationBarBackgroundColor": "#fff",
27 | "navigationBarTitleText": "山东大学唐仲英爱心社",
28 | "navigationBarTextStyle":"black"
29 | },
30 | "tabBar": {
31 | "color": "#a9b7b7",
32 | "selectedColor": "#11cd6e",
33 | "borderStyle": "white",
34 | "list": [
35 | {
36 | "selectedIconPath": "images/homePage_g.png",
37 | "iconPath": "images/homePage.png",
38 | "pagePath": "pages/Main/Main",
39 | "text": "首页"
40 | },
41 | {
42 | "selectedIconPath": "images/zone_g.png",
43 | "iconPath": "images/zone.png",
44 | "pagePath": "pages/Zone/Zone",
45 | "text": "活动考核"
46 | },
47 | {
48 | "selectedIconPath": "images/sign_g.png",
49 | "iconPath": "images/sign.png",
50 | "pagePath": "pages/Sign/Sign",
51 | "text": "诚信状"
52 | },
53 | {
54 | "selectedIconPath": "images/detail_g.png",
55 | "iconPath": "images/detail.png",
56 | "pagePath": "pages/Detail/Detail",
57 | "text": "个人中心"
58 | }
59 | ]
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app.wxss:
--------------------------------------------------------------------------------
1 | /**app.wxss**/
2 | .container {
3 | height: 100%;
4 | display: flex;
5 | flex-direction: column;
6 | align-items: center;
7 | justify-content: space-between;
8 | padding: 200rpx 0;
9 | box-sizing: border-box;
10 | }
11 |
--------------------------------------------------------------------------------
/images/blonze_cup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/blonze_cup.png
--------------------------------------------------------------------------------
/images/complete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/complete.png
--------------------------------------------------------------------------------
/images/currentNumber.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/currentNumber.png
--------------------------------------------------------------------------------
/images/days.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/days.png
--------------------------------------------------------------------------------
/images/detail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/detail.png
--------------------------------------------------------------------------------
/images/detail_g.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/detail_g.png
--------------------------------------------------------------------------------
/images/end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/end.png
--------------------------------------------------------------------------------
/images/gold_cup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/gold_cup.png
--------------------------------------------------------------------------------
/images/homePage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/homePage.png
--------------------------------------------------------------------------------
/images/homePage_g.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/homePage_g.png
--------------------------------------------------------------------------------
/images/next.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/next.png
--------------------------------------------------------------------------------
/images/pre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/pre.png
--------------------------------------------------------------------------------
/images/robot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/robot.png
--------------------------------------------------------------------------------
/images/robot_g.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/robot_g.png
--------------------------------------------------------------------------------
/images/sign.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/sign.png
--------------------------------------------------------------------------------
/images/signNumber.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/signNumber.png
--------------------------------------------------------------------------------
/images/sign_g.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/sign_g.png
--------------------------------------------------------------------------------
/images/silver_cup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/silver_cup.png
--------------------------------------------------------------------------------
/images/totalNumber.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/totalNumber.png
--------------------------------------------------------------------------------
/images/zone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/zone.png
--------------------------------------------------------------------------------
/images/zone_g.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Heavn13/Association/d6fe599000808447736fbfea3ba1f8b075ba62ae/images/zone_g.png
--------------------------------------------------------------------------------
/pages/Activities/Activities.js:
--------------------------------------------------------------------------------
1 | // pages/index/Activities.js
2 | //创建活动页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | activity_name:'',
12 | activity_time:'',
13 | activity_place:'',
14 | activity_summary:'',
15 | activity_number:''
16 | },
17 |
18 | /**
19 | * 生命周期函数--监听页面加载
20 | */
21 | onLoad: function (options) {
22 | //获取系统当前时间年月日
23 | var time = util.formatTime2(new Date());
24 | this.setData({activity_time: time});
25 | },
26 |
27 | /**
28 | * 生命周期函数--监听页面初次渲染完成
29 | */
30 | onReady: function () {
31 |
32 | },
33 |
34 | /**
35 | * 生命周期函数--监听页面显示
36 | */
37 | onShow: function () {
38 |
39 | },
40 |
41 | /**
42 | * 生命周期函数--监听页面隐藏
43 | */
44 | onHide: function () {
45 |
46 | },
47 |
48 | /**
49 | * 生命周期函数--监听页面卸载
50 | */
51 | onUnload: function () {
52 |
53 | },
54 |
55 | /**
56 | * 页面相关事件处理函数--监听用户下拉动作
57 | */
58 | onPullDownRefresh: function () {
59 |
60 | },
61 |
62 | /**
63 | * 页面上拉触底事件的处理函数
64 | */
65 | onReachBottom: function () {
66 |
67 | },
68 |
69 | /**
70 | * 用户点击右上角分享
71 | */
72 | onShareAppMessage: function () {
73 |
74 | },
75 |
76 | //日期选择监听器
77 | listenerDatePickerSelected: function (e) {
78 | //调用setData()重新绘制
79 | this.setData({
80 | activity_time: e.detail.value,
81 | });
82 | },
83 |
84 | //获取输入的活动名称
85 | onGetName: function (e) {
86 | this.setData({ activity_name: e.detail.value });
87 | },
88 |
89 | //获取输入的活动地点
90 | onGetPlace: function (e) {
91 | this.setData({ activity_place: e.detail.value });
92 | },
93 |
94 | //获取输入的活动简介
95 | onGetSummary: function (e) {
96 | this.setData({ activity_summary: e.detail.value });
97 | },
98 |
99 | //获取输入的活动人数
100 | onGetNumber: function (e) {
101 | this.setData({ activity_number: e.detail.value });
102 | },
103 |
104 | //创建活动
105 | onCreate: function(e){
106 | var that = this;
107 | var currentUser = Bmob.User.current();
108 | //判断所有输入框不为空
109 | if (that.data.activity_name != '' && that.data.activity_time != '' && that.data.activity_place != '' && that.data.activity_summary != '' && that.data.activity_number != ''){
110 | var Activity = Bmob.Object.extend("activity");
111 | var activity = new Activity();
112 | activity.set("name", that.data.activity_name);
113 | activity.set("time", that.data.activity_time);
114 | activity.set("place", that.data.activity_place);
115 | activity.set("summary", that.data.activity_summary);
116 | activity.set("number", that.data.activity_number);
117 | activity.set("createdby", currentUser.get('realname'));
118 | activity.set("currentNumber", '0');
119 | //添加数据,第一个入口参数是null
120 | activity.save(null, {
121 | success: function (result) {
122 | wx.showToast({
123 | title: '创建成功',
124 | duration: 2000
125 | })
126 | },
127 | error: function (result, error) {
128 | wx.showModal({
129 | title: '提示',
130 | content: '活动创建失败'
131 | })
132 | }
133 | });
134 | }else{
135 | wx.showModal({
136 | title: '提示',
137 | content: '请把内容填写完整'
138 | })
139 | }
140 |
141 | }
142 |
143 | })
--------------------------------------------------------------------------------
/pages/Activities/Activities.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "创建活动"
3 | }
--------------------------------------------------------------------------------
/pages/Activities/Activities.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | {{activity_time}}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/pages/Activities/Activities.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Activities.wxss */
2 | /*创建活动页面*/
3 | .container{
4 | padding-top: 20rpx;
5 | }
6 |
7 | .title{
8 | color: red;
9 | margin: 30rpx;
10 | font-size: 50rpx;
11 | }
12 |
13 | .input{
14 | margin: 10rpx auto;
15 | display: flex;
16 | align-items: center;
17 | padding: 0 40rpx;
18 | background-color: #fff;
19 | font-size: 34rpx;
20 | color: #000;
21 | }
22 |
23 | .input input{
24 | height: 40rpx;
25 | width: 450rpx;
26 | padding: 10rpx;
27 | background-color: #acd;
28 | border-radius: 5px;
29 | }
30 |
31 | .input picker{
32 | height: 40rpx;
33 | width: 450rpx;
34 | padding: 10rpx;
35 | background-color: #acd;
36 | border-radius: 5px;
37 | }
38 |
39 | .input .summary{
40 | height: 300rpx;
41 | width: 450rpx;
42 | padding: 10rpx;
43 | background-color: #acd;
44 | border-radius: 5px;
45 | }
46 |
47 | .buttons{
48 | margin: 10rpx auto;
49 | display: flex;
50 | }
51 |
52 | .buttons button{
53 | width: 500rpx;
54 | text-align: center;
55 | margin: 50rpx;
56 | font-size: 34rpx;
57 | }
58 |
59 |
--------------------------------------------------------------------------------
/pages/ActivityDetail/ActivityDetail.js:
--------------------------------------------------------------------------------
1 | // pages/index/ActivitieDetail.js
2 | //活动详情页面
3 | var QR = require("../../utils/QR.js");
4 | var Bmob = require('../../utils/bmob.js');
5 | var util = require('../../utils/util.js');
6 | Page({
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | activity_name: '',
12 | activity_time: '',
13 | currentTime: '',
14 | activity_place: '',
15 | activity_summary: '',
16 | activity_number: '',
17 | activity_currentNumber: '',
18 | objectId: '',//当前活动的id
19 | currentId: '',//当前用户活动的报名信息
20 | enroll: false,//报名
21 | signUp: false,//签到
22 | canvasHidden: true,
23 | },
24 | canvasId: "qrcCanvas",//画布的id
25 |
26 | /**
27 | * 生命周期函数--监听页面加载
28 | */
29 | onLoad: function (options) {
30 | //获取当前活动的objectId
31 | this.setData({ objectId: options.objectId });
32 | this.setData({ enroll: Boolean(options.enroll) });
33 | var time = util.formatTime2(new Date());
34 | this.setData({ currentTime: time });
35 | this.onInit();
36 | },
37 | /**
38 | * 生命周期函数--监听页面初次渲染完成
39 | */
40 | onReady: function () {
41 | this.size = this.setCanvasSize();//动态设置画布大小
42 | },
43 |
44 | /**
45 | * 生命周期函数--监听页面显示
46 | */
47 | onShow: function () {
48 | //初始化数据
49 | this.onInit();
50 | },
51 |
52 | /**
53 | * 生命周期函数--监听页面隐藏
54 | */
55 | onHide: function () {
56 |
57 | },
58 |
59 | /**
60 | * 生命周期函数--监听页面卸载
61 | */
62 | onUnload: function () {
63 |
64 | },
65 |
66 | /**
67 | * 页面相关事件处理函数--监听用户下拉动作
68 | */
69 | onPullDownRefresh: function () {
70 |
71 | },
72 |
73 | /**
74 | * 页面上拉触底事件的处理函数
75 | */
76 | onReachBottom: function () {
77 |
78 | },
79 |
80 | /**
81 | * 用户点击右上角分享
82 | */
83 | onShareAppMessage: function () {
84 |
85 | },
86 |
87 | //设置画板大小
88 | setCanvasSize: function () {
89 | var size = {};
90 | try {
91 | var res = wx.getSystemInfoSync();
92 | var scale = 750 / 686;//不同屏幕下canvas的适配比例;设计稿是750宽
93 | var width = res.windowWidth / scale;
94 | var height = width;//canvas画布为正方形
95 | size.w = width;
96 | size.h = height;
97 | } catch (e) {
98 | // Do something when catch error
99 | console.log("获取设备信息失败" + e);
100 | }
101 | return size;
102 | },
103 |
104 | //生成二维码函数
105 | createQrCode: function (str, canvasId, cavW, cavH) {
106 | //调用插件中的draw方法,绘制二维码图片
107 | QR.api.draw(str, canvasId, cavW, cavH);
108 | },
109 |
110 | //生成二维码按钮
111 | onGenQrc: function () {
112 | var currentUser = Bmob.User.current();
113 | //拥有生成二维码的权限
114 | if (currentUser.get('sign') == true) {
115 | this.createQrCode(this.data.activity_name, this.canvasId, this.size.w, this.size.h);
116 | this.setData({ canvasHidden: false });
117 | } else {
118 | wx.showModal({
119 | title: '提示',
120 | content: '你没有生成签到二维码的权限'
121 | })
122 | }
123 | },
124 |
125 | //报名函数
126 | onEnroll: function () {
127 | var that = this;
128 | //判断报名时间小等于活动时间
129 | if (that.data.currentTime <= that.data.activity_time) {
130 | //判断当前用户是否已报名
131 | var currentUser = Bmob.User.current();
132 | var Activity_User = Bmob.Object.extend("activity_user");
133 | var query = new Bmob.Query(Activity_User);
134 | query.equalTo('realname', currentUser.get("realname"));
135 | query.equalTo('activityid', that.data.objectId);
136 | // 查询所有数据
137 | query.find({
138 | success: function (results) {
139 | for (var i = 0; i < results.length; i++) {
140 | var object = results[i];
141 | that.setData({ enroll: true });
142 | wx.showModal({
143 | title: '提示',
144 | content: '你已报名,无需重复报名'
145 | })
146 | }
147 | //当前用户未报名
148 | if (that.data.enroll == false) {
149 | //报名人数小于当前活动人数可以报名
150 | if (parseInt(that.data.activity_currentNumber) < parseInt(that.data.activity_number)) {
151 | var Activity_User = Bmob.Object.extend("activity_user");
152 | var au = new Activity_User();
153 | au.set("activityname", that.data.activity_name);
154 | au.set("activitytime", that.data.activity_time);
155 | au.set("realname", currentUser.get("realname"));
156 | au.set("campus", currentUser.get("campus"));
157 | au.set("department", currentUser.get("department"));
158 | var grade = String(currentUser.get("username")).substr(0, 4) + "级"
159 | au.set("grade",grade);
160 | au.set("signUp", false);
161 | au.set("enroll", true);
162 | au.set("activityid", that.data.objectId);
163 | au.save(null, {
164 | success: function (result) {
165 | that.setData({ enroll: true });
166 | that.setData({ currentId: result.id });
167 | wx.showToast({
168 | title: '报名成功',
169 | duration: 2000
170 | })
171 | },
172 | error: function (result, error) {
173 | console.log(error);
174 | wx.showModal({
175 | title: '提示',
176 | content: '报名失败'
177 | })
178 | }
179 | });
180 | // 增加活动报名人数
181 | that.onAddNumbers();
182 |
183 | } else {
184 | wx.showModal({
185 | title: '提示',
186 | content: '人数已满,报名失败'
187 | })
188 | }
189 | }
190 | },
191 | error: function (error) {
192 |
193 | }
194 | });
195 | }
196 | else {
197 | wx.showModal({
198 | title: '提示',
199 | content: '该活动报名时间已过期'
200 | })
201 | }
202 |
203 | },
204 |
205 | //取消报名
206 | onUnEnroll: function () {
207 | var that = this;
208 | //判断报名时间小等于活动时间
209 | if (that.data.currentTime <= that.data.activity_time) {
210 | wx.showModal({
211 | title: '提示',
212 | content: '是否取消报名',
213 | success: function (res) {
214 | //点击确定删除
215 | if (res.confirm) {
216 | var Activity_User = Bmob.Object.extend("activity_user");
217 | var query = new Bmob.Query(Activity_User);
218 | query.get(that.data.currentId, {
219 | success: function (object) {
220 | that.setData({ enroll: false });
221 | object.destroy({
222 | success: function (deleteObject) {
223 | wx.showToast({
224 | title: '取消成功',
225 | duration: 2000
226 | });
227 | that.onSubNumbers();
228 |
229 | },
230 | error: function (object, error) {
231 | wx.showModal({
232 | title: '提示',
233 | content: '报名取消失败'
234 | })
235 | }
236 | });
237 | },
238 | error: function (object, error) {
239 | console.log("query object fail");
240 | }
241 | });
242 | }
243 | }
244 | });
245 | } else {
246 | wx.showModal({
247 | title: '提示',
248 | content: '该活动已过期,无法取消报名'
249 | })
250 | }
251 |
252 |
253 | },
254 |
255 | //签到函数
256 | onSign: function () {
257 | var that = this;
258 | //未报名
259 | if (!that.data.enroll) {
260 | wx.showModal({
261 | title: '提示',
262 | content: '你尚未报名,请报名后再签到'
263 | })
264 | } else {
265 | //判断活动时间才可以签到
266 | if (that.data.currentTime == that.data.activity_time) {
267 | //扫码签到
268 | wx.scanCode({
269 | success: (res) => {
270 | if (res.result == that.data.activity_name) {
271 | //更新签到状态
272 | var Activity_User = Bmob.Object.extend("activity_user");
273 | var query = new Bmob.Query(Activity_User);
274 | query.get(that.data.currentId, {
275 | success: function (result) {
276 | that.setData({ signUp: true });
277 | result.set('signUp', true);
278 | result.save();
279 | wx.showToast({
280 | title: '签到成功',
281 | duration: 2000
282 | })
283 | },
284 | error: function (object, error) {
285 | wx.showModal({
286 | title: '提示',
287 | content: '签到失败'
288 | })
289 | }
290 | });
291 | } else {
292 | that.setData({ signUp: false })
293 | wx.showModal({
294 | title: '提示',
295 | content: '签到失败'
296 | })
297 | }
298 | }
299 | })
300 | } else {
301 | wx.showModal({
302 | title: '提示',
303 | content: '未到活动时间,无法签到'
304 | })
305 | }
306 | }
307 | },
308 |
309 | //初始化数据
310 | onInit: function () {
311 | var that = this;
312 | var currentUser = Bmob.User.current();
313 | //获取当前活动相关数据
314 | var Activity = Bmob.Object.extend("activity");
315 | var query = new Bmob.Query(Activity);
316 | query.get(that.data.objectId, {
317 | success: function (result) {
318 | // 查询成功,调用get方法获取对应属性的值
319 | that.setData({ activity_name: result.get("name") });
320 | that.setData({ activity_time: result.get("time") });
321 | that.setData({ activity_place: result.get("place") });
322 | that.setData({ activity_summary: result.get("summary") });
323 | that.setData({ activity_number: result.get("number") });
324 | that.setData({ activity_currentNumber: result.get("currentNumber") });
325 | },
326 | error: function (object, error) {
327 | // 查询失败
328 | }
329 | });
330 | //获取当前用户的报名签到状态
331 | var Activity_User = Bmob.Object.extend("activity_user");
332 | var q = new Bmob.Query(Activity_User);
333 | q.equalTo("activityid", that.data.objectId);
334 | q.equalTo("realname", currentUser.get("realname"));
335 | // 查询所有数据
336 | q.find({
337 | success: function (results) {
338 | for (var i = 0; i < results.length; i++) {
339 | var object = results[i];
340 | //当前用户报名签到状态
341 | that.setData({ currentId: object.id });
342 | that.setData({ signUp: object.get("signUp") });
343 | that.setData({ enroll: object.get("enroll") });
344 |
345 | }
346 | },
347 | error: function (object, error) {
348 | // 查询失败
349 | }
350 | });
351 | },
352 |
353 | //增加当前报名人数
354 | onAddNumbers: function () {
355 | var that = this;
356 | var Activity = Bmob.Object.extend("activity");
357 | var query = new Bmob.Query(Activity);
358 | query.get(that.data.objectId, {
359 | success: function (result) {
360 | var cNumber = parseInt(that.data.activity_currentNumber);
361 | cNumber++;
362 | that.setData({ activity_currentNumber: cNumber });
363 | result.set('currentNumber', String(cNumber));
364 | //使用原子操作无效的问题
365 | // result.increment("currentNumber");
366 | result.save();
367 | },
368 | error: function (object, error) {
369 | }
370 | });
371 | },
372 |
373 | //减少当前报名人数
374 | onSubNumbers: function () {
375 | var that = this;
376 | var Activity = Bmob.Object.extend("activity");
377 | var query = new Bmob.Query(Activity);
378 | query.get(that.data.objectId, {
379 | success: function (result) {
380 | var cNumber = parseInt(that.data.activity_currentNumber);
381 | cNumber--;
382 | that.setData({ activity_currentNumber: cNumber });
383 | result.set('currentNumber', String(cNumber));
384 | //使用原子操作无效的问题
385 | //result.increment("currentNumber",-1);
386 | result.save();
387 | },
388 | error: function (object, error) {
389 | }
390 | });
391 |
392 | }
393 | })
--------------------------------------------------------------------------------
/pages/ActivityDetail/ActivityDetail.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "活动详情"
3 | }
--------------------------------------------------------------------------------
/pages/ActivityDetail/ActivityDetail.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{activity_name}}
8 |
9 |
10 |
11 | {{activity_time}}
12 |
13 |
14 |
15 | {{activity_place}}
16 |
17 |
18 |
19 | {{activity_summary}}
20 |
21 |
22 |
23 | {{activity_number}}
24 |
25 |
26 |
27 | {{activity_currentNumber}}
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/pages/ActivityDetail/ActivityDetail.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/ActivitieDetail.wxss */
2 | /*活动详情页面*/
3 | .container{
4 | padding-top: 20rpx;
5 | }
6 |
7 | .title{
8 | color: red;
9 | margin: 30rpx;
10 | font-size: 50rpx;
11 | }
12 |
13 | .text{
14 | margin: 10rpx auto;
15 | display: flex;
16 | align-items: center;
17 | padding: 0 40rpx;
18 | background-color: #fff;
19 | font-size: 34rpx;
20 | color: #000;
21 | }
22 |
23 | .text text{
24 | width: 450rpx;
25 | padding: 10rpx;
26 | background-color: #acd;
27 | }
28 |
29 | .text .summary{
30 | width: 450rpx;
31 | padding: 10rpx;
32 | background-color: #acd;
33 | }
34 |
35 | .buttons{
36 | margin: 10rpx auto;
37 | display: flex;
38 | flex-direction: row;
39 | justify-content: center;
40 | }
41 |
42 | .buttons button{
43 | width: 240rpx;
44 | margin: 20rpx 36rpx;
45 | text-align: center;
46 | font-size: 34rpx;
47 | }
48 |
49 | button{
50 | margin: 30rpx auto;
51 | width: 550rpx;
52 | font-size: 34rpx;
53 | }
54 |
55 | .img-box{
56 | margin-top: 30rpx;
57 | }
58 |
--------------------------------------------------------------------------------
/pages/Calendar/Calendar.js:
--------------------------------------------------------------------------------
1 | // pages/Calendar/Calendar.js
2 | //打卡日历页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | objectId:'',
12 | days:[],
13 | signUp:[],
14 | cur_year:0,
15 | cur_month:0,
16 | count:0
17 | },
18 |
19 | /**
20 | * 生命周期函数--监听页面加载
21 | */
22 | onLoad: function (options) {
23 | this.setData({objectId : options.objectId});
24 | //获取当前年月
25 | const date = new Date();
26 | const cur_year = date.getFullYear();
27 | const cur_month = date.getMonth() + 1;
28 | const weeks_ch = ['日', '一', '二', '三', '四', '五', '六'];
29 | this.calculateEmptyGrids(cur_year, cur_month);
30 | this.calculateDays(cur_year, cur_month);
31 | //获取当前用户当前任务的人签到状态
32 | this.onGetSignUp();
33 | this.setData({
34 | cur_year,
35 | cur_month,
36 | weeks_ch
37 | })
38 |
39 | },
40 |
41 | /**
42 | * 生命周期函数--监听页面初次渲染完成
43 | */
44 | onReady: function () {
45 |
46 | },
47 |
48 | /**
49 | * 生命周期函数--监听页面显示
50 | */
51 | onShow: function () {
52 |
53 | },
54 |
55 | /**
56 | * 生命周期函数--监听页面隐藏
57 | */
58 | onHide: function () {
59 |
60 | },
61 |
62 | /**
63 | * 生命周期函数--监听页面卸载
64 | */
65 | onUnload: function () {
66 |
67 | },
68 |
69 | /**
70 | * 页面相关事件处理函数--监听用户下拉动作
71 | */
72 | onPullDownRefresh: function () {
73 |
74 | },
75 |
76 | /**
77 | * 页面上拉触底事件的处理函数
78 | */
79 | onReachBottom: function () {
80 |
81 | },
82 |
83 | /**
84 | * 用户点击右上角分享
85 | */
86 | onShareAppMessage: function () {
87 |
88 | },
89 | // 获取当月共多少天
90 | getThisMonthDays:function(year, month){
91 | return new Date(year, month, 0).getDate()
92 | },
93 |
94 | // 获取当月第一天星期几
95 | getFirstDayOfWeek:function(year, month) {
96 | return new Date(Date.UTC(year, month - 1, 1)).getDay();
97 | },
98 |
99 | // 计算当月1号前空了几个格子,把它填充在days数组的前面
100 | calculateEmptyGrids:function(year, month) {
101 | var that = this;
102 | //计算每个月时要清零
103 | that.setData({days:[]});
104 | const firstDayOfWeek = this.getFirstDayOfWeek(year, month);
105 | if (firstDayOfWeek > 0) {
106 | for (let i = 0; i < firstDayOfWeek; i++) {
107 | var obj = {
108 | date:null,
109 | isSign:false
110 | }
111 | that.data.days.push(obj);
112 | }
113 | this.setData({
114 | days:that.data.days
115 | });
116 | //清空
117 | } else {
118 | this.setData({
119 | days: []
120 | });
121 | }
122 | },
123 |
124 | // 绘制当月天数占的格子,并把它放到days数组中
125 | calculateDays:function(year, month) {
126 | var that = this;
127 | const thisMonthDays = this.getThisMonthDays(year, month);
128 | for (let i = 1; i <= thisMonthDays; i++) {
129 | var obj = {
130 | date: i,
131 | isSign: false
132 | }
133 | that.data.days.push(obj);
134 | }
135 | this.setData({
136 | days:that.data.days
137 | });
138 | },
139 |
140 | //匹配判断当月与当月哪些日子签到打卡
141 | onJudgeSign:function(){
142 | var that = this;
143 | var signs = that.data.signUp;
144 | var daysArr = that.data.days;
145 | for (var i=0; i < signs.length;i++){
146 | var current = new Date(signs[i].date.replace(/-/g, "/"));
147 | var year = current.getFullYear();
148 | var month = current.getMonth()+1;
149 | var day = current.getDate();
150 | day = parseInt(day);
151 | for (var j = 0; j < daysArr.length;j++){
152 | //年月日相同并且已打卡
153 | if (year == that.data.cur_year && month == that.data.cur_month && daysArr[j].date == day && signs[i].isSign == "今日已打卡"){
154 | daysArr[j].isSign = true;
155 | }
156 | }
157 | }
158 | that.setData({days:daysArr});
159 | },
160 |
161 | // 切换控制年月,上一个月,下一个月
162 | handleCalendar:function(e) {
163 | const handle = e.currentTarget.dataset.handle;
164 | const cur_year = this.data.cur_year;
165 | const cur_month = this.data.cur_month;
166 | if (handle === 'prev') {
167 | let newMonth = cur_month - 1;
168 | let newYear = cur_year;
169 | if (newMonth < 1) {
170 | newYear = cur_year - 1;
171 | newMonth = 12;
172 | }
173 | this.calculateEmptyGrids(newYear, newMonth);
174 | this.calculateDays(newYear, newMonth);
175 | this.onGetSignUp();
176 | this.setData({
177 | cur_year: newYear,
178 | cur_month: newMonth
179 | })
180 | } else {
181 | let newMonth = cur_month + 1;
182 | let newYear = cur_year;
183 | if (newMonth > 12) {
184 | newYear = cur_year + 1;
185 | newMonth = 1;
186 | }
187 | this.calculateEmptyGrids(newYear, newMonth);
188 | this.calculateDays(newYear, newMonth);
189 | this.onGetSignUp();
190 | this.setData({
191 | cur_year: newYear,
192 | cur_month: newMonth
193 | })
194 | }
195 | },
196 |
197 | //获取当前用户该任务的签到数组
198 | onGetSignUp:function(){
199 | var that = this;
200 | var Task_User = Bmob.Object.extend("task_user");
201 | var q = new Bmob.Query(Task_User);
202 | q.get(that.data.objectId, {
203 | success: function (result) {
204 | that.setData({
205 | signUp : result.get("signUp"),
206 | count : result.get("score")
207 | });
208 | //获取后就判断签到情况
209 | that.onJudgeSign();
210 | },
211 | error: function (object, error) {
212 | }
213 | });
214 | }
215 | })
--------------------------------------------------------------------------------
/pages/Calendar/Calendar.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "打卡日历"
3 | }
--------------------------------------------------------------------------------
/pages/Calendar/Calendar.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | {{cur_year || "--"}} 年 {{cur_month || "--"}} 月
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | {{item}}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | {{days[j+k].date}}
36 |
37 |
38 |
39 | {{days[j+k].date}}
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | 截至目前,你已坚持打卡
50 |
51 | {{count}}
52 | 天
53 |
54 | 请再接再厉,继续努力
55 |
56 |
--------------------------------------------------------------------------------
/pages/Calendar/Calendar.wxss:
--------------------------------------------------------------------------------
1 | /* pages/Calendar/Calendar.wxss */
2 | /* 打卡日历 */
3 | .all{
4 | margin-top: 20rpx;
5 | }
6 |
7 | .all .bar{
8 | display: flex;
9 | flex-direction: row;
10 | justify-content: space-between;
11 | margin: 30rpx 20rpx;
12 | padding: 10rpx;
13 | }
14 |
15 | .all .bar image{
16 | width: 50rpx;
17 | height: 50rpx;
18 | }
19 |
20 | .all .week{
21 | display: flex;
22 | flex-direction: row;
23 | justify-content: space-between;
24 | padding: 20rpx;
25 | padding-left: 40rpx;
26 | padding-right: 40rpx;
27 | margin: 20rpx;
28 | border-radius: 10px;
29 | background-color: #acd;
30 | }
31 |
32 | .all .days{
33 | margin: 20rpx;
34 | padding: 10rpx;
35 | border-radius: 10px;
36 | background-color: #acd;
37 |
38 | }
39 |
40 | .all .columns{
41 | display: flex;
42 | flex-direction: column;
43 | justify-content: space-between;
44 | }
45 |
46 | .all .columns .rows{
47 | display: flex;
48 | flex-direction: row;
49 | justify-content: space-between;
50 | }
51 |
52 | .all .columns .rows .cell{
53 | width: 84rpx;
54 | height: 88rpx;
55 | margin: 3rpx;
56 | text-align: center;
57 | border-radius: 50%;
58 | display: flex;
59 | flex-direction: column;
60 | justify-content: center;
61 | }
62 |
63 | .count .daynumber{
64 | display: flex;
65 | flex-direction: row;
66 | justify-content: center;
67 | }
68 |
69 | .count .daynumber .day{
70 | margin-top: 50rpx;
71 | }
72 |
73 | .count{
74 | margin: 20rpx;
75 | padding: 30rpx;
76 | display: flex;
77 | text-align: center;
78 | border-radius: 10px;
79 | flex-direction: column;
80 | justify-content: center;
81 | background-color: #acd;
82 | align-items: center;
83 | }
84 |
85 | .count .number{
86 | color: red;
87 | font-size: 60rpx;
88 | background-color: #fff;
89 | width: 100rpx;
90 | height: 100rpx;
91 | border-radius: 50%;
92 | display: flex;
93 | flex-direction: column;
94 | justify-content: center;
95 | margin: 20rpx;
96 | }
97 |
98 | .count text{
99 | margin: 10rpx;
100 | }
--------------------------------------------------------------------------------
/pages/ChangeActivity/ChangeActivity.js:
--------------------------------------------------------------------------------
1 | // pages/ChangeActivity/ChangeActivity.js
2 | // 修改活动详情
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | activity_name: '',
11 | activity_time: '',
12 | activity_place: '',
13 | activity_summary: '',
14 | activity_number: '',
15 | activity_currentNumber: '',
16 | objectId: '',
17 | items: [],
18 | people:true,
19 | look:'点击查看'
20 | },
21 |
22 | /**
23 | * 生命周期函数--监听页面加载
24 | */
25 | onLoad: function (options) {
26 | //获取当前活动的objectId
27 | this.setData({ objectId: options.objectId });
28 | },
29 |
30 | /**
31 | * 生命周期函数--监听页面初次渲染完成
32 | */
33 | onReady: function () {
34 | //初始化数据
35 | this.onInit();
36 | },
37 |
38 | /**
39 | * 生命周期函数--监听页面显示
40 | */
41 | onShow: function () {
42 |
43 | },
44 |
45 | /**
46 | * 生命周期函数--监听页面隐藏
47 | */
48 | onHide: function () {
49 |
50 | },
51 |
52 | /**
53 | * 生命周期函数--监听页面卸载
54 | */
55 | onUnload: function () {
56 |
57 | },
58 |
59 | /**
60 | * 页面相关事件处理函数--监听用户下拉动作
61 | */
62 | onPullDownRefresh: function () {
63 |
64 | },
65 |
66 | /**
67 | * 页面上拉触底事件的处理函数
68 | */
69 | onReachBottom: function () {
70 |
71 | },
72 |
73 | /**
74 | * 用户点击右上角分享
75 | */
76 | onShareAppMessage: function () {
77 |
78 | },
79 | //日期选择监听器
80 | listenerDatePickerSelected: function (e) {
81 | //调用setData()重新绘制
82 | this.setData({
83 | activity_time: e.detail.value,
84 | });
85 | },
86 |
87 | //获取输入的活动名称
88 | onGetName: function (e) {
89 | this.setData({ activity_name: e.detail.value });
90 | },
91 |
92 | //获取输入的活动地点
93 | onGetPlace: function (e) {
94 | this.setData({ activity_place: e.detail.value });
95 | },
96 |
97 | //获取输入的活动简介
98 | onGetSummary: function (e) {
99 | this.setData({ activity_summary: e.detail.value });
100 | },
101 |
102 | //获取输入的活动人数
103 | onGetNumber: function (e) {
104 | this.setData({ activity_number: e.detail.value });
105 | },
106 |
107 | //初始化数据
108 | onInit: function () {
109 | var that = this;
110 | var currentUser = Bmob.User.current();
111 | //获取当前活动相关数据
112 | var Activity = Bmob.Object.extend("activity");
113 | var query = new Bmob.Query(Activity);
114 | query.get(that.data.objectId, {
115 | success: function (result) {
116 | // 查询成功,调用get方法获取对应属性的值
117 | that.setData({ activity_name: result.get("name") });
118 | that.setData({ activity_time: result.get("time") });
119 | that.setData({ activity_place: result.get("place") });
120 | that.setData({ activity_summary: result.get("summary") });
121 | that.setData({ activity_number: result.get("number") });
122 | that.setData({ activity_currentNumber: result.get("currentNumber") });
123 | //获取当前用户已报名的人员
124 | var Activity_User = Bmob.Object.extend("activity_user");
125 | var query = new Bmob.Query(Activity_User);
126 | console.log(that.data.activity_name);
127 | query.equalTo("activityname", that.data.activity_name);
128 | // 查询所有数据
129 | query.find({
130 | success: function (results) {
131 | that.setData({ items: results });
132 | },
133 | error: function (error) {
134 | console.log("查询失败: " + error.coDe + " " + error.message);
135 | }
136 | });
137 | },
138 | error: function (object, error) {
139 | // 查询失败
140 | }
141 | });
142 | },
143 |
144 | //查看详情
145 | onLook:function(){
146 | var that = this;
147 | if(that.data.look == '点击查看'){
148 | that.setData({ people: false });
149 | that.setData({ look:'收回报名列表' });
150 | }
151 | else{
152 | that.setData({ people: true });
153 | that.setData({ look: '点击查看' });
154 | }
155 | },
156 |
157 | //修改活动
158 | onSave: function(){
159 | var that = this;
160 | var currentUser = Bmob.User.current();
161 | var Activity = Bmob.Object.extend("activity");
162 | var query = new Bmob.Query(Activity);
163 | query.get(that.data.objectId, {
164 | success: function (result) {
165 | result.fetchWhenSave(true);
166 | result.set("name", that.data.activity_name);
167 | result.set("time", that.data.activity_time);
168 | result.set("place", that.data.activity_place);
169 | result.set("summary", that.data.activity_summary);
170 | result.set("number", that.data.activity_number);
171 | result.set("createdby", currentUser.get('realname'));
172 | result.set("currentNumber", that.data.activity_currentNumber);
173 | result.save();
174 | wx.showToast({
175 | title: '修改成功',
176 | duration: 2000
177 | })
178 |
179 | // The object was retrieved successfully.
180 | },
181 | error: function (object, error) {
182 | wx.showModal({
183 | title: '提示',
184 | content: '活动修改失败'
185 | })
186 | }
187 | });
188 | },
189 |
190 | //删除活动
191 | onDelete: function(){
192 | var that = this;
193 | wx.showModal({
194 | title: '提示',
195 | content: '是否删除该活动',
196 | success: function (res) {
197 | //点击确定删除
198 | if (res.confirm) {
199 | //删除该活动的报名信息
200 | var Activity_User = Bmob.Object.extend("activity_user");
201 | var query = new Bmob.Query(Activity_User);
202 | query.equalTo("activityid", that.data.objectId);
203 | query.destroyAll({
204 | success: function () {
205 | //删除成功
206 | },
207 | error: function (err) {
208 | // 删除失败
209 | }
210 | });
211 | //删除该活动
212 | var Activity = Bmob.Object.extend("activity");
213 | var query = new Bmob.Query(Activity);
214 | query.get(that.data.objectId, {
215 | success: function (object) {
216 | object.destroy({
217 | success: function (deleteObject) {
218 | wx.showToast({
219 | title: '删除成功',
220 | duration: 2000
221 | })
222 | },
223 | error: function (object, error) {
224 | wx.showModal({
225 | title: '提示',
226 | content: '活动删除失败'
227 | })
228 | }
229 | });
230 | },
231 | error: function (object, error) {
232 | console.log("query object fail");
233 | }
234 | });
235 | }
236 | }
237 | })
238 | }
239 | })
--------------------------------------------------------------------------------
/pages/ChangeActivity/ChangeActivity.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "修改活动"
3 | }
--------------------------------------------------------------------------------
/pages/ChangeActivity/ChangeActivity.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | {{activity_time}}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{activity_currentNumber}}
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | {{item.realname}}
39 | ({{item.department}})
40 | {{item.campus}}
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/pages/ChangeActivity/ChangeActivity.wxss:
--------------------------------------------------------------------------------
1 | /* pages/ChangeActivity/ChangeActivity.wxss */
2 | /* 修改活动详情页面 */
3 | .container{
4 | padding-top: 20rpx;
5 | }
6 |
7 | .title{
8 | color: red;
9 | margin: 30rpx;
10 | font-size: 50rpx;
11 | }
12 |
13 | .input{
14 | margin: 10rpx auto;
15 | display: flex;
16 | align-items: center;
17 | padding: 0 40rpx;
18 | background-color: #fff;
19 | font-size: 34rpx;
20 | color: #000;
21 | }
22 |
23 | .input input{
24 | height: 40rpx;
25 | width: 450rpx;
26 | padding: 10rpx;
27 | background-color: #acd;
28 | border-radius: 5px;
29 | }
30 |
31 | .input picker{
32 | height: 40rpx;
33 | width: 450rpx;
34 | padding: 10rpx;
35 | background-color: #acd;
36 | border-radius: 5px;
37 | }
38 |
39 | .input .summary{
40 | width: 450rpx;
41 | padding: 10rpx;
42 | background-color: #acd;
43 | border-radius: 5px;
44 | }
45 |
46 | .text{
47 | margin: 10rpx auto;
48 | display: flex;
49 | align-items: center;
50 | padding: 0 40rpx;
51 | background-color: #fff;
52 | font-size: 34rpx;
53 | color: #000;
54 | }
55 |
56 | .text text{
57 | width: 450rpx;
58 | padding: 10rpx;
59 | background-color: #acd;
60 | border-radius: 5px;
61 | }
62 |
63 | .person{
64 | width: 630rpx;
65 | margin: 20rpx auto;
66 | background-color: #fff;
67 | font-size: 34rpx;
68 | color: #000;
69 | }
70 |
71 | .person .activity{
72 | margin: 10rpx auto;
73 | padding: 10rpx;
74 | background-color: #acd;
75 | border-radius: 5px;
76 |
77 | }
78 |
79 | .person .look{
80 | color: #acd;
81 | }
82 |
83 | .person .activity .name{
84 | margin-left: 20rpx;
85 | }
86 |
87 | .person .activity .campus{
88 | font-size: 25rpx;
89 | position: relative;
90 | float: right;
91 | margin-top: 10rpx;
92 | margin-right: 20rpx;
93 | }
94 |
95 | .buttons{
96 | margin: 10rpx auto;
97 | }
98 |
99 | .buttons button{
100 | width: 500rpx;
101 | text-align: center;
102 | margin: 50rpx;
103 | font-size: 34rpx;
104 | }
105 |
106 |
--------------------------------------------------------------------------------
/pages/ChangeTask/ChangeTask.js:
--------------------------------------------------------------------------------
1 | // pages/ChangeTask/ChangeTask.js
2 | // 修改任务页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | objectId: '',//当前活动的id
12 | color: '',
13 | totalScore: 0,
14 | name: '',
15 | begin_time: '',
16 | end_time: '',
17 | days: 0,
18 | signNumber: [],
19 | currentNumber: 0,
20 | totalnumber: 0,
21 | complete: false,
22 | index: 0,
23 | },
24 |
25 | /**
26 | * 生命周期函数--监听页面加载
27 | */
28 | onLoad: function (options) {
29 | //获取当前任务的objectId和报名情况
30 | this.setData({ objectId: options.objectId });
31 | },
32 |
33 | /**
34 | * 生命周期函数--监听页面初次渲染完成
35 | */
36 | onReady: function () {
37 |
38 | },
39 |
40 | /**
41 | * 生命周期函数--监听页面显示
42 | */
43 | onShow: function () {
44 | this.getTaskDetails();
45 |
46 | },
47 |
48 | /**
49 | * 生命周期函数--监听页面隐藏
50 | */
51 | onHide: function () {
52 |
53 | },
54 |
55 | /**
56 | * 生命周期函数--监听页面卸载
57 | */
58 | onUnload: function () {
59 |
60 | },
61 |
62 | /**
63 | * 页面相关事件处理函数--监听用户下拉动作
64 | */
65 | onPullDownRefresh: function () {
66 |
67 | },
68 |
69 | /**
70 | * 页面上拉触底事件的处理函数
71 | */
72 | onReachBottom: function () {
73 |
74 | },
75 |
76 | /**
77 | * 用户点击右上角分享
78 | */
79 | onShareAppMessage: function () {
80 |
81 | },
82 |
83 | //获取当前任务的详细信息
84 | getTaskDetails: function () {
85 | var that = this;
86 | var currentUser = Bmob.User.current();
87 | var Task = Bmob.Object.extend("task");
88 | var q = new Bmob.Query(Task);
89 | q.get(that.data.objectId, {
90 | success: function (result) {
91 | var index = that.calDate(result.get("begintime"));
92 | var currenttime = util.formatTime2(new Date());
93 | //当前时间大于任务时间,则任务结束
94 | if (currenttime > result.get("endtime")) {
95 | that.setData({ complete: true });
96 | result.set("complete", true);
97 | result.save();
98 | }
99 | that.setData({
100 | totalScore: result.get("totalScore"),
101 | name: result.get("name"),
102 | begin_time: result.get("begintime"),
103 | end_time: result.get("endtime"),
104 | days: result.get("days"),
105 | signNumber: result.get("signNumber"),
106 | currentNumber: result.get("currentNumber"),
107 | totalnumber: result.get("number"),
108 | color: result.get("color"),
109 | index:index
110 | });
111 |
112 | },
113 | error: function (object, error) {
114 | // 查询失败
115 | }
116 | });
117 | },
118 |
119 | //删除任务
120 | onDelete: function () {
121 | var that = this;
122 | wx.showModal({
123 | title: '提示',
124 | content: '是否删除该任务',
125 | success: function (res) {
126 | //点击确定删除
127 | if (res.confirm) {
128 | //删除该活动的报名信息
129 | var Task_User = Bmob.Object.extend("task_user");
130 | var query = new Bmob.Query(Task_User);
131 | query.equalTo("activityid", that.data.objectId);
132 | query.destroyAll({
133 | success: function () {
134 | //删除成功
135 | },
136 | error: function (err) {
137 | // 删除失败
138 | }
139 | });
140 | //删除该活动
141 | var Task = Bmob.Object.extend("task");
142 | var query = new Bmob.Query(Task);
143 | query.get(that.data.objectId, {
144 | success: function (object) {
145 | object.destroy({
146 | success: function (deleteObject) {
147 | wx.showToast({
148 | title: '删除成功',
149 | duration: 2000
150 | })
151 | },
152 | error: function (object, error) {
153 | wx.showModal({
154 | title: '提示',
155 | content: '任务删除失败'
156 | })
157 | }
158 | });
159 | },
160 | error: function (object, error) {
161 | console.log("query object fail");
162 | }
163 | });
164 | }
165 | }
166 | })
167 | },
168 |
169 | //计算当前日期与设定起始日期之间的间隔
170 | calDate: function (begintime) {
171 | var that = this;
172 | //获取系统当前时间年月日
173 | var date = new Date();
174 | var currenttime = util.formatTime2(date);
175 | var begin = new Date(begintime.replace(/-/g, "/"));
176 | var end = new Date(currenttime.replace(/-/g, "/"));
177 | var days = end.getTime() - begin.getTime();
178 | var day = parseInt(days / (1000 * 60 * 60 * 24));
179 | return day;
180 | },
181 | })
--------------------------------------------------------------------------------
/pages/ChangeTask/ChangeTask.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "修改任务"
3 | }
--------------------------------------------------------------------------------
/pages/ChangeTask/ChangeTask.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{totalScore}}
8 |
9 |
10 |
11 | {{name}}
12 |
13 |
14 | {{begin_time}} to
15 | {{end_time}}
16 |
17 |
18 |
19 |
20 | 任务天数:{{days}}
21 |
22 |
23 |
24 | 今日签到人数:{{signNumber[index].count}}
25 |
26 |
27 |
28 | 当前报名人数:{{currentNumber}}
29 |
30 |
31 |
32 | 任务总人数:{{totalnumber}}
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | {{totalScore}}
41 |
42 |
43 |
44 | {{name}}
45 |
46 |
47 | {{begin_time}} to
48 | {{end_time}}
49 |
50 |
51 |
52 |
53 | 任务天数:{{days}}
54 |
55 |
56 |
57 | 当前报名人数:{{currentNumber}}
58 |
59 |
60 |
61 | 任务总人数:{{totalnumber}}
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/pages/ChangeTask/ChangeTask.wxss:
--------------------------------------------------------------------------------
1 | /* pages/ChangeTask/ChangeTask.wxss */
2 | /* 修改任务页面 */
3 | .container{
4 | margin-top: -10rpx;
5 | }
6 |
7 | .details{
8 | width: 80%;
9 | margin: 30rpx;
10 | padding: 30rpx;
11 | border-radius: 20px;
12 | align-items: center;
13 | display: flex;
14 | flex-direction: column;
15 | justify-content: center;
16 | }
17 |
18 | .details .background{
19 | background-repeat: no-repeat;
20 | background-size: 350rpx;
21 | background-position-y: center;
22 | background-position-x: center;
23 | }
24 |
25 | .details .score{
26 | display: flex;
27 | flex-direction: column;
28 | justify-content: center;
29 | align-items: center;
30 | text-align: center;
31 | margin-top: -200rpx;
32 | }
33 |
34 | .details .score text{
35 | font-size: 70rpx;
36 | border-radius: 50%;
37 | width: 200rpx;
38 | height: 200rpx;
39 | font-family: "华文行楷";
40 | border: solid 10rpx #fff;
41 | display: flex;
42 | flex-direction: column;
43 | justify-content: center;
44 | text-align: center;
45 | margin-top: 50rpx;
46 | }
47 |
48 | .details .score label{
49 | margin-top: -75rpx;
50 | }
51 |
52 | .name text{
53 | font-size: 50rpx;
54 | color: #fff;
55 | text-align: center;
56 | display: flex;
57 | flex-direction: column;
58 | justify-content: center;
59 | margin-top: 40rpx;
60 | }
61 |
62 |
63 | .details .time{
64 | font-size: 34rpx;
65 | margin: 20rpx auto;
66 | }
67 |
68 | .details .text{
69 | font-size: 34rpx;
70 | }
71 |
72 | .details .text image{
73 | width: 50rpx;
74 | height: 50rpx;
75 | margin-bottom: -10rpx;
76 | margin-left: 10rpx;
77 | margin-right: 10rpx;
78 | }
79 |
80 | .panel .buttons{
81 | display: flex;
82 | }
83 |
84 | .panel button{
85 | margin: 30rpx auto;
86 | width: 550rpx;
87 | font-size: 34rpx;
88 | text-align: center;
89 | }
--------------------------------------------------------------------------------
/pages/Chat/Chat.js:
--------------------------------------------------------------------------------
1 | // pages/Chat/Chat.js
2 | var app = getApp();
3 | var chatListData = [];
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | askWord: '',
11 | chatList: []
12 | },
13 |
14 | /**
15 | * 生命周期函数--监听页面加载
16 | */
17 | onLoad: function (options) {
18 |
19 | },
20 |
21 | /**
22 | * 生命周期函数--监听页面初次渲染完成
23 | */
24 | onReady: function () {
25 | //问候语
26 | var that = this;
27 | this.addChat('你好啊!我是可爱的糖糖,有什么可以为你服务的么?', 'l');
28 | setTimeout(function () {
29 |
30 | }, 1000);
31 |
32 | },
33 |
34 | /**
35 | * 生命周期函数--监听页面显示
36 | */
37 | onShow: function () {
38 |
39 | },
40 |
41 | /**
42 | * 生命周期函数--监听页面隐藏
43 | */
44 | onHide: function () {
45 |
46 | },
47 |
48 | /**
49 | * 生命周期函数--监听页面卸载
50 | */
51 | onUnload: function () {
52 |
53 | },
54 |
55 | /**
56 | * 页面相关事件处理函数--监听用户下拉动作
57 | */
58 | onPullDownRefresh: function () {
59 |
60 | },
61 |
62 | /**
63 | * 页面上拉触底事件的处理函数
64 | */
65 | onReachBottom: function () {
66 |
67 | },
68 |
69 | /**
70 | * 用户点击右上角分享
71 | */
72 | onShareAppMessage: function () {
73 |
74 | },
75 |
76 | sendChat: function (e) {
77 | var that = this;
78 | var word = e.detail.value.ask_word ? e.detail.value.ask_word : e.detail.value;//支持两种提交方式
79 | that.addChat(word, 'r');
80 | //请求api获取回答
81 | app.req('post', 'openapi/api', {
82 | 'data': { 'info': word, 'loc': '广州', 'userid': '123' },
83 | 'success': function (resp) {
84 | that.addChat(resp.text, 'l');
85 | if (resp.url) {
86 | that.addChat(resp.url, 'l');
87 | }
88 | },
89 | });
90 |
91 | //清空输入框
92 | that.setData({
93 | askWord: ''
94 | });
95 | },
96 |
97 | //新增聊天列表
98 | addChat: function (word, orientation) {
99 | var that = this;
100 | var ch = { 'text': word, 'time': new Date().getTime(), 'orientation': orientation }
101 | chatListData.push(ch);
102 | that.setData({
103 | chatList: chatListData
104 | });
105 | }
106 | })
--------------------------------------------------------------------------------
/pages/Chat/Chat.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "糖糖"
3 | }
4 |
--------------------------------------------------------------------------------
/pages/Chat/Chat.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | {{item.text}}
9 |
10 |
11 | {{item.text}}{{item.url}}
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
25 |
--------------------------------------------------------------------------------
/pages/Chat/Chat.wxss:
--------------------------------------------------------------------------------
1 | /* pages/Chat/Chat.wxss */
2 | .container{
3 | padding-top: 20rpx;
4 | }
5 |
6 | .chat_left{
7 | margin: 20rpx;
8 | display: flex;
9 | float: left;
10 | position: relative;
11 | left: 10rpx;
12 | }
13 |
14 | .chat_left image{
15 | width: 100rpx;
16 | height: 100rpx;
17 | margin-right: 20rpx;
18 | }
19 |
20 | .chat_left text{
21 | margin-top: 20rpx;
22 | padding: 20rpx;
23 | text-align: left;
24 | font-size: 34rpx;
25 | background-color: #acd;
26 | border-radius: 5px;
27 | }
28 |
29 | .chat_right{
30 | margin: 20rpx;
31 | display: flex;
32 | float: right;
33 | position: relative;
34 | right: 40rpx;
35 | }
36 |
37 | .chat_right .my_head{
38 | width: 100rpx;
39 | height: 100rpx;
40 | margin-left: 20rpx;
41 | }
42 |
43 | .chat_right text{
44 | margin-top: 30rpx;
45 | padding: 20rpx;
46 | text-align: right;
47 | font-size: 34rpx;
48 | background-color: #acd;
49 | border-radius: 5px;
50 | }
51 |
52 | form{
53 | position: fixed;
54 | bottom: 0;
55 | width: 100%;
56 | padding: 5rpx;
57 | }
58 |
59 | .ask_input_word{
60 | background-color: #fff;
61 | display: flex;
62 | padding: 5rpx;
63 | }
64 |
65 | .ask_input_word input{
66 | width: 70%;
67 | padding: 10rpx;
68 | background-color: #acd;
69 | border-radius: 5px;
70 | margin-left: 20rpx;
71 | }
--------------------------------------------------------------------------------
/pages/Cover/Cover.js:
--------------------------------------------------------------------------------
1 | // pages/index/Cover.js
2 | // 封面
3 | Page({
4 |
5 | /**
6 | * 页面的初始数据
7 | */
8 | data: {
9 |
10 | },
11 |
12 | /**
13 | * 生命周期函数--监听页面加载
14 | */
15 | onLoad: function (options) {
16 |
17 |
18 | },
19 |
20 | /**
21 | * 生命周期函数--监听页面初次渲染完成
22 | */
23 | onReady: function () {
24 |
25 | },
26 |
27 | /**
28 | * 生命周期函数--监听页面显示
29 | */
30 | onShow: function () {
31 | //显示两秒后转入登录界面
32 | setTimeout(function () {
33 | wx.redirectTo({
34 | url: '../Login/Login'
35 | })
36 | }, 2000);
37 |
38 | },
39 |
40 | /**
41 | * 生命周期函数--监听页面隐藏
42 | */
43 | onHide: function () {
44 |
45 | },
46 |
47 | /**
48 | * 生命周期函数--监听页面卸载
49 | */
50 | onUnload: function () {
51 |
52 | },
53 |
54 | /**
55 | * 页面相关事件处理函数--监听用户下拉动作
56 | */
57 | onPullDownRefresh: function () {
58 |
59 | },
60 |
61 | /**
62 | * 页面上拉触底事件的处理函数
63 | */
64 | onReachBottom: function () {
65 |
66 | },
67 |
68 | /**
69 | * 用户点击右上角分享
70 | */
71 | onShareAppMessage: function () {
72 |
73 | }
74 | })
--------------------------------------------------------------------------------
/pages/Cover/Cover.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "山东大学唐仲英爱心社"
3 | }
--------------------------------------------------------------------------------
/pages/Cover/Cover.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/pages/Cover/Cover.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Cover.wxss */
2 | /* 封面 */
3 | page{
4 | width: 100%;
5 | height: 100%;
6 | }
7 | .test-bg{
8 | width: 100%;
9 | height: 100%;
10 | background-color: #70c7da;
11 | }
12 | .bg-image{
13 | display: block;
14 | width: 100%;
15 | height: 100%;
16 | background-color: rgba(0,0,0,.2);
17 | }
--------------------------------------------------------------------------------
/pages/CreateTask/CreateTask.js:
--------------------------------------------------------------------------------
1 | // pages/CreateTask/CreateTask.js
2 | // 创建任务页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | task_name:'',
12 | begin_time:'',
13 | end_time:'',
14 | task_number:'',
15 | days:0,
16 | index:0,
17 | color:'#fbad07',
18 | signUp:[],//用户签到数组
19 | signNumber:[],//任务签到人数数组
20 | //任务标签颜色数组
21 | items:[
22 | { color: '#FF8C00', checked: false },
23 | { color: '#1E90FF', checked: false },
24 | { color: '#FFFF00', checked: false },
25 | { color: '#83C75D', checked: false }
26 | ]
27 |
28 | },
29 |
30 | /**
31 | * 生命周期函数--监听页面加载
32 | */
33 | onLoad: function (options) {
34 | //获取系统当前时间年月日
35 | var date = new Date();
36 | var begintime = util.formatTime2(date);
37 | //获取一年后的时间
38 | var endtime = util.formatTime3(date);
39 | this.setData({
40 | begin_time: begintime,
41 | end_time: endtime,
42 | });
43 | },
44 |
45 | /**
46 | * 生命周期函数--监听页面初次渲染完成
47 | */
48 | onReady: function () {
49 |
50 | },
51 |
52 | /**
53 | * 生命周期函数--监听页面显示
54 | */
55 | onShow: function () {
56 |
57 | },
58 |
59 | /**
60 | * 生命周期函数--监听页面隐藏
61 | */
62 | onHide: function () {
63 |
64 | },
65 |
66 | /**
67 | * 生命周期函数--监听页面卸载
68 | */
69 | onUnload: function () {
70 |
71 | },
72 |
73 | /**
74 | * 页面相关事件处理函数--监听用户下拉动作
75 | */
76 | onPullDownRefresh: function () {
77 |
78 | },
79 |
80 | /**
81 | * 页面上拉触底事件的处理函数
82 | */
83 | onReachBottom: function () {
84 |
85 | },
86 |
87 | /**
88 | * 用户点击右上角分享
89 | */
90 | onShareAppMessage: function () {
91 |
92 | },
93 | //起始日期选择监听器
94 | beginDatePickerSelected: function (e) {
95 | //调用setData()重新绘制
96 | this.setData({
97 | begin_time: e.detail.value,
98 | });
99 | },
100 |
101 | //结束日期选择监听器
102 | endDatePickerSelected: function (e) {
103 | //调用setData()重新绘制
104 | this.setData({
105 | end_time: e.detail.value,
106 | });
107 | },
108 |
109 | //获取输入的任务内容
110 | onGetName: function (e) {
111 | this.setData({ task_name: e.detail.value });
112 | },
113 |
114 | //获取输入的任务人数
115 | onGetNumber: function (e) {
116 | this.setData({ task_number: e.detail.value });
117 | },
118 |
119 | //判断选择的标签颜色
120 | onRadioChange: function (e) {
121 | this.setData({ color: e.detail.value });
122 | },
123 |
124 | //创建任务按钮
125 | onCreate: function(e){
126 | var that = this;
127 | var currentUser = Bmob.User.current();
128 | if (that.data.task_name != "" && that.data.task_number != "" && that.data.begin_time < that.data.end_time){
129 | //计算signNumber和signUp数组
130 | that.calDate();
131 | var Task = Bmob.Object.extend("task");
132 | var task = new Task();
133 | task.set("name", that.data.task_name);
134 | task.set("begintime", that.data.begin_time);
135 | task.set("endtime", that.data.end_time);
136 | task.set("color", that.data.color);
137 | task.set("days", that.data.days);
138 | task.set("number", Number(that.data.task_number));
139 | task.set("createdby", currentUser.get('realname'));
140 | task.set("currentNumber", 1);
141 | task.set("signNumber", that.data.signNumber);
142 | task.set("totalScore", 0);
143 | task.set("complete", false);
144 | //添加数据,第一个入口参数是null
145 | task.save(null, {
146 | success: function (result) {
147 | var Task_User = Bmob.Object.extend("task_user");
148 | var tu = new Task_User();
149 | tu.set("taskname", that.data.task_name);
150 | tu.set("begintime", that.data.begin_time);
151 | tu.set("endtime", that.data.end_time);
152 | tu.set("realname", currentUser.get("realname"));
153 | tu.set("campus", currentUser.get("campus"));
154 | tu.set("department", currentUser.get("department"));
155 | tu.set("signUp", that.data.signUp);
156 | tu.set("complete", false);
157 | tu.set("enroll", true);
158 | tu.set("score", 0);
159 | tu.set("activityid", result.id);
160 | //添加数据,第一个入口参数是null
161 | tu.save(null, {
162 | success: function (result) {
163 | wx.showToast({
164 | title: '创建成功',
165 | duration: 2000
166 | })
167 | },
168 | error: function (result, error) {
169 | console.log(error);
170 | wx.showModal({
171 | title: '提示',
172 | content: '任务创建失败'
173 | })
174 | }
175 | });
176 | },
177 | error: function (result, error) {
178 | wx.showModal({
179 | title: '提示',
180 | content: '任务创建失败'
181 | })
182 | }
183 | });
184 | }else{
185 | wx.showModal({
186 | title: '提示',
187 | content: '请把内容填写正确完整'
188 | })
189 | }
190 | },
191 |
192 | //计算两个日期之间的间隔时长
193 | calDate: function (e) {
194 | var that = this;
195 | var begin = new Date(that.data.begin_time.replace(/-/g, "/"));
196 | var end = new Date(that.data.end_time.replace(/-/g, "/"));
197 | var current = new Date(util.formatTime2(new Date).replace(/-/g, "/"));
198 | var days = end.getTime() - begin.getTime();
199 | var day = parseInt(days / (1000 * 60 * 60 * 24));
200 | var index = current.getTime() - begin.getTime();
201 | index = parseInt(index/ (1000 * 60 * 60 * 24));
202 | if (day > 0) {
203 | that.setData({
204 | days: day+1,
205 | index:index
206 | })
207 | }else{
208 | wx.showModal({
209 | title: '提示',
210 | content: '日期设定错误'
211 | })
212 | }
213 | var limit = that.data.days - that.data.index;
214 | //设置签到和当前签到人数数组
215 | for (var i = -1 * that.data.index; i < limit; i++) {
216 | var obj = {
217 | date: util.addDay(i),
218 | isSign:"今日未打卡"
219 | };
220 | that.data.signUp.push(obj);
221 | var obj2 = {
222 | date: util.addDay(i),
223 | count: 0
224 | }
225 | that.data.signNumber.push(obj2);
226 | }
227 | },
228 | })
--------------------------------------------------------------------------------
/pages/CreateTask/CreateTask.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "创建任务"
3 | }
--------------------------------------------------------------------------------
/pages/CreateTask/CreateTask.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | {{begin_time}}
13 |
14 | to
15 |
16 |
17 | {{end_time}}
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/pages/CreateTask/CreateTask.wxss:
--------------------------------------------------------------------------------
1 | /* pages/CreateTask/CreateTask.wxss */
2 | /* 创建任务页面 */
3 | .container{
4 | padding-top: 20rpx;
5 | }
6 |
7 | .input{
8 | margin: 10rpx auto;
9 | display: flex;
10 | align-items: center;
11 | padding: 0 40rpx;
12 | background-color: #fff;
13 | font-size: 34rpx;
14 | color: #000;
15 | }
16 |
17 | .input input{
18 | height: 40rpx;
19 | width: 450rpx;
20 | padding: 10rpx;
21 | background-color: #acd;
22 | border-radius: 5px;
23 | }
24 |
25 | .input picker{
26 | height: 50rpx;
27 | width: 200rpx;
28 | margin: 5rpx;
29 | padding: 10rpx 5rpx;
30 | text-align: center;
31 | background-color: #acd;
32 | border-radius: 5px;
33 | }
34 |
35 | .color{
36 | margin: 10rpx 0rpx;
37 | padding-top: 20rpx;
38 | align-items: center;
39 | background-color: #fff;
40 | font-size: 34rpx;
41 | color: #000;
42 | }
43 |
44 | .color label{
45 | margin-left: -15rpx;
46 | }
47 |
48 | .color .radio-group{
49 | margin: 30rpx auto;
50 | }
51 |
52 | .color .radio-group radio{
53 | margin: 10rpx;
54 | padding: 35rpx;
55 | padding-left: 40rpx;
56 | border-radius: 10px;
57 | }
58 |
59 | .buttons{
60 | margin: 10rpx auto;
61 | display: flex;
62 | }
63 |
64 | .buttons button{
65 | width: 500rpx;
66 | text-align: center;
67 | margin: 50rpx;
68 | font-size: 34rpx;
69 | }
--------------------------------------------------------------------------------
/pages/Detail/Detail.js:
--------------------------------------------------------------------------------
1 | // pages/index/Detail.js
2 | // 个人详情页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | name:'Name',
11 | id:'Id',
12 | campus:'Campus',
13 | colleg:'College',
14 | phone:'Phone'
15 | },
16 |
17 | /**
18 | * 生命周期函数--监听页面加载
19 | */
20 | onLoad: function (options) {
21 | //获取当前用户的数据
22 | var currentUser = Bmob.User.current();
23 | this.setData({ name: currentUser.get("realname") });
24 | this.setData({ id: currentUser.get("username") });
25 | this.setData({ campus: currentUser.get("campus") });
26 | this.setData({ college: currentUser.get("college") });
27 | if (currentUser.get("department") == '') {
28 | this.setData({ department: '非唐社成员' });
29 | }else{
30 | this.setData({ department: currentUser.get("department") });
31 | }
32 | this.setData({ phone: currentUser.get("phone") });
33 | },
34 |
35 | /**
36 | * 生命周期函数--监听页面初次渲染完成
37 | */
38 | onReady: function () {
39 |
40 | },
41 |
42 | /**
43 | * 生命周期函数--监听页面显示
44 | */
45 | onShow: function () {
46 |
47 | },
48 |
49 | /**
50 | * 生命周期函数--监听页面隐藏
51 | */
52 | onHide: function () {
53 |
54 | },
55 |
56 | /**
57 | * 生命周期函数--监听页面卸载
58 | */
59 | onUnload: function () {
60 |
61 | },
62 |
63 | /**
64 | * 页面相关事件处理函数--监听用户下拉动作
65 | */
66 | onPullDownRefresh: function () {
67 |
68 | },
69 |
70 | /**
71 | * 页面上拉触底事件的处理函数
72 | */
73 | onReachBottom: function () {
74 |
75 | },
76 |
77 | /**
78 | * 用户点击右上角分享
79 | */
80 | onShareAppMessage: function () {
81 |
82 | },
83 |
84 | //注销当前账号
85 | onLogOut: function(){
86 | Bmob.User.logOut();
87 | wx.redirectTo({
88 | url: '../Login/Login',
89 | })
90 | },
91 |
92 | //管理活动按钮
93 | onManageActivities: function () {
94 | var currentUser = Bmob.User.current();
95 | if (currentUser.get('createActivity') == true) {
96 | wx.navigateTo({
97 | url: '../ManageActivity/ManageActivity'
98 | })
99 | } else {
100 | wx.showModal({
101 | title: '提示',
102 | content: '您没有管理活动的权限'
103 | })
104 | }
105 | },
106 |
107 | //管理任务按钮
108 | onManageTask: function () {
109 | wx.navigateTo({
110 | url: '../ManageTask/ManageTask'
111 | })
112 | },
113 |
114 | //意见反馈
115 | onSuggest: function(){
116 | wx.navigateTo({
117 | url: '../Suggest/Suggest'
118 | })
119 | },
120 |
121 | //活动授权
122 | onGrant: function () {
123 | wx.navigateTo({
124 | url: '../Grant/Grant'
125 | })
126 | }
127 |
128 | })
--------------------------------------------------------------------------------
/pages/Detail/Detail.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "个人中心"
3 | }
--------------------------------------------------------------------------------
/pages/Detail/Detail.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
14 |
15 | {{campus}}
16 |
17 |
18 | {{college}}
19 |
20 |
21 | {{department}}
22 |
23 |
24 | {{phone}}
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/pages/Detail/Detail.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Detail.wxss */
2 | /* 个人详情页面 */
3 | .container{
4 | padding-top: 20rpx;
5 | }
6 |
7 | .head{
8 | width: 150rpx;
9 | height: 150rpx;
10 | }
11 |
12 | .header{
13 | width: 480rpx;
14 | margin-top: 50rpx;
15 | padding: 30rpx;
16 | display: flex;
17 | background-color: #acd;
18 | margin-bottom: 30rpx;
19 | border-radius: 10px;
20 | }
21 |
22 | .header .item{
23 | align-items: left;
24 | width: 300rpx;
25 | margin-left: 50rpx;
26 | padding-top: 30rpx;
27 | }
28 |
29 | .header .name{
30 | font-size: 40rpx;
31 | }
32 |
33 | .header .id{
34 | display: flex;
35 | margin-top: 10rpx;
36 | font-size: 30rpx;
37 | }
38 |
39 | .content{
40 | padding: 20rpx;
41 | background-color: #acd;
42 | border-radius: 10px;
43 | }
44 |
45 | .content .item{
46 | padding: 10rpx;
47 | display: flex;
48 | align-items: center;
49 | font-size: 34rpx;
50 | }
51 |
52 | .content .item text{
53 | width: 450rpx;
54 | padding: 20rpx;
55 | text-align: left;
56 | font-size: 34rpx;
57 | background-color: #eee;
58 | border-radius: 5px;
59 | }
60 |
61 | .bottom{
62 | margin: 20rpx auto;
63 | }
64 |
65 | .bottom button{
66 | width: 540rpx;
67 | text-align: center;
68 | margin: 20rpx;
69 | font-size: 34rpx;
70 | }
--------------------------------------------------------------------------------
/pages/Login/Login.js:
--------------------------------------------------------------------------------
1 | // pages/index/Login.js
2 | // 登录页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | account:'',
11 | accountPhold:'学号',
12 | password: '',
13 | passwordPhold: '密码'
14 | },
15 |
16 | /**
17 | * 生命周期函数--监听页面加载
18 | */
19 | onLoad: function (options) {
20 |
21 | },
22 |
23 | /**
24 | * 生命周期函数--监听页面初次渲染完成
25 | */
26 | onReady: function () {
27 |
28 | },
29 |
30 | /**
31 | * 生命周期函数--监听页面显示
32 | */
33 | onShow: function () {
34 | //一次登录后保持当前用户
35 | var currentUser = Bmob.User.current();
36 | if (currentUser) {
37 | wx.switchTab({
38 | url: '../Main/Main'
39 | })
40 | } else {
41 |
42 | }
43 | },
44 |
45 | /**
46 | * 生命周期函数--监听页面隐藏
47 | */
48 | onHide: function () {
49 |
50 | },
51 |
52 | /**
53 | * 生命周期函数--监听页面卸载
54 | */
55 | onUnload: function () {
56 |
57 | },
58 |
59 | /**
60 | * 页面相关事件处理函数--监听用户下拉动作
61 | */
62 | onPullDownRefresh: function () {
63 |
64 | },
65 |
66 | /**
67 | * 页面上拉触底事件的处理函数
68 | */
69 | onReachBottom: function () {
70 |
71 | },
72 |
73 | /**
74 | * 用户点击右上角分享
75 | */
76 | onShareAppMessage: function () {
77 |
78 | },
79 |
80 | //获取输入的账号
81 | onGetAccount: function(e){
82 | this.setData({account: e.detail.value });
83 | },
84 |
85 | //获取输入的密码
86 | onGetPassword: function (e){
87 | this.setData({password: e.detail.value });
88 | },
89 |
90 | //登录按钮
91 | onLogin: function(){
92 | //输入框不为空
93 | var that = this;
94 | if(that.data.account == '' || that.data.password == ''){
95 | wx.showModal({
96 | title: '提示',
97 | content: '请把信息填写完整'
98 | })
99 | }else{
100 | Bmob.User.logIn(that.data.account, that.data.password, {
101 | success: function (user) {
102 | wx.showToast({
103 | title: '登录成功',
104 | duration: 2000
105 | })
106 | setTimeout(function () {
107 | wx.switchTab({
108 | url: '../Main/Main'
109 | })
110 | }, 2000);
111 | },
112 | error: function (user, error) {
113 | wx.showModal({
114 | title: '提示',
115 | content: '账号或密码错误'
116 | })
117 | }
118 | });
119 |
120 | }
121 | },
122 |
123 | //注册按钮
124 | onRegister: function(e){
125 | wx.navigateTo({
126 | url: '../Register/Register'
127 | })
128 | }
129 | })
--------------------------------------------------------------------------------
/pages/Login/Login.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "山东大学唐仲英爱心社"
3 | }
--------------------------------------------------------------------------------
/pages/Login/Login.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/pages/Login/Login.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Login.wxss */
2 | /* 登录页面 */
3 | .input{
4 | margin: 30rpx auto;
5 | display: flex;
6 | align-items: center;
7 | height: 88rpx;
8 | padding: 0 32rpx;
9 | background-color: #fff;
10 | font-size: 34rpx;
11 | color: #000;
12 | }
13 |
14 | .input input{
15 | margin-left: 20rpx;
16 | padding: 10rpx;
17 | background-color: #acd;
18 | border-radius: 5px;
19 | }
20 |
21 | .buttons{
22 | margin: 30rpx auto;
23 | display: flex;
24 | }
25 |
26 | .buttons button{
27 | width: 200rpx;
28 | text-align: center;
29 | margin: 50rpx;
30 | font-size: 34rpx;
31 | }
--------------------------------------------------------------------------------
/pages/Main/Main.js:
--------------------------------------------------------------------------------
1 | // pages/index/Main.js
2 | //首页
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | items: [],
11 | count: 0,
12 | isHideLoadMore: true
13 | },
14 |
15 | /**
16 | * 生命周期函数--监听页面加载
17 | */
18 | onLoad: function (options) {
19 | },
20 |
21 | /**
22 | * 生命周期函数--监听页面初次渲染完成
23 | */
24 | onReady: function () {
25 | this.onGetActivities();
26 | },
27 |
28 | /**
29 | * 生命周期函数--监听页面显示
30 | */
31 | onShow: function () {
32 |
33 | },
34 |
35 | /**
36 | * 生命周期函数--监听页面隐藏
37 | */
38 | onHide: function () {
39 |
40 | },
41 |
42 | /**
43 | * 生命周期函数--监听页面卸载
44 | */
45 | onUnload: function () {
46 |
47 | },
48 |
49 | /**
50 | * 页面相关事件处理函数--监听用户下拉动作
51 | */
52 | onPullDownRefresh: function () {
53 | var that = this;
54 | wx.showNavigationBarLoading(); //在标题栏中显示加载
55 | setTimeout(function () {
56 | // complete
57 | that.onGetActivities();
58 | wx.hideNavigationBarLoading(); //完成停止加载
59 | wx.stopPullDownRefresh(); //停止下拉刷新
60 | }, 1500);
61 | },
62 |
63 | /**
64 | * 页面上拉触底事件的处理函数
65 | */
66 | onReachBottom: function () {
67 |
68 | },
69 |
70 | /**
71 | * 用户点击右上角分享
72 | */
73 | onShareAppMessage: function () {
74 |
75 | },
76 |
77 | //获取所有活动信息
78 | onGetActivities: function () {
79 | var that = this;
80 | var Activity = Bmob.Object.extend("activity");
81 | var query = new Bmob.Query(Activity);
82 | query.limit(that.data.count += 10);
83 | query.descending("time");
84 | // 查询所有数据
85 | query.find({
86 | success: function (results) {
87 | // 循环处理查询到的数据
88 | that.setData({ items: results });
89 | },
90 | error: function (error) {
91 | console.log("查询失败: " + error.coDe + " " + error.message);
92 | }
93 | });
94 | },
95 |
96 | //点击单个活动跳转事件,跳转到活动详情
97 | onDetail: function (e) {
98 | var id = e.currentTarget.dataset.id; //打印可以看到,此处已获取到了对应的id
99 | wx.navigateTo({
100 | url: '../ActivityDetail/ActivityDetail?objectId=' + id
101 | })
102 | },
103 |
104 | })
--------------------------------------------------------------------------------
/pages/Main/Main.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "山东大学唐仲英爱心社",
3 | "enablePullDownRefresh": true,
4 | "backgroundColor": "#acd"
5 | }
--------------------------------------------------------------------------------
/pages/Main/Main.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | {{item.name}}
9 | {{item.time}}
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/pages/Main/Main.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Main.wxss */
2 | /* 首页 */
3 | .container{
4 | align-items: center;
5 | margin: 10rpx;
6 | }
7 |
8 | label{
9 | margin: 20rpx;
10 | display: flex;
11 | justify-content: center;
12 | color: red;
13 | }
14 |
15 | .activities{
16 | margin: 10rpx;
17 | }
18 |
19 | label{
20 | font-size: 50rpx;
21 | }
22 |
23 | .activity{
24 | margin: 20rpx;
25 | padding: 20rpx;
26 | background-color: #acd;
27 | border-radius: 5px;
28 | padding-bottom: 50rpx;
29 | }
30 |
31 | .activity .name{
32 | width: 100%;
33 | margin-left: 20rpx;
34 | display: flex;
35 | }
36 |
37 | .activity .time{
38 | font-size: 30rpx;
39 | float: right;
40 | }
41 |
--------------------------------------------------------------------------------
/pages/ManageActivity/ManageActivity.js:
--------------------------------------------------------------------------------
1 | // pages/ManageActivity/ManageActivity.js
2 | // 管理活动页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | items: [],
11 | count: 0
12 | },
13 |
14 | /**
15 | * 生命周期函数--监听页面加载
16 | */
17 | onLoad: function (options) {
18 |
19 | },
20 |
21 | /**
22 | * 生命周期函数--监听页面初次渲染完成
23 | */
24 | onReady: function () {
25 | this.onGetActivities();
26 | },
27 |
28 | /**
29 | * 生命周期函数--监听页面显示
30 | */
31 | onShow: function () {
32 |
33 | },
34 |
35 | /**
36 | * 生命周期函数--监听页面隐藏
37 | */
38 | onHide: function () {
39 |
40 | },
41 |
42 | /**
43 | * 生命周期函数--监听页面卸载
44 | */
45 | onUnload: function () {
46 |
47 | },
48 |
49 | /**
50 | * 页面相关事件处理函数--监听用户下拉动作
51 | */
52 | onPullDownRefresh: function () {
53 | var that = this;
54 | wx.showNavigationBarLoading(); //在标题栏中显示加载
55 | setTimeout(function () {
56 | // complete
57 | that.onGetActivities();
58 | wx.hideNavigationBarLoading(); //完成停止加载
59 | wx.stopPullDownRefresh(); //停止下拉刷新
60 | }, 1500);
61 | },
62 |
63 | /**
64 | * 页面上拉触底事件的处理函数
65 | */
66 | onReachBottom: function () {
67 |
68 | },
69 |
70 | /**
71 | * 用户点击右上角分享
72 | */
73 | onShareAppMessage: function () {
74 |
75 | },
76 | //创建活动按钮
77 | onCreateActivities: function () {
78 | wx.navigateTo({
79 | url: '../Activities/Activities'
80 | })
81 | },
82 |
83 | //获取当前我创建的活动信息
84 | onGetActivities: function () {
85 | var that = this;
86 | var currentUser = Bmob.User.current();
87 | var Activity = Bmob.Object.extend("activity");
88 | var query = new Bmob.Query(Activity);
89 | query.equalTo("createdby", currentUser.get("realname"));
90 | query.limit(that.data.count += 10);
91 | query.descending("time");
92 | // 查询所有数据
93 | query.find({
94 | success: function (results) {
95 | that.setData({ items: results });
96 | },
97 | error: function (error) {
98 | console.log("查询失败: " + error.coDe + " " + error.message);
99 | }
100 | });
101 |
102 | },
103 |
104 | //点击活动跳转到活动详情页面
105 | onDetail: function (e) {
106 | var id = e.currentTarget.dataset.id; //打印可以看到,此处已获取到了对应的id
107 | wx.navigateTo({
108 | url: '../ChangeActivity/ChangeActivity?objectId=' + id
109 | })
110 | }
111 |
112 |
113 | })
--------------------------------------------------------------------------------
/pages/ManageActivity/ManageActivity.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "管理活动",
3 | "enablePullDownRefresh": true,
4 | "backgroundColor": "#acd"
5 | }
--------------------------------------------------------------------------------
/pages/ManageActivity/ManageActivity.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 | {{item.name}}
12 | {{item.time}}
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/pages/ManageActivity/ManageActivity.wxss:
--------------------------------------------------------------------------------
1 | /* pages/ManageActivity/ManageActivity.wxss */
2 | /* 管理活动页面 */
3 | .container{
4 | margin: 10rpx;
5 | }
6 |
7 | .header{
8 | margin: 40rpx auto;
9 | }
10 |
11 | .header button{
12 | margin: 20rpx;
13 | font-size: 34rpx;
14 | }
15 |
16 | label{
17 | margin: 20rpx;
18 | display: flex;
19 | justify-content: center;
20 | color: red;
21 | }
22 |
23 | .myActivities{
24 | margin: 10rpx;
25 | }
26 |
27 | label{
28 | font-size: 50rpx;
29 | }
30 |
31 | .activity{
32 | margin: 20rpx;
33 | padding: 20rpx;
34 | background-color: #acd;
35 | border-radius: 5px;
36 | padding-bottom: 50rpx;
37 | }
38 |
39 | .activity .name{
40 | width: 100%;
41 | margin-left: 20rpx;
42 | display: flex;
43 | }
44 |
45 | .activity .time{
46 | font-size: 30rpx;
47 | float: right;
48 | }
--------------------------------------------------------------------------------
/pages/ManageTask/ManageTask.js:
--------------------------------------------------------------------------------
1 | // pages/ManageTask/ManageTask.js
2 | // 管理任务页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | allitems: [],
12 |
13 | },
14 |
15 | /**
16 | * 生命周期函数--监听页面加载
17 | */
18 | onLoad: function (options) {
19 |
20 | },
21 |
22 | /**
23 | * 生命周期函数--监听页面初次渲染完成
24 | */
25 | onReady: function () {
26 |
27 | },
28 |
29 | /**
30 | * 生命周期函数--监听页面显示
31 | */
32 | onShow: function () {
33 | var that = this;
34 | that.onGetAllTasks();
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 | var that = this;
56 | wx.showNavigationBarLoading(); //在标题栏中显示加载
57 | setTimeout(function () {
58 | // complete
59 | that.onGetAllTasks();
60 | wx.hideNavigationBarLoading(); //完成停止加载
61 | wx.stopPullDownRefresh(); //停止下拉刷新
62 | }, 1500);
63 |
64 | },
65 |
66 | /**
67 | * 页面上拉触底事件的处理函数
68 | */
69 | onReachBottom: function () {
70 |
71 | },
72 |
73 | /**
74 | * 用户点击右上角分享
75 | */
76 | onShareAppMessage: function () {
77 |
78 | },
79 |
80 | //获取当前所有的任务信息
81 | onGetAllTasks: function () {
82 | var that = this;
83 | var Task = Bmob.Object.extend("task");
84 | var query = new Bmob.Query(Task);
85 | query.limit(that.data.count += 5);
86 | var currentUser = Bmob.User.current();
87 | query.equalTo("createdby",currentUser.get("realname"));
88 | query.descending("totalScore");
89 | // 查询所有数据并将数据添加到数据对象当中去
90 | query.find({
91 | success: function (results) {
92 | for (var i = 0; i < results.length; i++) {
93 | var obj = results[i];
94 | var currenttime = util.formatTime2(new Date());
95 | if (currenttime > obj.get("endtime")) {
96 | query.get(obj.id, {
97 | success: function (result) {
98 | var currenttime = util.formatTime2(new Date());
99 | //当前时间大于任务时间则任务结束
100 | if (currenttime > result.get("endtime")) {
101 | result.set("complete", true);
102 | result.save();
103 | console.log("save");
104 | }
105 | },
106 | error: function (object, error) {
107 | // 查询失败
108 | }
109 | });
110 | }
111 | //设置当前时间与起始时间之间的时间间隔
112 | obj.set("index", that.calDate(obj.get("begintime")));
113 | }
114 | that.setData({ allitems: results });
115 | },
116 | error: function (error) {
117 | console.log("查询失败: " + error.coDe + " " + error.message);
118 | }
119 | });
120 | },
121 |
122 | //计算当前日期与设定起始日期之间的间隔
123 | calDate: function (begintime) {
124 | var that = this;
125 | //获取系统当前时间年月日
126 | var date = new Date();
127 | var currenttime = util.formatTime2(date);
128 | var begin = new Date(begintime.replace(/-/g, "/"));
129 | var end = new Date(currenttime.replace(/-/g, "/"));
130 | var days = end.getTime() - begin.getTime();
131 | var day = parseInt(days / (1000 * 60 * 60 * 24));
132 | return day;
133 | },
134 |
135 | //创建任务按钮
136 | onCreateTask: function () {
137 | wx.navigateTo({
138 | url: '../CreateTask/CreateTask'
139 | })
140 | },
141 |
142 | //点击任务跳转到任务详情页面
143 | onTaskDetail: function (e) {
144 | var id = e.currentTarget.dataset.id; //打印可以看到,此处已获取到了对应的id
145 | wx.navigateTo({
146 | url: '../ChangeTask/ChangeTask?objectId=' + id
147 | })
148 | }
149 | })
--------------------------------------------------------------------------------
/pages/ManageTask/ManageTask.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "管理任务",
3 | "enablePullDownRefresh": true,
4 | "backgroundColor": "#acd"
5 | }
--------------------------------------------------------------------------------
/pages/ManageTask/ManageTask.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 | {{item.name}}
14 |
15 |
16 | {{item.currentNumber}}
17 |
18 | {{item.number}}
19 |
20 |
21 |
22 | {{item.totalScore}}
23 |
24 |
25 |
26 |
27 |
28 | {{item.name}}
29 |
30 |
31 | {{item.signNumber[item.index].count}}
32 |
33 | {{item.currentNumber}}
34 |
35 | {{item.number}}
36 |
37 |
38 |
39 | {{item.totalScore}}
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/pages/ManageTask/ManageTask.wxss:
--------------------------------------------------------------------------------
1 | /* pages/ManageTask/ManageTask.wxss */
2 | /* 管理任务页面 */
3 | .container{
4 | margin: 10rpx;
5 | }
6 |
7 | .header{
8 | margin: 40rpx auto;
9 | }
10 |
11 | .header button{
12 | margin: 20rpx;
13 | font-size: 34rpx;
14 | }
15 |
16 | label{
17 | margin: 20rpx;
18 | display: flex;
19 | justify-content: center;
20 | color: red;
21 | }
22 |
23 | .alltask{
24 | margin: 20rpx;
25 | padding: 20rpx;
26 | border-radius: 10px;
27 | display: flex;
28 | flex-direction: row;
29 | justify-content: space-between;
30 | }
31 |
32 | .alltask .content{
33 | display: flex;
34 | flex-direction: column;
35 | justify-content: center;
36 | padding: 10rpx;
37 | background-size: 180rpx;
38 | background-repeat: no-repeat;
39 | /* 让背景图片在右边显示 */
40 | background-position-x: right;
41 | }
42 |
43 | .alltask .content .sign{
44 | display: flex;
45 | }
46 |
47 | .alltask .content .name{
48 | width: 400rpx;
49 | margin-top: 20rpx;
50 | margin-bottom: 20rpx;
51 | }
52 |
53 | .alltask .content .sign .signNumber{
54 | margin: auto 15rpx;
55 | margin-top: 20rpx;
56 | margin-bottom: 20rpx;
57 | }
58 |
59 | .alltask .content .sign .currentNumber{
60 | margin: auto 15rpx;
61 | margin-top: 20rpx;
62 | margin-bottom: 20rpx;
63 | }
64 |
65 | .alltask .content .sign .number{
66 | margin: auto 15rpx;
67 | margin-top: 20rpx;
68 | margin-bottom: 20rpx;
69 | }
70 |
71 | .alltask .content image{
72 | width: 50rpx;
73 | height: 50rpx;
74 | margin-bottom: 20rpx;
75 | margin-top: 15rpx;
76 | }
77 |
78 | .alltask .right{
79 | display: flex;
80 | margin-right: 50rpx;
81 | flex-direction: column;
82 | justify-content: center;
83 | position: relative;
84 | right: 10rpx;
85 | }
86 |
87 | .alltask .right text{
88 | font-family: "华文行楷";
89 | font-size: 60rpx;
90 | width: 120rpx;
91 | height: 120rpx;
92 | margin-left: 60rpx;
93 | border-radius: 50%;
94 | background-color: #fff;
95 | text-align: center;
96 | display: flex;
97 | flex-direction: column;
98 | justify-content: center;
99 | }
--------------------------------------------------------------------------------
/pages/Range/Range.js:
--------------------------------------------------------------------------------
1 | // pages/Range/Range.js
2 | // 排名页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 | /**
6 | * 页面的初始数据
7 | */
8 | data: {
9 | items:[]
10 |
11 | },
12 |
13 | /**
14 | * 生命周期函数--监听页面加载
15 | */
16 | onLoad: function (options) {
17 | this.onGetRange();
18 |
19 | },
20 |
21 | /**
22 | * 生命周期函数--监听页面初次渲染完成
23 | */
24 | onReady: function () {
25 |
26 | },
27 |
28 | /**
29 | * 生命周期函数--监听页面显示
30 | */
31 | onShow: function () {
32 |
33 | },
34 |
35 | /**
36 | * 生命周期函数--监听页面隐藏
37 | */
38 | onHide: function () {
39 |
40 | },
41 |
42 | /**
43 | * 生命周期函数--监听页面卸载
44 | */
45 | onUnload: function () {
46 |
47 | },
48 |
49 | /**
50 | * 页面相关事件处理函数--监听用户下拉动作
51 | */
52 | onPullDownRefresh: function () {
53 |
54 | },
55 |
56 | /**
57 | * 页面上拉触底事件的处理函数
58 | */
59 | onReachBottom: function () {
60 |
61 | },
62 |
63 | /**
64 | * 用户点击右上角分享
65 | */
66 | onShareAppMessage: function () {
67 |
68 | },
69 |
70 | //获取所有排名信息
71 | onGetRange:function(){
72 | var that = this;
73 | var Task_User = Bmob.Object.extend("task_user");
74 | var query = new Bmob.Query(Task_User);
75 | query.descending("score");
76 | query.limit(20);
77 | // 查询所有数据并将数据添加到数据对象当中去
78 | query.find({
79 | success: function (results) {
80 | that.setData({items: results });
81 | },
82 | error: function (error) {
83 | console.log("查询失败: " + error.coDe + " " + error.message);
84 | }
85 | });
86 | }
87 | })
--------------------------------------------------------------------------------
/pages/Range/Range.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "诚信状总排名"
3 | }
--------------------------------------------------------------------------------
/pages/Range/Range.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | {{index+1}}
23 |
24 |
25 | {{item.realname}}
26 | {{item.taskname}}
27 |
28 |
29 | {{item.score}}
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/pages/Range/Range.wxss:
--------------------------------------------------------------------------------
1 | /* pages/Range/Range.wxss */
2 | /* 排名页面 */
3 | .container{
4 | align-items: center;
5 | margin: 10rpx;
6 | }
7 |
8 | label{
9 | margin: 20rpx;
10 | display: flex;
11 | justify-content: center;
12 | color: red;
13 | }
14 |
15 | .range{
16 | margin: 10rpx;
17 | }
18 |
19 | label{
20 | font-size: 50rpx;
21 | }
22 |
23 | .tasks{
24 | margin: 20rpx;
25 | background-color: #acd;
26 | border-radius: 5px;
27 | padding: 30rpx;
28 | display:flex;
29 | }
30 |
31 | .tasks image{
32 | width: 100rpx;
33 | height: 100rpx;
34 | }
35 |
36 | .tasks .rank{
37 | width: 100rpx;
38 | height: 100rpx;
39 | border-radius: 50%;
40 | background-color: #1aad19;
41 | font-size: 60rpx;
42 | color: #fff;
43 | text-align: center;
44 | display: flex;
45 | flex-direction: column;
46 | justify-content: center;
47 | }
48 |
49 | .tasks .content{
50 | width: 400rpx;
51 | display: flex;
52 | flex-direction: column;
53 | justify-content: center;
54 | margin-left: 30rpx;
55 | }
56 |
57 | .tasks .content .realname{
58 | font-size: 44rpx;
59 | margin-bottom: 10rpx;
60 | }
61 |
62 | .tasks .content .name{
63 | font-size: 35rpx;
64 | margin-bottom: 10rpx;
65 | }
66 |
67 | .tasks .score{
68 | margin-top: 10rpx;
69 | }
70 |
71 | .tasks .score text{
72 | font-family: "华文行楷";
73 | font-size: 60rpx;
74 | width: 100rpx;
75 | height: 100rpx;
76 | border-radius: 50%;
77 | background-color: #fff;
78 | text-align: center;
79 | display: flex;
80 | flex-direction: column;
81 | justify-content: center;
82 | }
83 |
84 |
--------------------------------------------------------------------------------
/pages/Register/Register.js:
--------------------------------------------------------------------------------
1 | // pages/index/Register.js
2 | // 注册页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 | /**
6 | * 页面的初始数据
7 | */
8 | data: {
9 | name:'',
10 | namePhold:'姓名',
11 | id:'',
12 | idPhold:'学号',
13 | password:'',
14 | passwordPhold:'密码',
15 | passwordAgain: '',
16 | passwordAgainPhold: '再次输入密码',
17 | campuses: ['中心校区','洪家楼校区','软件园校区','趵突泉校区','兴隆山校区','千佛山校区','青岛校区'],
18 | campus:'中心校区',
19 | campusIndex:0,
20 | college:'',
21 | collegePhold:'学院',
22 | departments: ['活动实践部', '网络宣传部', '新闻中心', '秘书处', '财务部', '社长', '团支书', '副社'],
23 | department:'非唐社成员',
24 | departmentIndex: 0,
25 | departmentPhold:'部门',
26 | phone:'',
27 | phonePhold:'手机号',
28 | depart:true,
29 | items:[
30 | {name:'是',checked:false},
31 | {name:'否', checked: false }
32 | ]
33 | },
34 |
35 | /**
36 | * 生命周期函数--监听页面加载
37 | */
38 | onLoad: function (options) {
39 |
40 | },
41 |
42 | /**
43 | * 生命周期函数--监听页面初次渲染完成
44 | */
45 | onReady: function () {
46 |
47 | },
48 |
49 | /**
50 | * 生命周期函数--监听页面显示
51 | */
52 | onShow: function () {
53 |
54 | },
55 |
56 | /**
57 | * 生命周期函数--监听页面隐藏
58 | */
59 | onHide: function () {
60 |
61 | },
62 |
63 | /**
64 | * 生命周期函数--监听页面卸载
65 | */
66 | onUnload: function () {
67 |
68 | },
69 |
70 | /**
71 | * 页面相关事件处理函数--监听用户下拉动作
72 | */
73 | onPullDownRefresh: function () {
74 |
75 | },
76 |
77 | /**
78 | * 页面上拉触底事件的处理函数
79 | */
80 | onReachBottom: function () {
81 |
82 | },
83 |
84 | /**
85 | * 用户点击右上角分享
86 | */
87 | onShareAppMessage: function () {
88 |
89 | },
90 |
91 | //获取输入的姓名
92 | onGetName:function(e){
93 | this.setData({ name: e.detail.value });
94 | },
95 |
96 | //获取输入的学号
97 | onGetId: function (e){
98 | this.setData({ id: e.detail.value });
99 | },
100 |
101 | //获取输入的校区
102 | onCampusChange: function (e) {
103 | this.setData({campusIndex: e.detail.value })
104 | var s = this.data.campuses[this.data.campusIndex]
105 | this.setData({ campus: s })
106 | },
107 |
108 | //获取输入的学院
109 | onGetCollege: function (e){
110 | this.setData({ college: e.detail.value });
111 | },
112 |
113 | //获取输入的部门
114 | onGetDepartment: function (e){
115 | this.setData({ departmentIndex: e.detail.value })
116 | var s = this.data.departments[this.data.departmentIndex]
117 | this.setData({ department: s });
118 | },
119 |
120 | //获取输入的手机号
121 | onGetPhone: function (e){
122 | this.setData({ phone: e.detail.value });
123 | },
124 |
125 | //获取输入的密码
126 | onGetPassword: function (e) {
127 | this.setData({ password: e.detail.value });
128 | },
129 |
130 | //获取第二次输入的密码
131 | onGetPasswordAgain: function (e) {
132 | this.setData({ passwordAgain: e.detail.value });
133 | },
134 |
135 | //判断是否是唐社成员
136 | onRadioChange: function(e){
137 | if(e.detail.value == "是"){
138 | this.setData({depart:false});
139 | //让picker有个默认值
140 | this.setData({department:'活动实践部'});
141 | }else{
142 | this.setData({depart: true });
143 | }
144 | },
145 |
146 | //注册
147 | onRegister:function(e){
148 | var user = new Bmob.User();
149 | //所有输入不为空
150 | if(this.data.name != '' && this.data.id != '' && this.data.campus != '' && this.data.college != '' && this.data.phone != ''){
151 | if (this.data.id.length == 12){
152 | if (this.data.phone.length == 11) {
153 | //两次输入的密码相等
154 | if (this.data.password == this.data.passwordAgain) {
155 | user.set('username', this.data.id);
156 | user.set('password', this.data.password);
157 | user.set('realname', this.data.name);
158 | user.set('campus', this.data.campus);
159 | user.set('college', this.data.college);
160 | user.set('createActivity', false);
161 | user.set('grant', false);
162 | user.set('sign', false);
163 | user.set('department', this.data.department);
164 | user.set('phone', this.data.phone);
165 | user.signUp(null, {
166 | success: function (res) {
167 | wx.showToast({
168 | title: '注册成功',
169 | duration: 2000
170 | })
171 | setTimeout(function () {
172 | wx.redirectTo({
173 | url: '../Login/Login'
174 | })
175 | }, 2000);
176 | },
177 | error: function (userData, error) {
178 | wx.showModal({
179 | title: '提示',
180 | content: '账号已存在'
181 | })
182 | }
183 | });
184 | }
185 | else {
186 | wx.showModal({
187 | title: '提示',
188 | content: '两次输入密码不一致'
189 | })
190 | }
191 | } else {
192 | wx.showModal({
193 | title: '提示',
194 | content: '手机号格式不正确'
195 | })
196 | }
197 | }else{
198 | wx.showModal({
199 | title: '提示',
200 | content: '学号格式不正确'
201 | })
202 | }
203 | }else{
204 | wx.showModal({
205 | title: '提示',
206 | content: '请把资料填写完成'
207 | })
208 | }
209 | }
210 | })
--------------------------------------------------------------------------------
/pages/Register/Register.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "注册"
3 | }
--------------------------------------------------------------------------------
/pages/Register/Register.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | {{campuses[campusIndex]}}
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | {{item.name}}
32 |
33 |
34 |
35 |
36 |
37 | {{departments[departmentIndex]}}
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/pages/Register/Register.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Register.wxss */
2 | /* 注册页面 */
3 | .container{
4 | margin-top: -110rpx;
5 | }
6 | .input{
7 | margin: 10rpx auto;
8 | display: flex;
9 | align-items: center;
10 | height: 80rpx;
11 | padding: 0 40rpx;
12 | background-color: #fff;
13 | font-size: 34rpx;
14 | color: #000;
15 | }
16 |
17 | .choose{
18 | margin: 10rpx auto;
19 | display: flex;
20 | align-items: center;
21 | height: 80rpx;
22 | width: 450rpx;
23 | padding: 10rpx;
24 | background-color: #acd;
25 | border-radius: 5px;
26 | font-size: 34rpx;
27 | color: #000;
28 |
29 | }
30 |
31 | .input input{
32 | width: 450rpx;
33 | padding: 10rpx;
34 | background-color: #acd;
35 | border-radius: 5px;
36 | }
37 |
38 | picker{
39 | width: 450rpx;
40 | padding: 10rpx;
41 | background-color: #acd;
42 | border-radius: 5px;
43 | }
44 |
45 | .buttons{
46 | margin: 20rpx auto;
47 | display: flex;
48 | }
49 |
50 | .buttons button{
51 | width: 500rpx;
52 | text-align: center;
53 | margin: 50rpx;
54 | font-size: 34rpx;
55 | }
--------------------------------------------------------------------------------
/pages/Robot/Robot.js:
--------------------------------------------------------------------------------
1 | // pages/Robot/Robot.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 | })
--------------------------------------------------------------------------------
/pages/Robot/Robot.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/pages/Robot/Robot.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/pages/Robot/Robot.wxss:
--------------------------------------------------------------------------------
1 | /* pages/Robot/Robot.wxss */
--------------------------------------------------------------------------------
/pages/Sign/Sign.js:
--------------------------------------------------------------------------------
1 | // pages/Sign/Sign.js
2 | // 诚信状页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | // tab切换
12 | winWidth: 0,
13 | winHeight: 0,
14 | currentTab: 0,
15 | //我的任务和所有任务
16 | myitems: [],
17 | allitems:[],
18 | count: 0,//页面显示任务的数量
19 | },
20 |
21 | /**
22 | * 生命周期函数--监听页面加载
23 | */
24 | onLoad: function (options) {
25 | var that = this;
26 | /**
27 | * 获取系统信息
28 | */
29 | wx.getSystemInfo({
30 | success: function (res) {
31 | that.setData({
32 | winWidth: res.windowWidth,
33 | winHeight: res.windowHeight
34 | });
35 | }
36 | });
37 | },
38 |
39 | /**
40 | * 生命周期函数--监听页面初次渲染完成
41 | */
42 | onReady: function () {
43 |
44 | },
45 |
46 | /**
47 | * 生命周期函数--监听页面显示
48 | */
49 | onShow: function () {
50 | var that = this;
51 | that.onGetMyTasks();
52 | that.onGetAllTasks();
53 | },
54 |
55 | /**
56 | * 生命周期函数--监听页面隐藏
57 | */
58 | onHide: function () {
59 |
60 | },
61 |
62 | /**
63 | * 生命周期函数--监听页面卸载
64 | */
65 | onUnload: function () {
66 |
67 | },
68 |
69 | /**
70 | * 页面相关事件处理函数--监听用户下拉动作
71 | */
72 | onPullDownRefresh: function () {
73 | var that = this;
74 | wx.showNavigationBarLoading(); //在标题栏中显示加载
75 | setTimeout(function () {
76 | // complete
77 | that.onGetMyTasks();
78 | that.onGetAllTasks();
79 | wx.hideNavigationBarLoading(); //完成停止加载
80 | wx.stopPullDownRefresh(); //停止下拉刷新
81 | }, 1500);
82 |
83 | },
84 |
85 | /**
86 | * 页面上拉触底事件的处理函数
87 | */
88 | onReachBottom: function () {
89 |
90 | },
91 |
92 | /**
93 | * 用户点击右上角分享
94 | */
95 | onShareAppMessage: function () {
96 |
97 | },
98 | /**
99 | * 滑动切换tab页面
100 | */
101 | onPageChange: function (e) {
102 | var that = this;
103 | that.setData({ currentTab: e.detail.current });
104 | },
105 | /**
106 | * 点击tab切换页面
107 | */
108 | onSwichNav: function (e) {
109 | var that = this;
110 | if (this.data.currentTab === e.target.dataset.current) {
111 | return false;
112 | } else {
113 | that.setData({
114 | currentTab: e.target.dataset.current
115 | })
116 | }
117 | },
118 |
119 | //创建任务按钮
120 | onCreateTask: function () {
121 | wx.navigateTo({
122 | url: '../CreateTask/CreateTask'
123 | })
124 | },
125 |
126 | //获取当前用户已报名的任务信息
127 | onGetMyTasks: function () {
128 | var that = this;
129 | var currentUser = Bmob.User.current();
130 | var Task_User = Bmob.Object.extend("task_user");
131 | var query = new Bmob.Query(Task_User);
132 | query.equalTo("realname", currentUser.get("realname"));
133 | query.descending("score");
134 | query.limit(that.data.count += 5);
135 | // 查询所有数据并将数据添加到数据对象当中去
136 | query.find({
137 | success: function (results) {
138 | that.setData({ myitems: results });
139 | //只能用这个循环才可以,否则会出问题
140 | for (var i = 0; i < results.length; i++) {
141 | that.onUnion(i);
142 | }
143 | },
144 | error: function (error) {
145 | console.log("查询失败: " + error.coDe + " " + error.message);
146 | }
147 | });
148 | },
149 |
150 | //将task表和task_user表自然连接
151 | onUnion: function (n) {
152 | var that = this;
153 | var obj = that.data.myitems[n];
154 | var Task = Bmob.Object.extend("task");
155 | var q = new Bmob.Query(Task);
156 | q.get(obj.get("activityid"), {
157 | success: function (result) {
158 | // 查询成功,调用get方法获取task表中对应属性的值
159 | obj.set("currentNumber", result.get("currentNumber"));
160 | obj.set("signNumber", result.get("signNumber"));
161 | obj.set("color", result.get("color"));
162 | obj.set("complete", result.get("complete"));
163 | //设置当前时间与起始时间之间的时间间隔
164 | obj.set("index", that.calDate(result.get("begintime")));
165 | obj.set("days", result.get("days"));
166 | that.setData({ myitems: that.data.myitems });
167 | },
168 | error: function (object, error) {
169 | // 查询失败
170 | }
171 | });
172 | },
173 |
174 | //单个任务的签到按钮
175 | onSignUp:function(e){
176 | var that = this;
177 | var index = e.currentTarget.dataset.index;
178 | //获取当前日期signUp数组的下标
179 | var k = that.data.myitems[index].get("index");
180 | //更改页面是否打卡数据
181 | that.data.myitems[index].get("signUp")[k].isSign = "今日已打卡";
182 | that.setData({ myitems: that.data.myitems });
183 | //更改页面当前任务签到人数
184 | that.data.myitems[index].get("signNumber")[k].count += 1;
185 | that.setData({ myitems: that.data.myitems });
186 | //必须包装在函数中在调用才可以更新数据成功
187 | that.onSetScore(index);
188 | //修改task表
189 | var Task = Bmob.Object.extend("task");
190 | var query = new Bmob.Query(Task);
191 | query.get(that.data.myitems[index].get("activityid"), {
192 | success: function (result) {
193 | //修改当前任务的总积分
194 | // var totalScore = result.get('totalScore') + 1;
195 | // result.set("totalScore", totalScore);
196 | result.increment("totalScore");
197 | //更改后台signNumber数组数据
198 | result.set("signNumber", that.data.myitems[index].get("signNumber"));
199 | result.save();
200 | //修改task_user表
201 | var Task_User = Bmob.Object.extend("task_user");
202 | var q = new Bmob.Query(Task_User);
203 | q.get(that.data.myitems[index].id, {
204 | success: function (result) {
205 | //修改当前任务的积分
206 | // var score = result.get('score') + 1;
207 | // result.set("score", score);
208 | result.increment("score");
209 | //更改后台signUp数组数据
210 | result.set("signUp", that.data.myitems[index].get("signUp"));
211 | result.save();
212 | wx.showToast({
213 | title: '打卡成功',
214 | duration: 2000
215 | });
216 | if (that.data.myitems[index].get("days") - 1 == that.data.myitems[index].get("index")) {
217 | result.set("complete", true);
218 | result.save();
219 | setTimeout(function () {
220 | wx.showModal({
221 | title: '提示',
222 | content: '恭喜你,该任务已全部完成'
223 | })
224 | }, 2000);
225 | }
226 |
227 | },
228 | error: function (object, error) {
229 | }
230 | });
231 | },
232 | error: function (object, error) {
233 | }
234 | });
235 |
236 | },
237 |
238 | //计算当前日期与设定起始日期之间的间隔
239 | calDate: function (begintime) {
240 | var that = this;
241 | //获取系统当前时间年月日
242 | var date = new Date();
243 | var currenttime = util.formatTime2(date);
244 | var begin = new Date(begintime.replace(/-/g, "/"));
245 | var end = new Date(currenttime.replace(/-/g, "/"));
246 | var days = end.getTime() - begin.getTime();
247 | var day = parseInt(days / (1000 * 60 * 60 * 24));
248 | return day;
249 | },
250 |
251 | //更新任务个人积分
252 | onSetScore:function(index){
253 | var that = this;
254 | var sc = that.data.myitems[index].get("score") + 1;
255 | var n = "myitems[" + index + "].score";
256 | that.setData({ [n]: sc });
257 | },
258 |
259 | //获取当前所有的任务信息
260 | onGetAllTasks: function () {
261 | var that = this;
262 | var Task = Bmob.Object.extend("task");
263 | var query = new Bmob.Query(Task);
264 | query.limit(that.data.count += 10);
265 | query.descending("totalScore");
266 | // 查询所有数据并将数据添加到数据对象当中去
267 | query.find({
268 | success: function (results) {
269 | for(var i=0;i obj.get("endtime")){
273 | query.get(obj.id, {
274 | success: function (result) {
275 | var currenttime = util.formatTime2(new Date());
276 | if (currenttime > result.get("endtime")) {
277 | result.set("complete", true);
278 | result.save();
279 | }
280 | },
281 | error: function (object, error) {
282 | // 查询失败
283 | }
284 | });
285 | }
286 | //设置当前时间与起始时间之间的时间间隔
287 | obj.set("index", that.calDate(obj.get("begintime")));
288 | }
289 | that.setData({ allitems: results });
290 | },
291 | error: function (error) {
292 | console.log("查询失败: " + error.coDe + " " + error.message);
293 | }
294 | });
295 | },
296 |
297 | //点击我的任务进入任务详情页面
298 | onMyTaskDetail:function(e){
299 | var that = this;
300 | var id = e.currentTarget.dataset.id;
301 | wx.navigateTo({
302 | url: '../TaskDetail/TaskDetail?objectId='+id+"&enroll=true"
303 | })
304 | },
305 |
306 | //点击热门任务进入任务详情页面
307 | onTaskDetail: function (e) {
308 | var that = this;
309 | var id = e.currentTarget.dataset.id;
310 | wx.navigateTo({
311 | url: '../TaskDetail/TaskDetail?objectId='+id
312 | })
313 | },
314 |
315 | //点击热门任务进入任务详情页面
316 | onAllRange: function () {
317 | wx.navigateTo({
318 | url: '../Range/Range'
319 | })
320 | },
321 |
322 | })
--------------------------------------------------------------------------------
/pages/Sign/Sign.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "诚信状",
3 | "enablePullDownRefresh": true,
4 | "backgroundColor": "#acd"
5 | }
--------------------------------------------------------------------------------
/pages/Sign/Sign.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 我的任务
5 | 热门任务
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | {{item.taskname}}
19 |
20 |
21 | {{item.currentNumber}}
22 |
23 |
24 |
25 | {{item.score}}
26 |
27 |
28 |
29 |
30 |
31 | {{item.taskname}}
32 | {{item.signUp[item.index].isSign}}
33 |
34 |
35 | {{item.signNumber[item.index].count}}
36 |
37 | {{item.currentNumber}}
38 |
39 |
40 |
41 | {{item.score}}
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | {{item.name}}
63 |
64 |
65 | {{item.currentNumber}}
66 |
67 | {{item.number}}
68 |
69 |
70 |
71 | {{item.totalScore}}
72 |
73 |
74 |
75 |
76 |
77 | {{item.name}}
78 |
79 |
80 | {{item.signNumber[item.index].count}}
81 |
82 | {{item.currentNumber}}
83 |
84 | {{item.number}}
85 |
86 |
87 |
88 | {{item.totalScore}}
89 |
90 |
91 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/pages/Sign/Sign.wxss:
--------------------------------------------------------------------------------
1 | /* pages/Sign/Sign.wxss */
2 | /* 诚信状页面 */
3 | .swiper_tab {
4 | width: 100%;
5 | text-align: center;
6 | line-height: 80rpx;
7 | }
8 |
9 | .swiper_tab_list {
10 | font-size: 34rpx;
11 | display: inline-block;
12 | width: 33%;
13 | color: #777;
14 | }
15 |
16 | .on {
17 | color: #da7c0c;
18 | border-bottom: 5rpx solid #da7c0c;
19 | }
20 |
21 | .swiper_box {
22 | display: block;
23 | height: 100%;
24 | width: 100%;
25 | overflow: hidden;
26 | }
27 |
28 | .swiper_box .swiper-items{
29 | margin-top: 20rpx;
30 | height: 100%;
31 | }
32 |
33 | .swiper_box .swiper-items .task{
34 | height: 100%;
35 | }
36 |
37 | .swiper_box button{
38 | margin: 20rpx;
39 | font-size: 34rpx;
40 | }
41 |
42 | .mytask{
43 | margin: 20rpx;
44 | padding: 20rpx;
45 | border-radius: 10px;
46 | display: flex;
47 | }
48 |
49 | .mytask .content{
50 | width: 450rpx;
51 | display: flex;
52 | flex-direction: column;
53 | justify-content: center;
54 | padding: 5rpx;
55 | background-size: 180rpx;
56 | background-repeat: no-repeat;
57 | /* 让背景图片在右边显示 */
58 | background-position-x: right;
59 | }
60 |
61 | .mytask .content .name{
62 | width: 400rpx;
63 | margin-top: 30rpx;
64 | margin-bottom: 10rpx;
65 | }
66 |
67 | .mytask .content .isSign{
68 | font-size: 28rpx;
69 | margin: 10rpx auto;
70 | margin-top: 20rpx;
71 | width: 400rpx;
72 | }
73 |
74 | .mytask .content .sign{
75 | display: flex;
76 | bottom: -10rpx;
77 | }
78 |
79 | .mytask .content .sign .signNumber {
80 | margin: auto 15rpx;
81 | margin-bottom: 20rpx;
82 | margin-top: 20rpx;
83 | }
84 |
85 | .mytask .content .sign .currentNumber {
86 | margin: auto 15rpx;
87 | margin-bottom: 20rpx;
88 | margin-top: 20rpx;
89 | }
90 |
91 |
92 | .mytask .content image{
93 | width: 50rpx;
94 | height: 50rpx;
95 | margin-bottom: 20rpx;
96 | margin-top: 15rpx;
97 | }
98 |
99 | .mytask .right{
100 | display: flex;
101 | flex-direction: column;
102 | justify-content: center;
103 | position: relative;
104 | right: 10rpx;
105 | margin-top: 10rpx;
106 | }
107 |
108 | .mytask .right text{
109 | font-family: "华文行楷";
110 | width: 100rpx;
111 | height: 100rpx;
112 | margin-left: 60rpx;
113 | margin-bottom: 10rpx;
114 | border-radius: 50%;
115 | background-color: #fff;
116 | font-size: 50rpx;
117 | text-align: center;
118 | display: flex;
119 | flex-direction: column;
120 | justify-content: center;
121 | }
122 |
123 | .mytask button{
124 | position: relative;
125 | right: 10rpx;
126 | width: 200rpx;
127 | }
128 |
129 | .alltask{
130 | margin: 20rpx;
131 | padding: 20rpx;
132 | border-radius: 10px;
133 | display: flex;
134 | flex-direction: row;
135 | justify-content: space-between;
136 | }
137 |
138 | .alltask .content{
139 | width: 450rpx;
140 | display: flex;
141 | flex-direction: column;
142 | justify-content: center;
143 | padding: 10rpx;
144 | background-size: 180rpx;
145 | background-repeat: no-repeat;
146 | /* 让背景图片在右边显示 */
147 | background-position-x: right;
148 | }
149 |
150 | .alltask .content .sign{
151 | display: flex;
152 | }
153 |
154 | .alltask .content .name{
155 | width: 400rpx;
156 | margin-top: 20rpx;
157 | margin-bottom: 20rpx;
158 | }
159 |
160 | .alltask .content .sign .signNumber{
161 | margin: auto 15rpx;
162 | margin-top: 20rpx;
163 | margin-bottom: 20rpx;
164 | }
165 |
166 | .alltask .content .sign .currentNumber{
167 | margin: auto 15rpx;
168 | margin-top: 20rpx;
169 | margin-bottom: 20rpx;
170 | }
171 |
172 | .alltask .content .sign .number{
173 | margin: auto 15rpx;
174 | margin-top: 20rpx;
175 | margin-bottom: 20rpx;
176 | }
177 |
178 | .alltask .content image{
179 | width: 50rpx;
180 | height: 50rpx;
181 | margin-bottom: 20rpx;
182 | margin-top: 15rpx;
183 | }
184 |
185 | .alltask .right{
186 | display: flex;
187 | margin-right: 50rpx;
188 | flex-direction: column;
189 | justify-content: center;
190 | position: relative;
191 | right: 10rpx;
192 | }
193 |
194 | .alltask .right text{
195 | font-family: "华文行楷";
196 | font-size: 60rpx;
197 | width: 120rpx;
198 | height: 120rpx;
199 | margin-left: 60rpx;
200 | border-radius: 50%;
201 | background-color: #fff;
202 | text-align: center;
203 | display: flex;
204 | flex-direction: column;
205 | justify-content: center;
206 | }
--------------------------------------------------------------------------------
/pages/Suggest/Suggest.js:
--------------------------------------------------------------------------------
1 | // pages/Suggest/Suggest.js
2 | // 建议页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | suggest:'',
11 | phold:'对小程序有什么建议和反馈都可以写下来啊...'
12 |
13 | },
14 |
15 | /**
16 | * 生命周期函数--监听页面加载
17 | */
18 | onLoad: function (options) {
19 |
20 | },
21 |
22 | /**
23 | * 生命周期函数--监听页面初次渲染完成
24 | */
25 | onReady: function () {
26 |
27 | },
28 |
29 | /**
30 | * 生命周期函数--监听页面显示
31 | */
32 | onShow: function () {
33 |
34 | },
35 |
36 | /**
37 | * 生命周期函数--监听页面隐藏
38 | */
39 | onHide: function () {
40 |
41 | },
42 |
43 | /**
44 | * 生命周期函数--监听页面卸载
45 | */
46 | onUnload: function () {
47 |
48 | },
49 |
50 | /**
51 | * 页面相关事件处理函数--监听用户下拉动作
52 | */
53 | onPullDownRefresh: function () {
54 |
55 | },
56 |
57 | /**
58 | * 页面上拉触底事件的处理函数
59 | */
60 | onReachBottom: function () {
61 |
62 | },
63 |
64 | /**
65 | * 用户点击右上角分享
66 | */
67 | onShareAppMessage: function () {
68 |
69 | },
70 |
71 | //获取输入的建议
72 | onGetContent: function (e) {
73 | this.setData({ suggest: e.detail.value });
74 | },
75 |
76 | onSubmit: function(){
77 | var currentUser = Bmob.User.current();
78 | var that = this;
79 | //判断所有输入框不为空
80 | if (that.data.suggest != '') {
81 | var Suggest = Bmob.Object.extend("suggest");
82 | var suggest = new Suggest();
83 | suggest.set("content", that.data.suggest);
84 | suggest.set("name", currentUser.get('realname'));
85 | //添加数据,第一个入口参数是null
86 | suggest.save(null, {
87 | success: function (result) {
88 | wx.showToast({
89 | title: '提交成功',
90 | duration: 2000
91 | })
92 | },
93 | error: function (result, error) {
94 | wx.showModal({
95 | title: '提示',
96 | content: '建议提交失败'
97 | })
98 | }
99 | });
100 | } else {
101 | wx.showModal({
102 | title: '提示',
103 | content: '请把内容填写完整'
104 | })
105 | }
106 |
107 | }
108 | })
--------------------------------------------------------------------------------
/pages/Suggest/Suggest.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "意见反馈"
3 | }
--------------------------------------------------------------------------------
/pages/Suggest/Suggest.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/pages/Suggest/Suggest.wxss:
--------------------------------------------------------------------------------
1 | /* pages/Suggest/Suggest.wxss */
2 | /* 建议页面 */
3 | .container{
4 | margin-top: 50rpx;
5 | }
6 |
7 | textarea{
8 | padding: 20rpx;
9 | width: 600rpx;
10 | height: 400rpx;
11 | border-radius: 10px;
12 | background-color: #acd;
13 | }
14 |
15 | button{
16 | width: 500rpx;
17 | text-align: center;
18 | margin: 50rpx;
19 | font-size: 34rpx;
20 | }
--------------------------------------------------------------------------------
/pages/TaskDetail/TaskDetail.js:
--------------------------------------------------------------------------------
1 | // pages/TaskDetail/TaskDetail.js
2 | // 任务详情页面
3 | var util = require('../../utils/util.js');
4 | var Bmob = require('../../utils/bmob.js');
5 | Page({
6 |
7 | /**
8 | * 页面的初始数据
9 | */
10 | data: {
11 | objectId: '',//当前活动的id
12 | currentId: '',//当前报名信息的id
13 | enroll: false,
14 | color: '',
15 | totalScore: 0,
16 | name: '',
17 | begin_time: '',
18 | end_time: '',
19 | days: 0,
20 | signUp: false,//打卡状态
21 | signs: [],//签到数组
22 | signNumber: [],
23 | currentNumber: 0,
24 | totalnumber: 0,
25 | index: 0,
26 | complete: false
27 | },
28 |
29 | /**
30 | * 生命周期函数--监听页面加载
31 | */
32 | onLoad: function (options) {
33 | //获取当前任务的objectId和报名情况
34 | this.setData({ objectId: options.objectId });
35 | this.setData({ enroll: Boolean(options.enroll) });
36 | },
37 |
38 | /**
39 | * 生命周期函数--监听页面初次渲染完成
40 | */
41 | onReady: function () {
42 |
43 | },
44 |
45 | /**
46 | * 生命周期函数--监听页面显示
47 | */
48 | onShow: function () {
49 | this.getTaskDetails();
50 | },
51 |
52 | /**
53 | * 生命周期函数--监听页面隐藏
54 | */
55 | onHide: function () {
56 |
57 | },
58 |
59 | /**
60 | * 生命周期函数--监听页面卸载
61 | */
62 | onUnload: function () {
63 |
64 | },
65 |
66 | /**
67 | * 页面相关事件处理函数--监听用户下拉动作
68 | */
69 | onPullDownRefresh: function () {
70 |
71 | },
72 |
73 | /**
74 | * 页面上拉触底事件的处理函数
75 | */
76 | onReachBottom: function () {
77 |
78 | },
79 |
80 | /**
81 | * 用户点击右上角分享
82 | */
83 | onShareAppMessage: function () {
84 |
85 | },
86 |
87 | //获取当前任务的详细信息
88 | getTaskDetails: function () {
89 | var that = this;
90 | var currenttime = util.formatTime2(new Date());
91 | var currentUser = Bmob.User.current();
92 | var Task = Bmob.Object.extend("task");
93 | var q = new Bmob.Query(Task);
94 | q.get(that.data.objectId, {
95 | success: function (result) {
96 | var index = that.calDate(result.get("begintime"));
97 | var currenttime = util.formatTime2(new Date());
98 | if (currenttime > result.get("endtime")) {
99 | that.setData({ complete: true });
100 | result.set("complete", true);
101 | result.save();
102 | }
103 | that.setData({
104 | totalScore: result.get("totalScore"),
105 | name: result.get("name"),
106 | begin_time: result.get("begintime"),
107 | end_time: result.get("endtime"),
108 | days: result.get("days"),
109 | signNumber: result.get("signNumber"),
110 | currentNumber: result.get("currentNumber"),
111 | totalnumber: result.get("number"),
112 | color: result.get("color"),
113 | index: index
114 | });
115 |
116 | },
117 | error: function (object, error) {
118 | // 查询失败
119 | }
120 | });
121 |
122 | //获取当前用户的报名打卡状态
123 | var Task_User = Bmob.Object.extend("task_user");
124 | var q = new Bmob.Query(Task_User);
125 | q.equalTo("realname", currentUser.get("realname"));
126 | q.equalTo("activityid", that.data.objectId);
127 | // 查询所有数据
128 | q.find({
129 | success: function (results) {
130 | for (var i = 0; i < results.length; i++) {
131 | var object = results[i];
132 | //当前用户报名打卡状态
133 | that.setData({
134 | enroll: object.get("enroll"),
135 | currentId: object.id
136 | });
137 | var index = that.calDate(object.get("begintime"));
138 | if (!that.data.complete) {
139 | if (object.get("signUp")[index].isSign == '今日未打卡') {
140 | that.setData({ signUp: false });
141 | } else {
142 | that.setData({ signUp: true });
143 | }
144 | }
145 | }
146 | },
147 | error: function (object, error) {
148 | // 查询失败
149 | }
150 | });
151 | },
152 |
153 | //计算当前日期与设定起始日期之间的间隔
154 | calDate: function (begintime) {
155 | var that = this;
156 | //获取系统当前时间年月日
157 | var date = new Date();
158 | var currenttime = util.formatTime2(date);
159 | var begin = new Date(begintime.replace(/-/g, "/"));
160 | var end = new Date(currenttime.replace(/-/g, "/"));
161 | var days = end.getTime() - begin.getTime();
162 | var day = parseInt(days / (1000 * 60 * 60 * 24));
163 | return day;
164 | },
165 |
166 | //打卡函数
167 | onSign: function () {
168 | var that = this;
169 | //更改页面是否打卡数据
170 | that.setData({ signUp: true });
171 | //更改页面今日任务签到人数
172 | that.data.signNumber[that.data.index].count += 1;
173 | that.setData({ signNumber: that.data.signNumber });
174 | //更改页面任务总积分
175 | that.data.totalScore += 1;
176 | that.setData({ totalScore: that.data.totalScore });
177 | //必须包装在函数中在调用才可以更新数据成功
178 | //that.onSetScore(index);
179 | //修改task表
180 | var Task = Bmob.Object.extend("task");
181 | var query = new Bmob.Query(Task);
182 | query.get(that.data.objectId, {
183 | success: function (result) {
184 | //修改当前任务的总积分
185 | result.set("totalScore", that.data.totalScore);
186 | //更改后台signNumber数组数据
187 | result.set("signNumber", that.data.signNumber);
188 | result.save();
189 | },
190 | error: function (object, error) {
191 |
192 | }
193 | });
194 | //修改task_user表
195 | var Task_User = Bmob.Object.extend("task_user");
196 | var q = new Bmob.Query(Task_User);
197 | q.get(that.data.currentId, {
198 | success: function (result) {
199 | //修改当前任务的个人积分
200 | var score = result.get('score') + 1;
201 | result.set("score", score);
202 | //更改后台signUp数组数据
203 | var signs = result.get("signUp");
204 | signs[that.data.index].isSign = "今日已打卡";
205 | result.set("signUp", signs);
206 | result.save();
207 | wx.showToast({
208 | title: '打卡成功',
209 | duration: 2000
210 | })
211 | if (that.data.days - 1 == that.data.index) {
212 | result.set("complete", true);
213 | result.save();
214 | setTimeout(function () {
215 | wx.showModal({
216 | title: '提示',
217 | content: '恭喜你,该任务已全部完成'
218 | })
219 | }, 2000);
220 | }
221 | },
222 | error: function (object, error) {
223 | }
224 | });
225 | },
226 |
227 | //退出任务函数
228 | onExit: function () {
229 | var that = this;
230 | wx.showModal({
231 | title: '提示',
232 | content: '是否退出本任务',
233 | success: function (res) {
234 | //点击确定删除
235 | if (res.confirm) {
236 | that.onChangeTaskDetails();
237 | //修改task_user表数据,删除当前数据
238 | setTimeout(function () {
239 | var Task_User = Bmob.Object.extend("task_user");
240 | var query = new Bmob.Query(Task_User);
241 | query.get(that.data.currentId, {
242 | success: function (object) {
243 | //调用删除其他数据方法
244 | object.destroy({
245 | success: function (deleteObject) {
246 | that.setData({ enroll: false });
247 | wx.showToast({
248 | title: '退出成功',
249 | duration: 2000
250 | });
251 | },
252 | error: function (object, error) {
253 | wx.showModal({
254 | title: '提示',
255 | content: '退出任务失败'
256 | })
257 | }
258 | });
259 | },
260 | error: function (object, error) {
261 | }
262 | });
263 | //修改task表
264 | var Task = Bmob.Object.extend("task");
265 | var query = new Bmob.Query(Task);
266 | query.get(that.data.objectId, {
267 | success: function (result) {
268 | //修改task表的当前报名人数
269 | result.set("currentNumber", that.data.currentNumber);
270 | //修改当前任务的总积分
271 | result.set("totalScore", that.data.totalScore);
272 | //更改后台signNumber数组数据
273 | result.set("signNumber", that.data.signNumber);
274 | result.save();
275 | },
276 | error: function (object, error) {
277 |
278 | }
279 | });
280 |
281 | }, 100)
282 |
283 | }
284 | }
285 | });
286 | },
287 |
288 | //修改任务信息,删去修改总积分、今日签到人数、当前报名人数
289 | onChangeTaskDetails: function () {
290 | var that = this;
291 | var count = 0;
292 | //计算当前用户该活动已签到的天数
293 | var Task_User = Bmob.Object.extend("task_user");
294 | var query = new Bmob.Query(Task_User);
295 | query.get(that.data.currentId, {
296 | success: function (result) {
297 | var arr = result.get("signUp");
298 | for (var i = 0; i < arr.length; i++) {
299 | if (arr[i].isSign == '今日已打卡') {
300 | count++;
301 | }
302 | }
303 | console.log(count);
304 | if (that.data.signUp) {
305 | //更改页面今日任务签到人数
306 | that.data.signNumber[that.data.index].count -= 1;
307 | that.setData({ signNumber: that.data.signNumber });
308 | }
309 | //更改页面任务报名人数
310 | that.data.currentNumber -= 1;
311 | that.setData({ currentNumber: that.data.currentNumber });
312 | //更改页面任务总积分
313 | that.data.totalScore -= count;
314 | that.setData({ totalScore: that.data.totalScore });
315 | },
316 | error: function (object, error) {
317 |
318 | }
319 | });
320 | },
321 |
322 | //加入按钮
323 | onJoin: function () {
324 | var that = this;
325 | var count = 0;
326 | var currentUser = Bmob.User.current();
327 | that.data.currentNumber += 1;
328 | that.setData({ currentNumber: that.data.currentNumber });
329 | that.setData({ signUp: false });
330 | //修改task表的当前报名人数
331 | var Task = Bmob.Object.extend("task");
332 | var query = new Bmob.Query(Task);
333 | query.get(that.data.objectId, {
334 | success: function (result) {
335 | result.set("currentNumber", that.data.currentNumber);
336 | result.save();
337 | },
338 | error: function (object, error) {
339 |
340 | }
341 | });
342 | //设置签到数组,截止时间到当前日期的天数
343 | var limit = that.data.days - that.data.index;
344 | //删去signUp数组
345 | that.setData({ signs: [] });
346 | for (var i = -1 * that.data.index; i < limit; i++) {
347 | var obj = {
348 | date: util.addDay(i),
349 | isSign: "今日未打卡"
350 | };
351 | that.data.signs.push(obj);
352 | }
353 | //更新报名状态
354 | that.setData({ enroll: true });
355 | var Task_User = Bmob.Object.extend("task_user");
356 | var tu = new Task_User();
357 | tu.set("taskname", that.data.name);
358 | tu.set("begintime", that.data.begin_time);
359 | tu.set("endtime", that.data.end_time);
360 | tu.set("realname", currentUser.get("realname"));
361 | tu.set("campus", currentUser.get("campus"));
362 | tu.set("department", currentUser.get("department"));
363 | tu.set("signUp", that.data.signs);
364 | tu.set("enroll", true);
365 | tu.set("complete", false);
366 | tu.set("score", 0);
367 | tu.set("activityid", that.data.objectId);
368 | //添加数据,第一个入口参数是null
369 | tu.save(null, {
370 | success: function (result) {
371 | that.setData({ currentId: result.id })
372 | wx.showToast({
373 | title: '加入成功',
374 | duration: 2000
375 | })
376 | },
377 | error: function (result, error) {
378 | console.log(error);
379 | wx.showModal({
380 | title: '提示',
381 | content: '任务加入失败'
382 | })
383 | }
384 | });
385 | },
386 |
387 | //查看打卡日历
388 | onCalendar: function () {
389 | var that = this;
390 | var id = that.data.currentId;
391 | wx.navigateTo({
392 | url: '../Calendar/Calendar?objectId=' + id
393 | })
394 | },
395 |
396 | //本任务排名
397 | onRange: function () {
398 | var that = this;
399 | var id = that.data.objectId;
400 | wx.navigateTo({
401 | url: '../TaskRange/TaskRange?objectId=' + id
402 | })
403 | }
404 | })
--------------------------------------------------------------------------------
/pages/TaskDetail/TaskDetail.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "任务详情"
3 | }
--------------------------------------------------------------------------------
/pages/TaskDetail/TaskDetail.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{totalScore}}
8 |
9 |
10 |
11 | {{name}}
12 |
13 |
14 | {{begin_time}} to
15 | {{end_time}}
16 |
17 |
18 |
19 |
20 | 任务天数:{{days}}
21 |
22 |
23 |
24 | 今日签到人数:{{signNumber[index].count}}
25 |
26 |
27 |
28 | 当前报名人数:{{currentNumber}}
29 |
30 |
31 |
32 | 任务总人数:{{totalnumber}}
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | {{totalScore}}
41 |
42 |
43 |
44 | {{name}}
45 |
46 |
47 | {{begin_time}} to
48 | {{end_time}}
49 |
50 |
51 |
52 |
53 | 任务天数:{{days}}
54 |
55 |
56 |
57 | 当前报名人数:{{currentNumber}}
58 |
59 |
60 |
61 | 任务总人数:{{totalnumber}}
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
--------------------------------------------------------------------------------
/pages/TaskDetail/TaskDetail.wxss:
--------------------------------------------------------------------------------
1 | /* pages/TaskDetail/TaskDetail.wxss */
2 | /* 任务详情页面 */
3 | .container{
4 | margin-top: -10rpx;
5 | }
6 |
7 | .details{
8 | width: 80%;
9 | margin: 30rpx;
10 | padding: 30rpx;
11 | border-radius: 20px;
12 | align-items: center;
13 | display: flex;
14 | flex-direction: column;
15 | justify-content: center;
16 | }
17 |
18 | .details .background{
19 | background-repeat: no-repeat;
20 | background-size: 350rpx;
21 | background-position-y: center;
22 | background-position-x: center;
23 | }
24 |
25 | .details .score{
26 | display: flex;
27 | flex-direction: column;
28 | justify-content: center;
29 | align-items: center;
30 | text-align: center;
31 | margin-top: -200rpx;
32 | }
33 |
34 | .details .score text{
35 | font-size: 70rpx;
36 | border-radius: 50%;
37 | width: 200rpx;
38 | height: 200rpx;
39 | font-family: "华文行楷";
40 | border: solid 10rpx #fff;
41 | display: flex;
42 | flex-direction: column;
43 | justify-content: center;
44 | text-align: center;
45 | margin-top: 50rpx;
46 | }
47 |
48 | .details .score label{
49 | margin-top: -75rpx;
50 | }
51 |
52 | .name text{
53 | font-size: 50rpx;
54 | color: #fff;
55 | text-align: center;
56 | display: flex;
57 | flex-direction: column;
58 | justify-content: center;
59 | margin-top: 40rpx;
60 | }
61 |
62 |
63 | .details .time{
64 | font-size: 34rpx;
65 | margin: 20rpx auto;
66 | }
67 |
68 | .details .text{
69 | font-size: 34rpx;
70 | }
71 |
72 | .details .text image{
73 | width: 50rpx;
74 | height: 50rpx;
75 | margin-bottom: -10rpx;
76 | margin-left: 10rpx;
77 | margin-right: 10rpx;
78 | }
79 |
80 | .panel .buttons{
81 | display: flex;
82 | }
83 |
84 | .panel .buttons button{
85 | width: 240rpx;
86 | margin: 20rpx 36rpx;
87 | text-align: center;
88 | font-size: 34rpx;
89 | }
90 |
91 | .panel button{
92 | margin: 30rpx auto;
93 | width: 550rpx;
94 | font-size: 34rpx;
95 | text-align: center;
96 | }
--------------------------------------------------------------------------------
/pages/TaskRange/TaskRange.js:
--------------------------------------------------------------------------------
1 | // pages/TaskRange/TaskRange.js
2 | //本任务的排名
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | items: [],
11 | objectId:''
12 | },
13 |
14 | /**
15 | * 生命周期函数--监听页面加载
16 | */
17 | onLoad: function (options) {
18 | //获取当前任务的objectId和报名情况
19 | this.setData({ objectId: options.objectId });
20 | this.onGetRange();
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 |
72 | //获取所有排名信息
73 | onGetRange: function () {
74 | var that = this;
75 | var Task_User = Bmob.Object.extend("task_user");
76 | var query = new Bmob.Query(Task_User);
77 | query.equalTo("activityid", that.data.objectId);
78 | query.descending("score");
79 | query.limit(10);
80 | // 查询所有数据并将数据添加到数据对象当中去
81 | query.find({
82 | success: function (results) {
83 | that.setData({ items: results });
84 | },
85 | error: function (error) {
86 | console.log("查询失败: " + error.coDe + " " + error.message);
87 | }
88 | });
89 | },
90 |
91 | })
--------------------------------------------------------------------------------
/pages/TaskRange/TaskRange.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "本任务排名"
3 | }
--------------------------------------------------------------------------------
/pages/TaskRange/TaskRange.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | {{index+1}}
23 |
24 |
25 | {{item.realname}}
26 | {{item.taskname}}
27 |
28 |
29 | {{item.score}}
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/pages/TaskRange/TaskRange.wxss:
--------------------------------------------------------------------------------
1 | /* pages/TaskRange/TaskRange.wxss */
2 | /* 本任务的排名 */
3 | .container{
4 | align-items: center;
5 | margin: 10rpx;
6 | }
7 |
8 | label{
9 | margin: 20rpx;
10 | display: flex;
11 | justify-content: center;
12 | color: red;
13 | }
14 |
15 | .range{
16 | margin: 10rpx;
17 | }
18 |
19 | label{
20 | font-size: 50rpx;
21 | }
22 |
23 | .tasks{
24 | margin: 20rpx;
25 | background-color: #acd;
26 | border-radius: 5px;
27 | padding: 30rpx;
28 | display:flex;
29 | }
30 |
31 | .tasks image{
32 | width: 100rpx;
33 | height: 100rpx;
34 | }
35 |
36 | .tasks .rank{
37 | width: 100rpx;
38 | height: 100rpx;
39 | border-radius: 50%;
40 | background-color: #1aad19;
41 | font-size: 60rpx;
42 | color: #fff;
43 | text-align: center;
44 | display: flex;
45 | flex-direction: column;
46 | justify-content: center;
47 | }
48 |
49 | .tasks .content{
50 | width: 400rpx;
51 | display: flex;
52 | flex-direction: column;
53 | justify-content: center;
54 | margin-left: 30rpx;
55 | }
56 |
57 | .tasks .content .realname{
58 | font-size: 44rpx;
59 | margin-bottom: 10rpx;
60 | }
61 |
62 | .tasks .content .name{
63 | font-size: 35rpx;
64 | margin-bottom: 10rpx;
65 | }
66 |
67 | .tasks .score{
68 | margin-top: 10rpx;
69 | }
70 |
71 | .tasks .score text{
72 | font-family: "华文行楷";
73 | font-size: 60rpx;
74 | width: 100rpx;
75 | height: 100rpx;
76 | border-radius: 50%;
77 | background-color: #fff;
78 | text-align: center;
79 | display: flex;
80 | flex-direction: column;
81 | justify-content: center;
82 | }
83 |
--------------------------------------------------------------------------------
/pages/Zone/Zone.js:
--------------------------------------------------------------------------------
1 | // pages/index/Zone.js
2 | //活动考核页面
3 | var Bmob = require('../../utils/bmob.js');
4 | Page({
5 |
6 | /**
7 | * 页面的初始数据
8 | */
9 | data: {
10 | items:[],
11 | count:0
12 | },
13 |
14 | /**
15 | * 生命周期函数--监听页面加载
16 | */
17 | onLoad: function (options) {
18 | },
19 |
20 | /**
21 | * 生命周期函数--监听页面初次渲染完成
22 | */
23 | onReady: function () {
24 | this.onGetActivities();
25 | },
26 |
27 | /**
28 | * 生命周期函数--监听页面显示
29 | */
30 | onShow: function () {
31 |
32 | },
33 |
34 | /**
35 | * 生命周期函数--监听页面隐藏
36 | */
37 | onHide: function () {
38 |
39 | },
40 |
41 | /**
42 | * 生命周期函数--监听页面卸载
43 | */
44 | onUnload: function () {
45 |
46 | },
47 |
48 | /**
49 | * 页面相关事件处理函数--监听用户下拉动作
50 | */
51 | onPullDownRefresh: function () {
52 | var that = this;
53 | wx.showNavigationBarLoading(); //在标题栏中显示加载
54 | setTimeout(function () {
55 | // complete
56 | that.onGetActivities();
57 | wx.hideNavigationBarLoading(); //完成停止加载
58 | wx.stopPullDownRefresh(); //停止下拉刷新
59 | }, 1500);
60 | },
61 |
62 | /**
63 | * 页面上拉触底事件的处理函数
64 | */
65 | onReachBottom: function () {
66 |
67 | },
68 |
69 | /**
70 | * 用户点击右上角分享
71 | */
72 | onShareAppMessage: function () {
73 |
74 | },
75 |
76 | //获取当前用户已报名的活动信息
77 | onGetActivities:function(){
78 | var that = this;
79 | var currentUser = Bmob.User.current();
80 | var Activity_User = Bmob.Object.extend("activity_user");
81 | var query = new Bmob.Query(Activity_User);
82 | query.equalTo("realname", currentUser.get("realname"));
83 | query.limit(that.data.count += 10);
84 | query.descending("activitytime");
85 | // 查询所有数据
86 | query.find({
87 | success: function (results) {
88 | that.setData({ items: results });
89 | },
90 | error: function (error) {
91 | console.log("查询失败: " + error.coDe + " " + error.message);
92 | }
93 | });
94 |
95 | },
96 |
97 | //点击活动跳转到活动详情页面
98 | onDetail:function(e){
99 | var id = e.currentTarget.dataset.id; //打印可以看到,此处已获取到了对应的id
100 | wx.navigateTo({
101 | url: '../ActivityDetail/ActivityDetail?objectId='+id+'&enroll=true'
102 | })
103 | },
104 |
105 | })
--------------------------------------------------------------------------------
/pages/Zone/Zone.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "活动考核",
3 | "enablePullDownRefresh":true,
4 | "backgroundColor": "#acd"
5 | }
--------------------------------------------------------------------------------
/pages/Zone/Zone.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | {{item.activityname}}
9 | {{item.activitytime}}
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/pages/Zone/Zone.wxss:
--------------------------------------------------------------------------------
1 | /* pages/index/Zone.wxss */
2 | /* 活动考核页面 */
3 | .container{
4 | align-items: center;
5 | margin: 10rpx;
6 | }
7 |
8 | label{
9 | margin: 20rpx;
10 | display: flex;
11 | justify-content: center;
12 | color: red;
13 | }
14 |
15 | .myActivities{
16 | margin: 10rpx;
17 | }
18 |
19 | label{
20 | font-size: 50rpx;
21 | }
22 |
23 | .activity{
24 | margin: 20rpx;
25 | padding: 20rpx;
26 | background-color: #acd;
27 | border-radius: 5px;
28 | padding-bottom: 50rpx;
29 | }
30 |
31 | .activity .name{
32 | width: 100%;
33 | margin-left: 20rpx;
34 | display: flex;
35 | }
36 |
37 | .activity .time{
38 | font-size: 30rpx;
39 | float: right;
40 | }
41 |
42 |
--------------------------------------------------------------------------------
/pages/logs/logs.js:
--------------------------------------------------------------------------------
1 | //logs.js
2 | const util = require('../../utils/util.js')
3 |
4 | Page({
5 | data: {
6 | logs: []
7 | },
8 | onLoad: function () {
9 | this.setData({
10 | logs: (wx.getStorageSync('logs') || []).map(log => {
11 | return util.formatTime(new Date(log))
12 | })
13 | })
14 | }
15 | })
16 |
--------------------------------------------------------------------------------
/pages/logs/logs.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "查看启动日志"
3 | }
--------------------------------------------------------------------------------
/pages/logs/logs.wxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{index + 1}}. {{log}}
5 |
6 |
7 |
--------------------------------------------------------------------------------
/pages/logs/logs.wxss:
--------------------------------------------------------------------------------
1 | .log-list {
2 | display: flex;
3 | flex-direction: column;
4 | padding: 40rpx;
5 | }
6 | .log-item {
7 | margin: 10rpx;
8 | }
9 |
--------------------------------------------------------------------------------
/project.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "description": "项目配置文件。",
3 | "packOptions": {
4 | "ignore": []
5 | },
6 | "setting": {
7 | "urlCheck": false,
8 | "es6": true,
9 | "postcss": true,
10 | "minified": true,
11 | "newFeature": true
12 | },
13 | "compileType": "miniprogram",
14 | "libVersion": "1.9.98",
15 | "appid": "wx0615eb8c005fe46b",
16 | "projectname": "%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F",
17 | "isGameTourist": false,
18 | "condition": {
19 | "search": {
20 | "current": -1,
21 | "list": []
22 | },
23 | "conversation": {
24 | "current": -1,
25 | "list": []
26 | },
27 | "game": {
28 | "currentL": -1,
29 | "list": []
30 | },
31 | "miniprogram": {
32 | "current": -1,
33 | "list": []
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/utils/QR.js:
--------------------------------------------------------------------------------
1 | !(function () {
2 |
3 | // alignment pattern
4 | var adelta = [
5 | 0, 11, 15, 19, 23, 27, 31,
6 | 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
7 | 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
8 | ];
9 |
10 | // version block
11 | var vpat = [
12 | 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,
13 | 0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,
14 | 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,
15 | 0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,
16 | 0x541, 0xc69
17 | ];
18 |
19 | // final format bits with mask: level << 3 | mask
20 | var fmtword = [
21 | 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, //L
22 | 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, //M
23 | 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed, //Q
24 | 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b //H
25 | ];
26 |
27 | // 4 per version: number of blocks 1,2; data width; ecc width
28 | var eccblocks = [
29 | 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
30 | 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
31 | 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
32 | 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
33 | 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
34 | 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
35 | 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
36 | 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
37 | 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
38 | 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
39 | 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
40 | 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
41 | 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
42 | 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
43 | 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
44 | 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
45 | 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
46 | 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
47 | 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
48 | 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
49 | 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
50 | 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
51 | 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
52 | 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
53 | 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
54 | 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
55 | 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
56 | 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
57 | 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
58 | 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
59 | 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
60 | 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
61 | 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
62 | 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
63 | 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
64 | 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
65 | 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
66 | 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
67 | 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
68 | 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
69 | ];
70 |
71 | // Galois field log table
72 | var glog = [
73 | 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
74 | 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
75 | 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
76 | 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
77 | 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
78 | 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
79 | 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
80 | 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
81 | 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
82 | 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
83 | 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
84 | 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
85 | 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
86 | 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
87 | 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
88 | 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
89 | ];
90 |
91 | // Galios field exponent table
92 | var gexp = [
93 | 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
94 | 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
95 | 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
96 | 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
97 | 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
98 | 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
99 | 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
100 | 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
101 | 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
102 | 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
103 | 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
104 | 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
105 | 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
106 | 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
107 | 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
108 | 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
109 | ];
110 |
111 | // Working buffers:
112 | // data input and ecc append, image working buffer, fixed part of image, run lengths for badness
113 | var strinbuf = [], eccbuf = [], qrframe = [], framask = [], rlens = [];
114 | // Control values - width is based on version, last 4 are from table.
115 | var version, width, neccblk1, neccblk2, datablkw, eccblkwid;
116 | var ecclevel = 2;
117 | // set bit to indicate cell in qrframe is immutable. symmetric around diagonal
118 | function setmask(x, y) {
119 | var bt;
120 | if (x > y) {
121 | bt = x;
122 | x = y;
123 | y = bt;
124 | }
125 | // y*y = 1+3+5...
126 | bt = y;
127 | bt *= y;
128 | bt += y;
129 | bt >>= 1;
130 | bt += x;
131 | framask[bt] = 1;
132 | }
133 |
134 | // enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
135 | function putalign(x, y) {
136 | var j;
137 |
138 | qrframe[x + width * y] = 1;
139 | for (j = -2; j < 2; j++) {
140 | qrframe[(x + j) + width * (y - 2)] = 1;
141 | qrframe[(x - 2) + width * (y + j + 1)] = 1;
142 | qrframe[(x + 2) + width * (y + j)] = 1;
143 | qrframe[(x + j + 1) + width * (y + 2)] = 1;
144 | }
145 | for (j = 0; j < 2; j++) {
146 | setmask(x - 1, y + j);
147 | setmask(x + 1, y - j);
148 | setmask(x - j, y - 1);
149 | setmask(x + j, y + 1);
150 | }
151 | }
152 |
153 | //========================================================================
154 | // Reed Solomon error correction
155 | // exponentiation mod N
156 | function modnn(x) {
157 | while (x >= 255) {
158 | x -= 255;
159 | x = (x >> 8) + (x & 255);
160 | }
161 | return x;
162 | }
163 |
164 | var genpoly = [];
165 |
166 | // Calculate and append ECC data to data block. Block is in strinbuf, indexes to buffers given.
167 | function appendrs(data, dlen, ecbuf, eclen) {
168 | var i, j, fb;
169 |
170 | for (i = 0; i < eclen; i++)
171 | strinbuf[ecbuf + i] = 0;
172 | for (i = 0; i < dlen; i++) {
173 | fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];
174 | if (fb != 255) /* fb term is non-zero */
175 | for (j = 1; j < eclen; j++)
176 | strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];
177 | else
178 | for (j = ecbuf; j < ecbuf + eclen; j++)
179 | strinbuf[j] = strinbuf[j + 1];
180 | strinbuf[ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];
181 | }
182 | }
183 |
184 | //========================================================================
185 | // Frame data insert following the path rules
186 |
187 | // check mask - since symmetrical use half.
188 | function ismasked(x, y) {
189 | var bt;
190 | if (x > y) {
191 | bt = x;
192 | x = y;
193 | y = bt;
194 | }
195 | bt = y;
196 | bt += y * y;
197 | bt >>= 1;
198 | bt += x;
199 | return framask[bt];
200 | }
201 |
202 | //========================================================================
203 | // Apply the selected mask out of the 8.
204 | function applymask(m) {
205 | var x, y, r3x, r3y;
206 |
207 | switch (m) {
208 | case 0:
209 | for (y = 0; y < width; y++)
210 | for (x = 0; x < width; x++)
211 | if (!((x + y) & 1) && !ismasked(x, y))
212 | qrframe[x + y * width] ^= 1;
213 | break;
214 | case 1:
215 | for (y = 0; y < width; y++)
216 | for (x = 0; x < width; x++)
217 | if (!(y & 1) && !ismasked(x, y))
218 | qrframe[x + y * width] ^= 1;
219 | break;
220 | case 2:
221 | for (y = 0; y < width; y++)
222 | for (r3x = 0, x = 0; x < width; x++ , r3x++) {
223 | if (r3x == 3)
224 | r3x = 0;
225 | if (!r3x && !ismasked(x, y))
226 | qrframe[x + y * width] ^= 1;
227 | }
228 | break;
229 | case 3:
230 | for (r3y = 0, y = 0; y < width; y++ , r3y++) {
231 | if (r3y == 3)
232 | r3y = 0;
233 | for (r3x = r3y, x = 0; x < width; x++ , r3x++) {
234 | if (r3x == 3)
235 | r3x = 0;
236 | if (!r3x && !ismasked(x, y))
237 | qrframe[x + y * width] ^= 1;
238 | }
239 | }
240 | break;
241 | case 4:
242 | for (y = 0; y < width; y++)
243 | for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++ , r3x++) {
244 | if (r3x == 3) {
245 | r3x = 0;
246 | r3y = !r3y;
247 | }
248 | if (!r3y && !ismasked(x, y))
249 | qrframe[x + y * width] ^= 1;
250 | }
251 | break;
252 | case 5:
253 | for (r3y = 0, y = 0; y < width; y++ , r3y++) {
254 | if (r3y == 3)
255 | r3y = 0;
256 | for (r3x = 0, x = 0; x < width; x++ , r3x++) {
257 | if (r3x == 3)
258 | r3x = 0;
259 | if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))
260 | qrframe[x + y * width] ^= 1;
261 | }
262 | }
263 | break;
264 | case 6:
265 | for (r3y = 0, y = 0; y < width; y++ , r3y++) {
266 | if (r3y == 3)
267 | r3y = 0;
268 | for (r3x = 0, x = 0; x < width; x++ , r3x++) {
269 | if (r3x == 3)
270 | r3x = 0;
271 | if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))
272 | qrframe[x + y * width] ^= 1;
273 | }
274 | }
275 | break;
276 | case 7:
277 | for (r3y = 0, y = 0; y < width; y++ , r3y++) {
278 | if (r3y == 3)
279 | r3y = 0;
280 | for (r3x = 0, x = 0; x < width; x++ , r3x++) {
281 | if (r3x == 3)
282 | r3x = 0;
283 | if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))
284 | qrframe[x + y * width] ^= 1;
285 | }
286 | }
287 | break;
288 | }
289 | return;
290 | }
291 |
292 | // Badness coefficients.
293 | var N1 = 3, N2 = 3, N3 = 40, N4 = 10;
294 |
295 | // Using the table of the length of each run, calculate the amount of bad image
296 | // - long runs or those that look like finders; called twice, once each for X and Y
297 | function badruns(length) {
298 | var i;
299 | var runsbad = 0;
300 | for (i = 0; i <= length; i++)
301 | if (rlens[i] >= 5)
302 | runsbad += N1 + rlens[i] - 5;
303 | // BwBBBwB as in finder
304 | for (i = 3; i < length - 1; i += 2)
305 | if (rlens[i - 2] == rlens[i + 2]
306 | && rlens[i + 2] == rlens[i - 1]
307 | && rlens[i - 1] == rlens[i + 1]
308 | && rlens[i - 1] * 3 == rlens[i]
309 | // white around the black pattern? Not part of spec
310 | && (rlens[i - 3] == 0 // beginning
311 | || i + 3 > length // end
312 | || rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)
313 | )
314 | runsbad += N3;
315 | return runsbad;
316 | }
317 |
318 | // Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
319 | function badcheck() {
320 | var x, y, h, b, b1;
321 | var thisbad = 0;
322 | var bw = 0;
323 |
324 | // blocks of same color.
325 | for (y = 0; y < width - 1; y++)
326 | for (x = 0; x < width - 1; x++)
327 | if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]
328 | && qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black
329 | || !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]
330 | || qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white
331 | thisbad += N2;
332 |
333 | // X runs
334 | for (y = 0; y < width; y++) {
335 | rlens[0] = 0;
336 | for (h = b = x = 0; x < width; x++) {
337 | if ((b1 = qrframe[x + width * y]) == b)
338 | rlens[h]++;
339 | else
340 | rlens[++h] = 1;
341 | b = b1;
342 | bw += b ? 1 : -1;
343 | }
344 | thisbad += badruns(h);
345 | }
346 |
347 | // black/white imbalance
348 | if (bw < 0)
349 | bw = -bw;
350 |
351 | var big = bw;
352 | var count = 0;
353 | big += big << 2;
354 | big <<= 1;
355 | while (big > width * width)
356 | big -= width * width, count++;
357 | thisbad += count * N4;
358 |
359 | // Y runs
360 | for (x = 0; x < width; x++) {
361 | rlens[0] = 0;
362 | for (h = b = y = 0; y < width; y++) {
363 | if ((b1 = qrframe[x + width * y]) == b)
364 | rlens[h]++;
365 | else
366 | rlens[++h] = 1;
367 | b = b1;
368 | }
369 | thisbad += badruns(h);
370 | }
371 | return thisbad;
372 | }
373 |
374 | function genframe(instring) {
375 | var x, y, k, t, v, i, j, m;
376 |
377 | // find the smallest version that fits the string
378 | t = instring.length;
379 | version = 0;
380 | do {
381 | version++;
382 | k = (ecclevel - 1) * 4 + (version - 1) * 16;
383 | neccblk1 = eccblocks[k++];
384 | neccblk2 = eccblocks[k++];
385 | datablkw = eccblocks[k++];
386 | eccblkwid = eccblocks[k];
387 | k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);
388 | if (t <= k)
389 | break;
390 | } while (version < 40);
391 |
392 | // FIXME - insure that it fits insted of being truncated
393 | width = 17 + 4 * version;
394 |
395 | // allocate, clear and setup data structures
396 | v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
397 | for (t = 0; t < v; t++)
398 | eccbuf[t] = 0;
399 | strinbuf = instring.slice(0);
400 |
401 | for (t = 0; t < width * width; t++)
402 | qrframe[t] = 0;
403 |
404 | for (t = 0; t < (width * (width + 1) + 1) / 2; t++)
405 | framask[t] = 0;
406 |
407 | // insert finders - black to frame, white to mask
408 | for (t = 0; t < 3; t++) {
409 | k = 0;
410 | y = 0;
411 | if (t == 1)
412 | k = (width - 7);
413 | if (t == 2)
414 | y = (width - 7);
415 | qrframe[(y + 3) + width * (k + 3)] = 1;
416 | for (x = 0; x < 6; x++) {
417 | qrframe[(y + x) + width * k] = 1;
418 | qrframe[y + width * (k + x + 1)] = 1;
419 | qrframe[(y + 6) + width * (k + x)] = 1;
420 | qrframe[(y + x + 1) + width * (k + 6)] = 1;
421 | }
422 | for (x = 1; x < 5; x++) {
423 | setmask(y + x, k + 1);
424 | setmask(y + 1, k + x + 1);
425 | setmask(y + 5, k + x);
426 | setmask(y + x + 1, k + 5);
427 | }
428 | for (x = 2; x < 4; x++) {
429 | qrframe[(y + x) + width * (k + 2)] = 1;
430 | qrframe[(y + 2) + width * (k + x + 1)] = 1;
431 | qrframe[(y + 4) + width * (k + x)] = 1;
432 | qrframe[(y + x + 1) + width * (k + 4)] = 1;
433 | }
434 | }
435 |
436 | // alignment blocks
437 | if (version > 1) {
438 | t = adelta[version];
439 | y = width - 7;
440 | for (; ;) {
441 | x = width - 7;
442 | while (x > t - 3) {
443 | putalign(x, y);
444 | if (x < t)
445 | break;
446 | x -= t;
447 | }
448 | if (y <= t + 9)
449 | break;
450 | y -= t;
451 | putalign(6, y);
452 | putalign(y, 6);
453 | }
454 | }
455 |
456 | // single black
457 | qrframe[8 + width * (width - 8)] = 1;
458 |
459 | // timing gap - mask only
460 | for (y = 0; y < 7; y++) {
461 | setmask(7, y);
462 | setmask(width - 8, y);
463 | setmask(7, y + width - 7);
464 | }
465 | for (x = 0; x < 8; x++) {
466 | setmask(x, 7);
467 | setmask(x + width - 8, 7);
468 | setmask(x, width - 8);
469 | }
470 |
471 | // reserve mask-format area
472 | for (x = 0; x < 9; x++)
473 | setmask(x, 8);
474 | for (x = 0; x < 8; x++) {
475 | setmask(x + width - 8, 8);
476 | setmask(8, x);
477 | }
478 | for (y = 0; y < 7; y++)
479 | setmask(8, y + width - 7);
480 |
481 | // timing row/col
482 | for (x = 0; x < width - 14; x++)
483 | if (x & 1) {
484 | setmask(8 + x, 6);
485 | setmask(6, 8 + x);
486 | }
487 | else {
488 | qrframe[(8 + x) + width * 6] = 1;
489 | qrframe[6 + width * (8 + x)] = 1;
490 | }
491 |
492 | // version block
493 | if (version > 6) {
494 | t = vpat[version - 7];
495 | k = 17;
496 | for (x = 0; x < 6; x++)
497 | for (y = 0; y < 3; y++ , k--)
498 | if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {
499 | qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;
500 | qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;
501 | }
502 | else {
503 | setmask(5 - x, 2 - y + width - 11);
504 | setmask(2 - y + width - 11, 5 - x);
505 | }
506 | }
507 |
508 | // sync mask bits - only set above for white spaces, so add in black bits
509 | for (y = 0; y < width; y++)
510 | for (x = 0; x <= y; x++)
511 | if (qrframe[x + width * y])
512 | setmask(x, y);
513 |
514 | // convert string to bitstream
515 | // 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
516 | v = strinbuf.length;
517 |
518 | // string to array
519 | for (i = 0; i < v; i++)
520 | eccbuf[i] = strinbuf.charCodeAt(i);
521 | strinbuf = eccbuf.slice(0);
522 |
523 | // calculate max string length
524 | x = datablkw * (neccblk1 + neccblk2) + neccblk2;
525 | if (v >= x - 2) {
526 | v = x - 2;
527 | if (version > 9)
528 | v--;
529 | }
530 |
531 | // shift and repack to insert length prefix
532 | i = v;
533 | if (version > 9) {
534 | strinbuf[i + 2] = 0;
535 | strinbuf[i + 3] = 0;
536 | while (i--) {
537 | t = strinbuf[i];
538 | strinbuf[i + 3] |= 255 & (t << 4);
539 | strinbuf[i + 2] = t >> 4;
540 | }
541 | strinbuf[2] |= 255 & (v << 4);
542 | strinbuf[1] = v >> 4;
543 | strinbuf[0] = 0x40 | (v >> 12);
544 | }
545 | else {
546 | strinbuf[i + 1] = 0;
547 | strinbuf[i + 2] = 0;
548 | while (i--) {
549 | t = strinbuf[i];
550 | strinbuf[i + 2] |= 255 & (t << 4);
551 | strinbuf[i + 1] = t >> 4;
552 | }
553 | strinbuf[1] |= 255 & (v << 4);
554 | strinbuf[0] = 0x40 | (v >> 4);
555 | }
556 | // fill to end with pad pattern
557 | i = v + 3 - (version < 10);
558 | while (i < x) {
559 | strinbuf[i++] = 0xec;
560 | // buffer has room if (i == x) break;
561 | strinbuf[i++] = 0x11;
562 | }
563 |
564 | // calculate and append ECC
565 |
566 | // calculate generator polynomial
567 | genpoly[0] = 1;
568 | for (i = 0; i < eccblkwid; i++) {
569 | genpoly[i + 1] = 1;
570 | for (j = i; j > 0; j--)
571 | genpoly[j] = genpoly[j]
572 | ? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];
573 | genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];
574 | }
575 | for (i = 0; i <= eccblkwid; i++)
576 | genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step
577 |
578 | // append ecc to data buffer
579 | k = x;
580 | y = 0;
581 | for (i = 0; i < neccblk1; i++) {
582 | appendrs(y, datablkw, k, eccblkwid);
583 | y += datablkw;
584 | k += eccblkwid;
585 | }
586 | for (i = 0; i < neccblk2; i++) {
587 | appendrs(y, datablkw + 1, k, eccblkwid);
588 | y += datablkw + 1;
589 | k += eccblkwid;
590 | }
591 | // interleave blocks
592 | y = 0;
593 | for (i = 0; i < datablkw; i++) {
594 | for (j = 0; j < neccblk1; j++)
595 | eccbuf[y++] = strinbuf[i + j * datablkw];
596 | for (j = 0; j < neccblk2; j++)
597 | eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
598 | }
599 | for (j = 0; j < neccblk2; j++)
600 | eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
601 | for (i = 0; i < eccblkwid; i++)
602 | for (j = 0; j < neccblk1 + neccblk2; j++)
603 | eccbuf[y++] = strinbuf[x + i + j * eccblkwid];
604 | strinbuf = eccbuf;
605 |
606 | // pack bits into frame avoiding masked area.
607 | x = y = width - 1;
608 | k = v = 1; // up, minus
609 | /* inteleaved data and ecc codes */
610 | m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
611 | for (i = 0; i < m; i++) {
612 | t = strinbuf[i];
613 | for (j = 0; j < 8; j++ , t <<= 1) {
614 | if (0x80 & t)
615 | qrframe[x + width * y] = 1;
616 | do { // find next fill position
617 | if (v)
618 | x--;
619 | else {
620 | x++;
621 | if (k) {
622 | if (y != 0)
623 | y--;
624 | else {
625 | x -= 2;
626 | k = !k;
627 | if (x == 6) {
628 | x--;
629 | y = 9;
630 | }
631 | }
632 | }
633 | else {
634 | if (y != width - 1)
635 | y++;
636 | else {
637 | x -= 2;
638 | k = !k;
639 | if (x == 6) {
640 | x--;
641 | y -= 8;
642 | }
643 | }
644 | }
645 | }
646 | v = !v;
647 | } while (ismasked(x, y));
648 | }
649 | }
650 |
651 | // save pre-mask copy of frame
652 | strinbuf = qrframe.slice(0);
653 | t = 0; // best
654 | y = 30000; // demerit
655 | // for instead of while since in original arduino code
656 | // if an early mask was "good enough" it wouldn't try for a better one
657 | // since they get more complex and take longer.
658 | for (k = 0; k < 8; k++) {
659 | applymask(k); // returns black-white imbalance
660 | x = badcheck();
661 | if (x < y) { // current mask better than previous best?
662 | y = x;
663 | t = k;
664 | }
665 | if (t == 7)
666 | break; // don't increment i to a void redoing mask
667 | qrframe = strinbuf.slice(0); // reset for next pass
668 | }
669 | if (t != k) // redo best mask - none good enough, last wasn't t
670 | applymask(t);
671 |
672 | // add in final mask/ecclevel bytes
673 | y = fmtword[t + ((ecclevel - 1) << 3)];
674 | // low byte
675 | for (k = 0; k < 8; k++ , y >>= 1)
676 | if (y & 1) {
677 | qrframe[(width - 1 - k) + width * 8] = 1;
678 | if (k < 6)
679 | qrframe[8 + width * k] = 1;
680 | else
681 | qrframe[8 + width * (k + 1)] = 1;
682 | }
683 | // high byte
684 | for (k = 0; k < 7; k++ , y >>= 1)
685 | if (y & 1) {
686 | qrframe[8 + width * (width - 7 + k)] = 1;
687 | if (k)
688 | qrframe[(6 - k) + width * 8] = 1;
689 | else
690 | qrframe[7 + width * 8] = 1;
691 | }
692 | return qrframe;
693 | }
694 |
695 |
696 |
697 |
698 | var _canvas = null;
699 |
700 | var api = {
701 |
702 | get ecclevel() {
703 | return ecclevel;
704 | },
705 |
706 | set ecclevel(val) {
707 | ecclevel = val;
708 | },
709 |
710 | get size() {
711 | return _size;
712 | },
713 |
714 | set size(val) {
715 | _size = val
716 | },
717 |
718 | get canvas() {
719 | return _canvas;
720 | },
721 |
722 | set canvas(el) {
723 | _canvas = el;
724 | },
725 |
726 | getFrame: function (string) {
727 | return genframe(string);
728 | },
729 | //这里的utf16to8(str)是对Text中的字符串进行转码,让其支持中文
730 | utf16to8: function (str) {
731 | var out, i, len, c;
732 |
733 | out = "";
734 | len = str.length;
735 | for (i = 0; i < len; i++) {
736 | c = str.charCodeAt(i);
737 | if ((c >= 0x0001) && (c <= 0x007F)) {
738 | out += str.charAt(i);
739 | } else if (c > 0x07FF) {
740 | out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
741 | out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
742 | out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
743 | } else {
744 | out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
745 | out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
746 | }
747 | }
748 | return out;
749 | },
750 | /**
751 | * 新增$this参数,传入组件的this,兼容在组件中生成
752 | */
753 | draw: function (str, canvas, cavW, cavH, $this, ecc) {
754 | var that = this;
755 | ecclevel = ecc || ecclevel;
756 | canvas = canvas || _canvas;
757 | if (!canvas) {
758 | console.warn('No canvas provided to draw QR code in!')
759 | return;
760 | }
761 |
762 | var size = Math.min(cavW, cavH);
763 | str = that.utf16to8(str);//增加中文显示
764 |
765 | var frame = that.getFrame(str),
766 | // 组件中生成qrcode需要绑定this
767 | ctx = wx.createCanvasContext(canvas, $this),
768 | px = Math.round(size / (width + 8));
769 | var roundedSize = px * (width + 8),
770 | offset = Math.floor((size - roundedSize) / 2);
771 | size = roundedSize;
772 | //ctx.clearRect(0, 0, cavW, cavW);
773 | ctx.setFillStyle('#ffffff')
774 | ctx.fillRect(0, 0, cavW, cavW);
775 | ctx.setFillStyle('#000000');
776 | for (var i = 0; i < width; i++) {
777 | for (var j = 0; j < width; j++) {
778 | if (frame[j * width + i]) {
779 | ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);
780 | }
781 | }
782 | }
783 | ctx.draw();
784 | }
785 | }
786 | module.exports = { api }
787 | // exports.draw = api;
788 |
789 | })();
790 |
--------------------------------------------------------------------------------
/utils/bmobSocketIo.js:
--------------------------------------------------------------------------------
1 | const Emitter = {
2 | setup(target) {
3 | let listeners = []
4 |
5 | Object.assign(target, {
6 | on(type, handle) {
7 | if (typeof handle == 'function') {
8 | listeners.push([type, handle])
9 | }
10 | },
11 | emit(type, ...params) {
12 | listeners.forEach(
13 | ([listenType, handle]) => type == listenType && handle(...params)
14 | )
15 | },
16 | removeAllListeners() {
17 | listeners = []
18 | }
19 | })
20 | }
21 | }
22 |
23 | /**
24 | * 基于小程序 WebSocket 接口封装信道
25 | */
26 | module.exports = class BmobSocketIo {
27 | constructor(applicationId) {
28 |
29 | this.config = {
30 | host: 'wss.bmobcloud.com'
31 | }
32 | Emitter.setup((this.emitter = {}))
33 | this.applicationId = applicationId
34 | this.initialize()
35 | }
36 | handshake() {
37 | function complete(data) {
38 | if (data instanceof Error) {
39 | self.connecting = false
40 | self.onError(data.message)
41 | } else {
42 | return data.split(':')[0]
43 | }
44 | }
45 |
46 | var url = 'https://'+this.config.host+'/socket.io/1/?t=' + new Date().getTime()
47 | var dataObject = {}
48 | var data = JSON.stringify(dataObject)
49 |
50 | var method = 'GET'
51 |
52 | return new Promise((resolve, reject) => {
53 | wx.request({
54 | method: method,
55 | url: url,
56 | data: data,
57 | header: {
58 | 'content-type': 'text/plain'
59 | },
60 | success: function(res) {
61 | if (res.data && res.data.statusCode) {
62 | return resolve('request error', e)
63 | } else if (res.statusCode != 200) {
64 | return resolve('request error', e)
65 | } else {
66 | return resolve(complete(res.data))
67 | }
68 | },
69 | fail: function(e) {
70 | return resolve('request error', e)
71 | }
72 | })
73 | })
74 | }
75 | initialize() {
76 | this.handshake().then(protocol => {
77 | try {
78 | this.connect(
79 | `wss://${this.config.host}/socket.io/1/websocket/` + protocol,
80 | {}
81 | )
82 | } catch (connectError) {
83 | console.error({ connectError })
84 | throw connectError
85 | }
86 | })
87 | this.on('close', () => {
88 | console.log('连接已中断')
89 | })
90 |
91 | return new Promise((resolve, reject) => {
92 | this.on('server_pub', data => {
93 | switch (data.action) {
94 | case 'updateTable':
95 | this.onUpdateTable(data.tableName, data.data)
96 | break
97 | case 'updateRow':
98 | this.onUpdateRow(data.tableName, data.objectId, data.data)
99 | break
100 | case 'deleteTable':
101 | this.onDeleteTable(data.tableName, data.data)
102 | break
103 | case 'deleteRow':
104 | this.onDeleteRow(data.tableName, data.objectId, data.data)
105 | break
106 | }
107 | })
108 |
109 | //连接上socket.io服务器后触发的事件
110 | this.on('client_send_data', resp => {
111 | this.onInitListen()
112 | })
113 | })
114 | }
115 |
116 | onInitListen() {}
117 |
118 | connect(url, header) {
119 | // 小程序 wx.connectSocket() API header 参数无效,把会话信息附加在 URL 上
120 | const query = Object.keys(header)
121 | .map(key => `${key}=${encodeURIComponent(header[key])}`)
122 | .join('&')
123 | const seperator = url.indexOf('?') > -1 ? '&' : '?'
124 | url = [url, query].join(seperator)
125 |
126 | return new Promise((resolve, reject) => {
127 | wx.onSocketOpen(resolve)
128 | wx.onSocketError(reject)
129 | wx.onSocketMessage(packet => {
130 | try {
131 | let filter = function(str) {
132 | const { name, args } = JSON.parse(str)
133 | return { name, args }
134 | }
135 | let str = packet.data
136 | let startStr = str.slice(0,4)
137 | // 检测心跳
138 | if('2:::'===startStr){
139 | this.emit(false,true)
140 | }
141 | str = str.slice(4)
142 |
143 | // 截取后不能为空
144 | if (str == null || str == '') {
145 | return
146 | }
147 | const { name, args } = filter(str)
148 | let data = args == null ? '' : JSON.parse(args[0])
149 | this.emitter.emit(name, data)
150 | } catch (e) {
151 | console.log('Handle packet failed: ' + packet.data, e)
152 | }
153 | })
154 | wx.onSocketClose(() => this.emitter.emit('close'))
155 | wx.connectSocket({ url, header })
156 | })
157 | }
158 |
159 | on(message, handle) {
160 | this.emitter.on(message, handle)
161 | }
162 |
163 | emit(message, data) {
164 | data=data==undefined?'5:::':'2:::'
165 | message = message?JSON.stringify(message):''
166 | wx.sendSocketMessage({
167 | data: data + message
168 | })
169 | }
170 |
171 | emitData(name, data) {
172 | data = JSON.stringify(data)
173 | return { name: name, args: [data] }
174 | }
175 |
176 | //"unsub_updateTable" ,"unsub_updateRow", "unsub_deleteTable", "unsub_deleteRow"
177 | //订阅更新数据表的数据
178 | updateTable = function(tablename) {
179 | var data = {
180 | appKey: this.applicationId,
181 | tableName: tablename,
182 | objectId: '',
183 | action: 'updateTable'
184 | }
185 | data = this.emitData('client_sub', data)
186 | this.emit(data)
187 | }
188 |
189 | //取消订阅更新数据表的数据
190 | unsubUpdateTable = function(tablename) {
191 | var data = {
192 | appKey: this.applicationId,
193 | tableName: tablename,
194 | objectId: '',
195 | action: 'unsub_updateTable'
196 | }
197 | data = this.emitData('client_sub', data)
198 | this.emit(data)
199 | }
200 |
201 | //订阅行更新的数据
202 | updateRow = function(tablename, objectId) {
203 | var data = {
204 | appKey: this.applicationId,
205 | tableName: tablename,
206 | objectId: objectId,
207 | action: 'updateRow'
208 | }
209 | data = this.emitData('client_sub', data)
210 | this.emit(data)
211 | }
212 |
213 | //取消订阅行更新的数据
214 | unsubUpdateRow = function(tablename, objectId) {
215 | var data = {
216 | appKey: this.applicationId,
217 | tableName: tablename,
218 | objectId: objectId,
219 | action: 'unsub_updateRow'
220 | }
221 | data = this.emitData('client_sub', data)
222 | this.emit(data)
223 | }
224 |
225 | //订阅表删除的数据
226 | deleteTable = function(tablename) {
227 | var data = {
228 | appKey: this.applicationId,
229 | tableName: tablename,
230 | objectId: '',
231 | action: 'deleteTable'
232 | }
233 | data = this.emitData('client_sub', data)
234 | this.emit(data)
235 | }
236 |
237 | //取消订阅表删除的数据
238 | unsubDeleteTable = function(tablename) {
239 | var data = {
240 | appKey: this.applicationId,
241 | tableName: tablename,
242 | objectId: '',
243 | action: 'unsub_deleteTable'
244 | }
245 | data = this.emitData('client_sub', data)
246 | this.emit(data)
247 | }
248 |
249 | //订阅更新数据表的数据
250 | deleteRow = function(tablename, objectId) {
251 | var data = {
252 | appKey: this.applicationId,
253 | tableName: tablename,
254 | objectId: objectId,
255 | action: 'deleteRow'
256 | }
257 | data = this.emitData('client_sub', data)
258 | this.emit(data)
259 | }
260 |
261 | //订阅更新数据表的数据
262 | unsubDeleteRow = function(tablename, objectId) {
263 | var data = {
264 | appKey: this.applicationId,
265 | tableName: tablename,
266 | objectId: objectId,
267 | action: 'unsub_deleteRow'
268 | }
269 | data = this.emitData('client_sub', data)
270 | this.emit(data)
271 | }
272 |
273 | //监听服务器返回的更新数据表的数据,需要用户重写
274 | onUpdateTable = function(tablename, data) {}
275 |
276 | //监听服务器返回的更新数据表的数据,需要用户重写
277 | onUpdateRow = function(tablename, objectId, data) {}
278 |
279 | //监听服务器返回的更新数据表的数据,需要用户重写
280 | onDeleteTable = function(tablename, data) {}
281 |
282 | //监听服务器返回的更新数据表的数据,需要用户重写
283 | onDeleteRow = function(tablename, objectId, data) {}
284 | }
285 |
--------------------------------------------------------------------------------
/utils/common.js:
--------------------------------------------------------------------------------
1 | function showTip(sms, icon, fun, t) {
2 | if (!t) {
3 | t = 1000;
4 | }
5 | wx.showToast({
6 | title: sms,
7 | icon: icon,
8 | duration: t,
9 | success: fun
10 | })
11 | }
12 |
13 | function showModal(c,t,fun) {
14 | if(!t)
15 | t='提示'
16 | wx.showModal({
17 | title: t,
18 | content: c,
19 | showCancel:false,
20 | success: fun
21 | })
22 | }
23 |
24 |
25 | module.exports.showTip = showTip;
26 | module.exports.showModal = showModal;
--------------------------------------------------------------------------------
/utils/util.js:
--------------------------------------------------------------------------------
1 | const formatTime = date => {
2 | const year = date.getFullYear()
3 | const month = date.getMonth() + 1
4 | const day = date.getDate()
5 | const hour = date.getHours()
6 | const minute = date.getMinutes()
7 | const second = date.getSeconds()
8 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
9 | }
10 |
11 | const formatTime2 = date => {
12 | const year = date.getFullYear()
13 | const month = date.getMonth() + 1
14 | const day = date.getDate()
15 | return [year, month, day].map(formatNumber).join('-')
16 | }
17 |
18 | const formatTime3 = date => {
19 | const year = date.getFullYear() + 1
20 | const month = date.getMonth() + 1
21 | const day = date.getDate()
22 | return [year, month, day].map(formatNumber).join('-')
23 | }
24 |
25 | const formatNumber = n => {
26 | n = n.toString()
27 | return n[1] ? n : '0' + n
28 | }
29 |
30 | //日期的加减
31 | const addDay = data => {
32 | //下面的不是时间戳,是时间戳*1000
33 | var timestamp = Date.parse(new Date());
34 | var newTimestamp = timestamp + data * 24 * 60 * 60 * 1000;
35 | var date = new Date(newTimestamp);
36 |
37 | const year = date.getFullYear();
38 | const month = date.getMonth() + 1;
39 | const day = date.getDate();
40 |
41 | return [year, month, day].map(formatNumber).join('-');
42 | }
43 |
44 | module.exports = {
45 | formatTime: formatTime,
46 | formatTime2: formatTime2,
47 | formatTime3: formatTime3,
48 | addDay: addDay
49 | }
50 |
--------------------------------------------------------------------------------