From b7bf3bfc15708940f85bfd0bbcc18f13741bab58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= <2291200076@qq.com> Date: Fri, 17 Mar 2023 04:55:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=96=B0=E7=9A=84=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=EF=BC=8C=E8=BF=9B=E5=87=BA=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E4=BD=93=E6=B8=A9=E4=B8=8A=E6=8A=A5=E5=8A=9F=E8=83=BD=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODOs.md | 5 +- .../microservice-provider-user-8001/pom.xml | 6 + .../epp/user/controller/UserController.java | 5 +- backend/pom.xml | 7 + database/epp.sql | 543 ++++--- .../src/pages/residents/reportHistory.vue | 1 - weixin-miniprogram/.eslintrc.js | 31 + weixin-miniprogram/app.js | 23 + weixin-miniprogram/app.json | 61 + weixin-miniprogram/app.wxss | 1 + weixin-miniprogram/image/home.jpg | Bin 0 -> 28501 bytes weixin-miniprogram/image/icon/_code.png | Bin 0 -> 4081 bytes weixin-miniprogram/image/icon/_home.png | Bin 0 -> 5390 bytes weixin-miniprogram/image/icon/_person.png | Bin 0 -> 7364 bytes weixin-miniprogram/image/icon/_report.png | Bin 0 -> 14234 bytes weixin-miniprogram/image/icon/apply.png | Bin 0 -> 7540 bytes weixin-miniprogram/image/icon/code.png | Bin 0 -> 4493 bytes weixin-miniprogram/image/icon/count.png | Bin 0 -> 5533 bytes weixin-miniprogram/image/icon/danger.png | Bin 0 -> 5793 bytes weixin-miniprogram/image/icon/feedback.png | Bin 0 -> 4708 bytes weixin-miniprogram/image/icon/fk.png | Bin 0 -> 4638 bytes weixin-miniprogram/image/icon/gg.png | Bin 0 -> 6521 bytes weixin-miniprogram/image/icon/home.png | Bin 0 -> 6593 bytes .../image/icon/login-background.svg | 187 +++ weixin-miniprogram/image/icon/notice.png | Bin 0 -> 3990 bytes weixin-miniprogram/image/icon/password.png | Bin 0 -> 1292 bytes weixin-miniprogram/image/icon/person.png | Bin 0 -> 7365 bytes weixin-miniprogram/image/icon/report.png | Bin 0 -> 14611 bytes weixin-miniprogram/image/icon/updPwd.png | Bin 0 -> 4186 bytes weixin-miniprogram/image/icon/username.png | Bin 0 -> 1738 bytes weixin-miniprogram/image/icon/visitor.png | Bin 0 -> 7402 bytes .../node_modules/.package-lock.json | 12 + .../node_modules/blueimp-md5/LICENSE.txt | 20 + .../node_modules/blueimp-md5/README.md | 134 ++ .../node_modules/blueimp-md5/js/md5.js | 402 ++++++ .../node_modules/blueimp-md5/js/md5.min.js | 2 + .../blueimp-md5/js/md5.min.js.map | 1 + .../node_modules/blueimp-md5/package.json | 74 + weixin-miniprogram/package-lock.json | 17 + weixin-miniprogram/package.json | 5 + weixin-miniprogram/pages/index/index.js | 111 ++ weixin-miniprogram/pages/index/index.json | 5 + weixin-miniprogram/pages/index/index.wxml | 21 + weixin-miniprogram/pages/index/index.wxss | 1 + weixin-miniprogram/pages/index/login.js | 129 ++ weixin-miniprogram/pages/index/login.json | 4 + weixin-miniprogram/pages/index/login.wxml | 19 + weixin-miniprogram/pages/index/login.wxss | 31 + weixin-miniprogram/pages/index2/index.js | 48 + weixin-miniprogram/pages/index2/index.json | 3 + weixin-miniprogram/pages/index2/index.wxml | 23 + weixin-miniprogram/pages/index2/index.wxss | 19 + weixin-miniprogram/pages/logs/logs.js | 18 + weixin-miniprogram/pages/logs/logs.json | 4 + weixin-miniprogram/pages/logs/logs.wxml | 6 + weixin-miniprogram/pages/logs/logs.wxss | 8 + weixin-miniprogram/pages/person/person.js | 66 + weixin-miniprogram/pages/person/person.json | 4 + weixin-miniprogram/pages/person/person.wxml | 2 + weixin-miniprogram/pages/person/person.wxss | 1 + weixin-miniprogram/pages/residents/code.js | 215 +++ weixin-miniprogram/pages/residents/code.json | 5 + weixin-miniprogram/pages/residents/code.wxml | 10 + weixin-miniprogram/pages/residents/code.wxss | 37 + weixin-miniprogram/pages/residents/report.js | 291 ++++ .../pages/residents/report.json | 4 + .../pages/residents/report.wxml | 59 + .../pages/residents/report.wxss | 39 + .../pages/residents/reportHistory.js | 125 ++ .../pages/residents/reportHistory.json | 4 + .../pages/residents/reportHistory.wxml | 21 + .../pages/residents/reportHistory.wxss | 33 + weixin-miniprogram/pages/scan/entrance.js | 66 + weixin-miniprogram/pages/scan/entrance.json | 4 + weixin-miniprogram/pages/scan/entrance.wxml | 4 + weixin-miniprogram/pages/scan/entrance.wxss | 1 + weixin-miniprogram/project.config.json | 51 + .../project.private.config.json | 8 + weixin-miniprogram/sitemap.json | 7 + weixin-miniprogram/utils/const.js | 12 + .../utils/getUserGroupByRole.js | 29 + weixin-miniprogram/utils/menuList.js | 104 ++ weixin-miniprogram/utils/qrcode/index.js | 128 ++ weixin-miniprogram/utils/qrcode/qrcode.js | 1242 +++++++++++++++++ weixin-miniprogram/utils/qrcode/refer.txt | 1 + weixin-miniprogram/utils/scanQRCode.js | 25 + weixin-miniprogram/utils/spark-md5.min.js | 1 + weixin-miniprogram/utils/util.js | 27 + 88 files changed, 4337 insertions(+), 276 deletions(-) create mode 100644 weixin-miniprogram/.eslintrc.js create mode 100644 weixin-miniprogram/app.js create mode 100644 weixin-miniprogram/app.json create mode 100644 weixin-miniprogram/app.wxss create mode 100644 weixin-miniprogram/image/home.jpg create mode 100644 weixin-miniprogram/image/icon/_code.png create mode 100644 weixin-miniprogram/image/icon/_home.png create mode 100644 weixin-miniprogram/image/icon/_person.png create mode 100644 weixin-miniprogram/image/icon/_report.png create mode 100644 weixin-miniprogram/image/icon/apply.png create mode 100644 weixin-miniprogram/image/icon/code.png create mode 100644 weixin-miniprogram/image/icon/count.png create mode 100644 weixin-miniprogram/image/icon/danger.png create mode 100644 weixin-miniprogram/image/icon/feedback.png create mode 100644 weixin-miniprogram/image/icon/fk.png create mode 100644 weixin-miniprogram/image/icon/gg.png create mode 100644 weixin-miniprogram/image/icon/home.png create mode 100644 weixin-miniprogram/image/icon/login-background.svg create mode 100644 weixin-miniprogram/image/icon/notice.png create mode 100644 weixin-miniprogram/image/icon/password.png create mode 100644 weixin-miniprogram/image/icon/person.png create mode 100644 weixin-miniprogram/image/icon/report.png create mode 100644 weixin-miniprogram/image/icon/updPwd.png create mode 100644 weixin-miniprogram/image/icon/username.png create mode 100644 weixin-miniprogram/image/icon/visitor.png create mode 100644 weixin-miniprogram/node_modules/.package-lock.json create mode 100644 weixin-miniprogram/node_modules/blueimp-md5/LICENSE.txt create mode 100644 weixin-miniprogram/node_modules/blueimp-md5/README.md create mode 100644 weixin-miniprogram/node_modules/blueimp-md5/js/md5.js create mode 100644 weixin-miniprogram/node_modules/blueimp-md5/js/md5.min.js create mode 100644 weixin-miniprogram/node_modules/blueimp-md5/js/md5.min.js.map create mode 100644 weixin-miniprogram/node_modules/blueimp-md5/package.json create mode 100644 weixin-miniprogram/package-lock.json create mode 100644 weixin-miniprogram/package.json create mode 100644 weixin-miniprogram/pages/index/index.js create mode 100644 weixin-miniprogram/pages/index/index.json create mode 100644 weixin-miniprogram/pages/index/index.wxml create mode 100644 weixin-miniprogram/pages/index/index.wxss create mode 100644 weixin-miniprogram/pages/index/login.js create mode 100644 weixin-miniprogram/pages/index/login.json create mode 100644 weixin-miniprogram/pages/index/login.wxml create mode 100644 weixin-miniprogram/pages/index/login.wxss create mode 100644 weixin-miniprogram/pages/index2/index.js create mode 100644 weixin-miniprogram/pages/index2/index.json create mode 100644 weixin-miniprogram/pages/index2/index.wxml create mode 100644 weixin-miniprogram/pages/index2/index.wxss create mode 100644 weixin-miniprogram/pages/logs/logs.js create mode 100644 weixin-miniprogram/pages/logs/logs.json create mode 100644 weixin-miniprogram/pages/logs/logs.wxml create mode 100644 weixin-miniprogram/pages/logs/logs.wxss create mode 100644 weixin-miniprogram/pages/person/person.js create mode 100644 weixin-miniprogram/pages/person/person.json create mode 100644 weixin-miniprogram/pages/person/person.wxml create mode 100644 weixin-miniprogram/pages/person/person.wxss create mode 100644 weixin-miniprogram/pages/residents/code.js create mode 100644 weixin-miniprogram/pages/residents/code.json create mode 100644 weixin-miniprogram/pages/residents/code.wxml create mode 100644 weixin-miniprogram/pages/residents/code.wxss create mode 100644 weixin-miniprogram/pages/residents/report.js create mode 100644 weixin-miniprogram/pages/residents/report.json create mode 100644 weixin-miniprogram/pages/residents/report.wxml create mode 100644 weixin-miniprogram/pages/residents/report.wxss create mode 100644 weixin-miniprogram/pages/residents/reportHistory.js create mode 100644 weixin-miniprogram/pages/residents/reportHistory.json create mode 100644 weixin-miniprogram/pages/residents/reportHistory.wxml create mode 100644 weixin-miniprogram/pages/residents/reportHistory.wxss create mode 100644 weixin-miniprogram/pages/scan/entrance.js create mode 100644 weixin-miniprogram/pages/scan/entrance.json create mode 100644 weixin-miniprogram/pages/scan/entrance.wxml create mode 100644 weixin-miniprogram/pages/scan/entrance.wxss create mode 100644 weixin-miniprogram/project.config.json create mode 100644 weixin-miniprogram/project.private.config.json create mode 100644 weixin-miniprogram/sitemap.json create mode 100644 weixin-miniprogram/utils/const.js create mode 100644 weixin-miniprogram/utils/getUserGroupByRole.js create mode 100644 weixin-miniprogram/utils/menuList.js create mode 100644 weixin-miniprogram/utils/qrcode/index.js create mode 100644 weixin-miniprogram/utils/qrcode/qrcode.js create mode 100644 weixin-miniprogram/utils/qrcode/refer.txt create mode 100644 weixin-miniprogram/utils/scanQRCode.js create mode 100644 weixin-miniprogram/utils/spark-md5.min.js create mode 100644 weixin-miniprogram/utils/util.js diff --git a/TODOs.md b/TODOs.md index 0f837a0..a206a19 100644 --- a/TODOs.md +++ b/TODOs.md @@ -1,8 +1,11 @@ -启动 Nacos +# 启动 Nacos E: cd E:\nacos\bin startup.cmd -m standalone +# 内网穿透 +cd E:\Project\毕业设计\epp\intranet-penetration\bin +rathole.exe ../conf/client.toml ----- Nacos CPU 跑满问题 我提的 GitHub issue diff --git a/backend/microservice-provider-user-8001/pom.xml b/backend/microservice-provider-user-8001/pom.xml index b11dff7..bfa0d1d 100644 --- a/backend/microservice-provider-user-8001/pom.xml +++ b/backend/microservice-provider-user-8001/pom.xml @@ -82,6 +82,12 @@ spring-cloud-starter-alibaba-nacos-discovery + + + commons-codec + commons-codec + + diff --git a/backend/microservice-provider-user-8001/src/main/java/com/cxyxiaomo/epp/user/controller/UserController.java b/backend/microservice-provider-user-8001/src/main/java/com/cxyxiaomo/epp/user/controller/UserController.java index f6c1498..fa29739 100644 --- a/backend/microservice-provider-user-8001/src/main/java/com/cxyxiaomo/epp/user/controller/UserController.java +++ b/backend/microservice-provider-user-8001/src/main/java/com/cxyxiaomo/epp/user/controller/UserController.java @@ -4,6 +4,7 @@ import com.cxyxiaomo.epp.common.pojo.User; import com.cxyxiaomo.epp.common.response.Res; import com.cxyxiaomo.epp.common.vo.UserVO; import com.cxyxiaomo.epp.user.service.UserServiceImpl; +import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; @@ -32,8 +33,8 @@ public class UserController { public Res login(@RequestParam("username") String username, @RequestParam("password") String password) { User user = userService.getUserByUsername(username); if (user != null) { - String passwordHash = user.getPassword(); - if (passwordHash.equals(password)) { + String passwordHash = DigestUtils.sha512Hex(password); + if (passwordHash.equals(user.getPassword())) { HashMap map = new HashMap<>(); map.put("userInfo", UserVO.convertFrom(user)); return Res.success(map); diff --git a/backend/pom.xml b/backend/pom.xml index f39cca6..4aa923a 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -158,6 +158,13 @@ ${jackson.version} + + + commons-codec + commons-codec + 1.15 + + diff --git a/database/epp.sql b/database/epp.sql index 6d518bf..d08f81f 100644 --- a/database/epp.sql +++ b/database/epp.sql @@ -1,272 +1,271 @@ -/* - Navicat Premium Data Transfer - - Source Server : localhost MySQL 8.0 - Source Server Type : MySQL - Source Server Version : 80012 - Source Host : localhost:3306 - Source Schema : epp - - Target Server Type : MySQL - Target Server Version : 80012 - File Encoding : 65001 - - Date: 15/03/2023 15:55:32 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for apply1 --- ---------------------------- -DROP TABLE IF EXISTS `apply1`; -CREATE TABLE `apply1` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `stu_id` int(11) NULL DEFAULT NULL COMMENT '用户id', - `issue` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申请事由', - `transport` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '出行方式', - `place` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目的地', - `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间', - `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间', - `state` int(11) NULL DEFAULT 0 COMMENT '状态(0:审批中,1:通过,2:驳回)', - `reason` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驳回原因', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of apply1 --- ---------------------------- -INSERT INTO `apply1` VALUES (1, 1, '11', '飞机', '33', '2022-02-15 11:20:00', '2022-02-15 13:20:00', 2, '格式错误'); -INSERT INTO `apply1` VALUES (2, 2, '333', '大巴', '333', '2022-02-15 11:51:00', '2022-02-15 13:51:00', 1, ''); -INSERT INTO `apply1` VALUES (3, 2, '333', '大巴', '333', '2022-02-15 11:51:00', '2022-02-15 13:51:00', 2, '格式错误'); -INSERT INTO `apply1` VALUES (4, 2, '1', '动车', '2', '2022-03-12 13:45:00', '2022-03-12 15:45:00', 1, ''); -INSERT INTO `apply1` VALUES (5, 2, '11', '飞机', '22', '2022-03-12 20:29:00', '2022-03-12 22:29:00', 1, ''); -INSERT INTO `apply1` VALUES (6, 1, '123', '飞机', '123', '2022-03-19 13:37:00', '2022-03-19 15:37:00', 1, ''); -INSERT INTO `apply1` VALUES (9, 10, '1', '飞机', '1', '2022-06-15 10:41:00', '2022-06-15 12:41:00', 1, ''); -INSERT INTO `apply1` VALUES (10, 12, '1', '飞机', '1', '2022-06-15 10:53:00', '2022-06-15 12:53:00', 2, '格式错误'); -INSERT INTO `apply1` VALUES (11, 2, '1', '飞机', '1', '2022-10-23 16:17:00', '2022-10-23 18:17:00', 1, ''); -INSERT INTO `apply1` VALUES (12, 13, '1', '飞机', '1', '2022-10-26 19:25:00', '2022-10-26 21:25:00', 1, ''); - --- ---------------------------- --- Table structure for count1 --- ---------------------------- -DROP TABLE IF EXISTS `count1`; -CREATE TABLE `count1` ( - `date` date NOT NULL COMMENT '日期', - `time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间', - `in_num` int(11) NULL DEFAULT NULL COMMENT '入校人数', - `out_num` int(11) NULL DEFAULT NULL COMMENT '出校人数', - PRIMARY KEY (`date`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of count1 --- ---------------------------- - --- ---------------------------- --- Table structure for feedback1 --- ---------------------------- -DROP TABLE IF EXISTS `feedback1`; -CREATE TABLE `feedback1` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '反馈标题', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '反馈内容', - `time` datetime NULL DEFAULT NULL COMMENT '反馈时间', - `user_id` int(11) NULL DEFAULT NULL COMMENT '反馈用户id', - `reply` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '回复', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of feedback1 --- ---------------------------- -INSERT INTO `feedback1` VALUES (1, '111', '222', '2022-02-14 10:18:29', 1, '22'); -INSERT INTO `feedback1` VALUES (2, '111', '222', '2022-02-14 10:20:05', 1, '33'); -INSERT INTO `feedback1` VALUES (3, '22', '33', '2022-02-14 10:20:29', 1, 'no'); -INSERT INTO `feedback1` VALUES (4, '``', '11', '2022-02-14 10:22:12', 1, '111'); -INSERT INTO `feedback1` VALUES (5, '123', '123456', '2022-03-28 19:34:04', 2, NULL); - --- ---------------------------- --- Table structure for goods --- ---------------------------- -DROP TABLE IF EXISTS `goods`; -CREATE TABLE `goods` ( - `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, - `goods_name` varchar(127) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品名称', - `category_id` int(11) NULL DEFAULT 0 COMMENT '商品所属类目ID', - `brand` int(11) NULL DEFAULT 0 COMMENT '商品品牌', - `gallery` varchar(1023) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品宣传图片列表,采用JSON数组格式', - `brief` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品简介', - `is_on_sale` tinyint(1) NULL DEFAULT 1 COMMENT '是否上架', - `sort_order` smallint(4) NULL DEFAULT 100 COMMENT '排序', - `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品页面商品图片', - `type` tinyint(1) NULL DEFAULT 0 COMMENT '商品类型', - `unit` varchar(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '’件‘' COMMENT '商品单位,例如件、盒', - `counter_price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '专柜价格', - `retail_price` decimal(10, 2) NULL DEFAULT 100000.00 COMMENT '零售价格', - `detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '商品详细介绍,是富文本格式', - `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除 0为正常 1为删除', - PRIMARY KEY (`id`) USING BTREE, - INDEX `category_id`(`category_id`) USING BTREE, - INDEX `brand_id`(`brand`) USING BTREE, - INDEX `sort_order`(`sort_order`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '商品基本信息表' ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of goods --- ---------------------------- -INSERT INTO `goods` VALUES (1, '口罩', 0, 0, NULL, NULL, 1, 100, NULL, 0, '’件‘', 0.00, 100000.00, NULL, 0); - --- ---------------------------- --- Table structure for goods_category --- ---------------------------- -DROP TABLE IF EXISTS `goods_category`; -CREATE TABLE `goods_category` ( - `id` int(11) NOT NULL, - `category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品分类名', - `order` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '排序', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of goods_category --- ---------------------------- - --- ---------------------------- --- Table structure for notice1 --- ---------------------------- -DROP TABLE IF EXISTS `notice1`; -CREATE TABLE `notice1` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', - `time` date NULL DEFAULT NULL COMMENT '时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of notice1 --- ---------------------------- -INSERT INTO `notice1` VALUES (1, '请各位学生戴好口罩', NULL, '2022-03-15'); -INSERT INTO `notice1` VALUES (2, '请各位学生不要随意出入校门', NULL, '2022-03-15'); -INSERT INTO `notice1` VALUES (7, '11', '22', '2022-03-22'); -INSERT INTO `notice1` VALUES (8, '22', '22', '2022-04-14'); -INSERT INTO `notice1` VALUES (9, '33', '33', '2022-04-14'); - --- ---------------------------- --- Table structure for report --- ---------------------------- -DROP TABLE IF EXISTS `report`; -CREATE TABLE `report` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `user_id` int(11) NULL DEFAULT NULL COMMENT '用户id', - `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', - `time` datetime NULL DEFAULT NULL COMMENT '填报时间', - `temperature` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体温是否正常', - `address` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 58 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of report --- ---------------------------- -INSERT INTO `report` VALUES (53, 1, '管理员 密码root', '2022-12-26 20:35:38', '1', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)'); -INSERT INTO `report` VALUES (55, 1, '管理员 密码root', '2022-12-27 21:03:24', '0', '湖北省武汉市洪山区文治街508号南湖雅园F栋2-104号'); -INSERT INTO `report` VALUES (57, 1, '管理员 密码root', '2022-12-28 21:47:57', '0', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)'); -INSERT INTO `report` VALUES (58, 1, '管理员 密码root', '2022-12-29 18:20:00', '1', '湖北省武汉市洪山区鲁磨路209号'); - --- ---------------------------- --- Table structure for setting --- ---------------------------- -DROP TABLE IF EXISTS `setting`; -CREATE TABLE `setting` ( - `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间或失效时间(具体根据key来判断)', - UNIQUE INDEX `key`(`key`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; - --- ---------------------------- --- Records of setting --- ---------------------------- -INSERT INTO `setting` VALUES ('wechat_access_token', '66_sC2-1ygooBWjbLaEz2-or6IGqFs76UvUnRIpxXo_rJqw2BS45J_X128_xks1ekQPvF6LK22AcfA6d7OmcBWeulrRhUFNO3MPaog-_u-TqJxQ6XoRUPN9iUWR0Y8HQWiAGAUDJ', '2023-03-07 01:19:44'); - --- ---------------------------- --- Table structure for user --- ---------------------------- -DROP TABLE IF EXISTS `user`; -CREATE TABLE `user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名', - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码', - `realname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名', - `id_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号', - `phone_number` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号', - `role` int(11) NOT NULL COMMENT '角色 (0-超级管理员 1-工作人员 2-社区居民_房主 3-社区居民_家庭成员 4-社区居民_租客 5-访客)', - `building_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门栋号+单元号', - `doorplate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门牌号', - `permission` int(11) NOT NULL DEFAULT 0 COMMENT '进出权限 (0-无 1-继承(普通居民) 2-永久 3-限时)', - `permission_time` datetime NULL DEFAULT NULL COMMENT '进出权限失效时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of user --- ---------------------------- -INSERT INTO `user` VALUES (1, 'root', '63a9f0ea7bb98050796b649e85481845', '管理员 密码root', '420111111111111111', NULL, 1, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (2, 'lhz', 'lhz', '廖鸿志', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (3, '21180000', '21180000', '李', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (4, '211', '211', '11', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (5, '2111', '2111', '111', NULL, NULL, 1, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (6, '222', '222', '33', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (7, '33', '33', '44', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (8, 'test', '1', 'test', NULL, NULL, 3, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (9, '123456', '123456', '123456', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (10, '211806336', '211806336', '211806336', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (11, '001', '001', '老师', NULL, NULL, 1, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (12, '002', '002', '刘鸿宇', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (13, 'z', 'zz', 'z', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (14, '111', '222', '222', NULL, NULL, 222, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (15, '222', '222', '222', NULL, NULL, 222, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (16, '222', '222', '222', NULL, NULL, 222, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (17, '111111111111', '111111111111', '111111111111', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (18, '12', '12', '12', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (19, '210602212109', '210602212109', '曾子华', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (20, 'undefined', 'undefined', '信息2121', NULL, NULL, 2, NULL, NULL, 0, NULL); -INSERT INTO `user` VALUES (21, '2', '2', '曾', NULL, NULL, 2, NULL, NULL, 0, NULL); - --- ---------------------------- --- Table structure for visitor1 --- ---------------------------- -DROP TABLE IF EXISTS `visitor1`; -CREATE TABLE `visitor1` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `time` datetime NULL DEFAULT NULL COMMENT '预约时间', - `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约用户id', - `issue` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约事由', - `meet_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '会见人姓名', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `state` int(11) NULL DEFAULT 0 COMMENT '状态(0:审批中,1:成功,2:驳回)', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of visitor1 --- ---------------------------- -INSERT INTO `visitor1` VALUES (1, '2022-03-09 09:46:50', '136', NULL, NULL, NULL, 1); -INSERT INTO `visitor1` VALUES (2, '2022-03-09 00:00:00', '1', '2', '王老师', NULL, 1); -INSERT INTO `visitor1` VALUES (3, '2022-03-13 00:00:00', '123', '123', '123', NULL, 1); -INSERT INTO `visitor1` VALUES (4, '2022-03-17 00:00:00', '183', '11', '1111', NULL, 1); -INSERT INTO `visitor1` VALUES (5, '2022-03-20 07:00:00', '15555150781', '测试', '王德发', NULL, 1); -INSERT INTO `visitor1` VALUES (6, '2022-03-20 07:00:00', '15555150782', '测试', '王德发', NULL, 1); -INSERT INTO `visitor1` VALUES (7, '2022-03-20 00:00:00', '12345', '返校', '自己', NULL, 1); -INSERT INTO `visitor1` VALUES (8, '2022-03-21 00:00:00', '1', '1', '1', NULL, 1); -INSERT INTO `visitor1` VALUES (9, '2022-03-22 00:00:00', '11', '11', '1', NULL, 1); -INSERT INTO `visitor1` VALUES (10, '2022-03-22 00:00:00', '183', '1', '123', NULL, 1); -INSERT INTO `visitor1` VALUES (11, '2022-04-20 00:00:00', '19851691582', '看吧', '哈哈', NULL, 0); -INSERT INTO `visitor1` VALUES (12, '2022-04-26 00:00:00', '18835381168', 'jin', 'zhang ', NULL, 0); -INSERT INTO `visitor1` VALUES (13, '2022-06-15 00:00:00', '18250314786', '1', '1', NULL, 1); -INSERT INTO `visitor1` VALUES (14, '2022-10-08 00:00:00', '151000', '入校', '王龙', NULL, 0); - -SET FOREIGN_KEY_CHECKS = 1; +/* + Navicat Premium Data Transfer + + Source Server : 192.168.2.29 测试库(装Nacos的Ubuntu) + Source Server Type : MySQL + Source Server Version : 80032 + Source Host : 192.168.2.29:3306 + Source Schema : epp + + Target Server Type : MySQL + Target Server Version : 80032 + File Encoding : 65001 + + Date: 17/03/2023 02:12:17 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for apply1 +-- ---------------------------- +DROP TABLE IF EXISTS `apply1`; +CREATE TABLE `apply1` ( + `id` int NOT NULL AUTO_INCREMENT, + `stu_id` int NULL DEFAULT NULL COMMENT '用户id', + `issue` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '申请事由', + `transport` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '出行方式', + `place` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '目的地', + `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间', + `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间', + `state` int NULL DEFAULT 0 COMMENT '状态(0:审批中,1:通过,2:驳回)', + `reason` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驳回原因', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of apply1 +-- ---------------------------- +INSERT INTO `apply1` VALUES (1, 1, '11', '飞机', '33', '2022-02-15 11:20:00', '2022-02-15 13:20:00', 2, '格式错误'); +INSERT INTO `apply1` VALUES (2, 2, '333', '大巴', '333', '2022-02-15 11:51:00', '2022-02-15 13:51:00', 1, ''); +INSERT INTO `apply1` VALUES (3, 2, '333', '大巴', '333', '2022-02-15 11:51:00', '2022-02-15 13:51:00', 2, '格式错误'); +INSERT INTO `apply1` VALUES (4, 2, '1', '动车', '2', '2022-03-12 13:45:00', '2022-03-12 15:45:00', 1, ''); +INSERT INTO `apply1` VALUES (5, 2, '11', '飞机', '22', '2022-03-12 20:29:00', '2022-03-12 22:29:00', 1, ''); +INSERT INTO `apply1` VALUES (6, 1, '123', '飞机', '123', '2022-03-19 13:37:00', '2022-03-19 15:37:00', 1, ''); +INSERT INTO `apply1` VALUES (9, 10, '1', '飞机', '1', '2022-06-15 10:41:00', '2022-06-15 12:41:00', 1, ''); +INSERT INTO `apply1` VALUES (10, 12, '1', '飞机', '1', '2022-06-15 10:53:00', '2022-06-15 12:53:00', 2, '格式错误'); +INSERT INTO `apply1` VALUES (11, 2, '1', '飞机', '1', '2022-10-23 16:17:00', '2022-10-23 18:17:00', 1, ''); +INSERT INTO `apply1` VALUES (12, 13, '1', '飞机', '1', '2022-10-26 19:25:00', '2022-10-26 21:25:00', 1, ''); + +-- ---------------------------- +-- Table structure for count1 +-- ---------------------------- +DROP TABLE IF EXISTS `count1`; +CREATE TABLE `count1` ( + `date` date NOT NULL COMMENT '日期', + `time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间', + `in_num` int NULL DEFAULT NULL COMMENT '入校人数', + `out_num` int NULL DEFAULT NULL COMMENT '出校人数', + PRIMARY KEY (`date`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of count1 +-- ---------------------------- + +-- ---------------------------- +-- Table structure for feedback1 +-- ---------------------------- +DROP TABLE IF EXISTS `feedback1`; +CREATE TABLE `feedback1` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '反馈标题', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '反馈内容', + `time` datetime NULL DEFAULT NULL COMMENT '反馈时间', + `user_id` int NULL DEFAULT NULL COMMENT '反馈用户id', + `reply` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '回复', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of feedback1 +-- ---------------------------- +INSERT INTO `feedback1` VALUES (1, '111', '222', '2022-02-14 10:18:29', 1, '22'); +INSERT INTO `feedback1` VALUES (2, '111', '222', '2022-02-14 10:20:05', 1, '33'); +INSERT INTO `feedback1` VALUES (3, '22', '33', '2022-02-14 10:20:29', 1, 'no'); +INSERT INTO `feedback1` VALUES (4, '``', '11', '2022-02-14 10:22:12', 1, '111'); +INSERT INTO `feedback1` VALUES (5, '123', '123456', '2022-03-28 19:34:04', 2, NULL); + +-- ---------------------------- +-- Table structure for goods +-- ---------------------------- +DROP TABLE IF EXISTS `goods`; +CREATE TABLE `goods` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `goods_name` varchar(127) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品名称', + `category_id` int NULL DEFAULT 0 COMMENT '商品所属类目ID', + `brand` int NULL DEFAULT 0 COMMENT '商品品牌', + `gallery` varchar(1023) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品宣传图片列表,采用JSON数组格式', + `brief` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品简介', + `is_on_sale` tinyint(1) NULL DEFAULT 1 COMMENT '是否上架', + `sort_order` smallint NULL DEFAULT 100 COMMENT '排序', + `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品页面商品图片', + `type` tinyint(1) NULL DEFAULT 0 COMMENT '商品类型', + `unit` varchar(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '’件‘' COMMENT '商品单位,例如件、盒', + `counter_price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '专柜价格', + `retail_price` decimal(10, 2) NULL DEFAULT 100000.00 COMMENT '零售价格', + `detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '商品详细介绍,是富文本格式', + `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除 0为正常 1为删除', + PRIMARY KEY (`id`) USING BTREE, + INDEX `category_id`(`category_id`) USING BTREE, + INDEX `brand_id`(`brand`) USING BTREE, + INDEX `sort_order`(`sort_order`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '商品基本信息表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of goods +-- ---------------------------- +INSERT INTO `goods` VALUES (1, '口罩', 0, 0, NULL, NULL, 1, 100, NULL, 0, '’件‘', 0.00, 100000.00, NULL, 0); + +-- ---------------------------- +-- Table structure for goods_category +-- ---------------------------- +DROP TABLE IF EXISTS `goods_category`; +CREATE TABLE `goods_category` ( + `id` int NOT NULL, + `category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品分类名', + `order` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of goods_category +-- ---------------------------- + +-- ---------------------------- +-- Table structure for notice1 +-- ---------------------------- +DROP TABLE IF EXISTS `notice1`; +CREATE TABLE `notice1` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容', + `time` date NULL DEFAULT NULL COMMENT '时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of notice1 +-- ---------------------------- +INSERT INTO `notice1` VALUES (1, '请各位学生戴好口罩', NULL, '2022-03-15'); +INSERT INTO `notice1` VALUES (2, '请各位学生不要随意出入校门', NULL, '2022-03-15'); +INSERT INTO `notice1` VALUES (7, '11', '22', '2022-03-22'); +INSERT INTO `notice1` VALUES (8, '22', '22', '2022-04-14'); +INSERT INTO `notice1` VALUES (9, '33', '33', '2022-04-14'); + +-- ---------------------------- +-- Table structure for report +-- ---------------------------- +DROP TABLE IF EXISTS `report`; +CREATE TABLE `report` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int NULL DEFAULT NULL COMMENT '用户id', + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `time` datetime NULL DEFAULT NULL COMMENT '填报时间', + `temperature` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体温是否正常', + `address` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 58 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of report +-- ---------------------------- +INSERT INTO `report` VALUES (53, 1, '管理员 密码root', '2022-12-26 20:35:38', '1', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)'); +INSERT INTO `report` VALUES (55, 1, '管理员 密码root', '2022-12-27 21:03:24', '0', '湖北省武汉市洪山区文治街508号南湖雅园F栋2-104号'); +INSERT INTO `report` VALUES (57, 1, '管理员 密码root', '2022-12-28 21:47:57', '0', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)'); +INSERT INTO `report` VALUES (58, 1, '管理员 密码root', '2022-12-29 18:20:00', '1', '湖北省武汉市洪山区鲁磨路209号'); + +-- ---------------------------- +-- Table structure for setting +-- ---------------------------- +DROP TABLE IF EXISTS `setting`; +CREATE TABLE `setting` ( + `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间或失效时间(具体根据key来判断)', + UNIQUE INDEX `key`(`key`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of setting +-- ---------------------------- + +-- ---------------------------- +-- Table structure for user +-- ---------------------------- +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `id` int NOT NULL AUTO_INCREMENT, + `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码', + `realname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名', + `id_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号', + `phone_number` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号', + `role` int NOT NULL COMMENT '角色 (0-超级管理员 1-工作人员 2-社区居民_房主 3-社区居民_家庭成员 4-社区居民_租客 5-访客)', + `building_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门栋号+单元号', + `doorplate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门牌号', + `permission` int NOT NULL DEFAULT 0 COMMENT '进出权限 (0-无 1-继承(普通居民) 2-永久 3-限时)', + `permission_time` datetime NULL DEFAULT NULL COMMENT '进出权限失效时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of user +-- ---------------------------- +INSERT INTO `user` VALUES (1, 'root', '99adc231b045331e514a516b4b7680f588e3823213abe901738bc3ad67b2f6fcb3c64efb93d18002588d3ccc1a49efbae1ce20cb43df36b38651f11fa75678e8', '管理员 密码root', '420111111111111111', NULL, 1, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (2, 'lhz', 'lhz', '廖鸿志', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (3, '21180000', '21180000', '李', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (4, '211', '211', '11', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (5, '2111', '2111', '111', NULL, NULL, 1, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (6, '222', '222', '33', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (7, '33', '33', '44', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (8, 'test', '1', 'test', NULL, NULL, 3, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (9, '123456', '123456', '123456', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (10, '211806336', '211806336', '211806336', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (11, '001', '001', '老师', NULL, NULL, 1, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (12, '002', '002', '刘鸿宇', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (13, 'z', 'zz', 'z', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (14, '111', '222', '222', NULL, NULL, 222, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (15, '222', '222', '222', NULL, NULL, 222, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (16, '222', '222', '222', NULL, NULL, 222, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (17, '111111111111', '111111111111', '111111111111', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (18, '12', '12', '12', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (19, '210602212109', '210602212109', '曾子华', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (20, 'undefined', 'undefined', '信息2121', NULL, NULL, 2, NULL, NULL, 0, NULL); +INSERT INTO `user` VALUES (21, '2', '2', '曾', NULL, NULL, 2, NULL, NULL, 0, NULL); + +-- ---------------------------- +-- Table structure for visitor1 +-- ---------------------------- +DROP TABLE IF EXISTS `visitor1`; +CREATE TABLE `visitor1` ( + `id` int NOT NULL AUTO_INCREMENT, + `time` datetime NULL DEFAULT NULL COMMENT '预约时间', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约用户id', + `issue` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约事由', + `meet_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '会见人姓名', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `state` int NULL DEFAULT 0 COMMENT '状态(0:审批中,1:成功,2:驳回)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of visitor1 +-- ---------------------------- +INSERT INTO `visitor1` VALUES (1, '2022-03-09 09:46:50', '136', NULL, NULL, NULL, 1); +INSERT INTO `visitor1` VALUES (2, '2022-03-09 00:00:00', '1', '2', '王老师', NULL, 1); +INSERT INTO `visitor1` VALUES (3, '2022-03-13 00:00:00', '123', '123', '123', NULL, 1); +INSERT INTO `visitor1` VALUES (4, '2022-03-17 00:00:00', '183', '11', '1111', NULL, 1); +INSERT INTO `visitor1` VALUES (5, '2022-03-20 07:00:00', '15555150781', '测试', '王德发', NULL, 1); +INSERT INTO `visitor1` VALUES (6, '2022-03-20 07:00:00', '15555150782', '测试', '王德发', NULL, 1); +INSERT INTO `visitor1` VALUES (7, '2022-03-20 00:00:00', '12345', '返校', '自己', NULL, 1); +INSERT INTO `visitor1` VALUES (8, '2022-03-21 00:00:00', '1', '1', '1', NULL, 1); +INSERT INTO `visitor1` VALUES (9, '2022-03-22 00:00:00', '11', '11', '1', NULL, 1); +INSERT INTO `visitor1` VALUES (10, '2022-03-22 00:00:00', '183', '1', '123', NULL, 1); +INSERT INTO `visitor1` VALUES (11, '2022-04-20 00:00:00', '19851691582', '看吧', '哈哈', NULL, 0); +INSERT INTO `visitor1` VALUES (12, '2022-04-26 00:00:00', '18835381168', 'jin', 'zhang ', NULL, 0); +INSERT INTO `visitor1` VALUES (13, '2022-06-15 00:00:00', '18250314786', '1', '1', NULL, 1); +INSERT INTO `visitor1` VALUES (14, '2022-10-08 00:00:00', '151000', '入校', '王龙', NULL, 0); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/miniprogram/src/pages/residents/reportHistory.vue b/miniprogram/src/pages/residents/reportHistory.vue index 54fb4a1..e7cac4a 100644 --- a/miniprogram/src/pages/residents/reportHistory.vue +++ b/miniprogram/src/pages/residents/reportHistory.vue @@ -88,7 +88,6 @@ export default { onHide() { console.log('onHide') - clearInterval(this.timeInterval) }, methods: { diff --git a/weixin-miniprogram/.eslintrc.js b/weixin-miniprogram/.eslintrc.js new file mode 100644 index 0000000..115cc02 --- /dev/null +++ b/weixin-miniprogram/.eslintrc.js @@ -0,0 +1,31 @@ +/* + * Eslint config file + * Documentation: https://eslint.org/docs/user-guide/configuring/ + * Install the Eslint extension before using this feature. + */ +module.exports = { + env: { + es6: true, + browser: true, + node: true, + }, + ecmaFeatures: { + modules: true, + }, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module', + }, + globals: { + wx: true, + App: true, + Page: true, + getCurrentPages: true, + getApp: true, + Component: true, + requirePlugin: true, + requireMiniProgram: true, + }, + // extends: 'eslint:recommended', + rules: {}, +} diff --git a/weixin-miniprogram/app.js b/weixin-miniprogram/app.js new file mode 100644 index 0000000..dc9d8bd --- /dev/null +++ b/weixin-miniprogram/app.js @@ -0,0 +1,23 @@ +// app.js +App({ + onLaunch() { + // 展示本地存储能力 + const logs = wx.getStorageSync('logs') || [] + logs.unshift(Date.now()) + wx.setStorageSync('logs', logs) + + // 登录 + wx.login({ + success: res => { + // 发送 res.code 到后台换取 openId, sessionKey, unionId + } + }) + }, + globalData: { + debugMode: true, // 是否展示调试内容 + baseUrl: true ? // Api 请求域名 不带最后的 / + "https://epp.only4.work" : + "http://localhost", + userInfo: null + } +}) diff --git a/weixin-miniprogram/app.json b/weixin-miniprogram/app.json new file mode 100644 index 0000000..f091548 --- /dev/null +++ b/weixin-miniprogram/app.json @@ -0,0 +1,61 @@ +{ + "pages": [ + "pages/index/index", + "pages/index2/index", + "pages/logs/logs", + "pages/residents/code", + "pages/residents/report", + "pages/index/login", + "pages/scan/entrance", + "pages/person/person", + "pages/residents/reportHistory" + ], + "window": { + "backgroundTextStyle": "dark", + "navigationBarBackgroundColor": "#000", + "navigationBarTitleText": "Weixin", + "navigationBarTextStyle": "white" + }, + "tabBar": { + "custom": false, + "color": "#000000", + "backgroundColor": "#fff", + "selectedColor": "#FF8966", + "list": [ + { + "pagePath": "pages/index/index", + "text": "首页", + "iconPath": "image/icon/_home.png", + "selectedIconPath": "image/icon/home.png" + }, + { + "pagePath": "pages/residents/code", + "text": "进出码", + "iconPath": "image/icon/_code.png", + "selectedIconPath": "image/icon/code.png" + }, + { + "pagePath": "pages/residents/report", + "text": "体温上报", + "iconPath": "image/icon/_report.png", + "selectedIconPath": "image/icon/report.png" + }, + { + "pagePath": "pages/person/person", + "text": "我", + "iconPath": "image/icon/_person.png", + "selectedIconPath": "image/icon/person.png" + } + ] + }, + "permission": { + "scope.userLocation": { + "desc": "你的位置信息将用于体温上报" + } + }, + "requiredPrivateInfos": [ + "chooseLocation" + ], + "style": "v2", + "sitemapLocation": "sitemap.json" +} \ No newline at end of file diff --git a/weixin-miniprogram/app.wxss b/weixin-miniprogram/app.wxss new file mode 100644 index 0000000..75f4fde --- /dev/null +++ b/weixin-miniprogram/app.wxss @@ -0,0 +1 @@ +/**app.wxss**/ diff --git a/weixin-miniprogram/image/home.jpg b/weixin-miniprogram/image/home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad08a5320f90871ec3160ef54fc8d2b5cb125548 GIT binary patch literal 28501 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 literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/_home.png b/weixin-miniprogram/image/icon/_home.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4c7737e1205dc08612bfd8babee81b2a9d8586 GIT binary patch literal 5390 zcmdT|_dgWy|2GbIh2*kFhdZ)4qeI5oXI1t%8C?p8Y}t;CgmYH1!chv9O@)kH#?c|N z$4N31ndN(*@8?hW{`CFf{eC|l@8|3NTJP86J)S8yER5LB@t>okqhmuE>s!)B(tjF| znbz0X*A~+T`anw~UAkJb;2Is>B@#*>X&rWJvk0`;-g~L9LxdtI5V&4EQwCnvHKHqvFCQcZOK)O?T;$!u`YgRUQ8=EBc9&bFiG9kzZC*3U$cx5w1Z zT0^%Y@3wDWQwm%qO9l7?1mp67)k~8IhV)J>pb(;^E*Pf5DXR^ml@M_gc-Er zsf*to#gLsKI3fLy$9Ithz~}CvMnhaI7y}jB92(T?1QC)7ywd>m5+q~wse=5ZSTOX$ z)d_wOg9Y9F`9W~8r10oQBFr%vWQmvFTNkRi63DZn`SZp znccV%mOva16mAlbQ11G4d=885$n=~*nf9pF>)PaZD zaKrJ|x!|UmoBtBJCkLxv95WD=@RRbDpmIMO1*i0Gr3qD4Ksp=>8z^H~k` z(57tXa~JR9E-~N=*$+=!z#}ygG!034tqI6{ZQjZ`abNSpBxP8#%Us^r4invoJh$ zjyd>O)xJKXMmc;DfZFzb<%4d*5R#KN^KXcbYP#8d*0q-38Hxr~o5h|LW+ zQ^>+%U9%TVy1qN-LKXlH(Z=>Z%h9s<@+v09iBPp0GhMEj7z@q=J9H(ja;mQhBHk?H zYpu1o;Cc7Qn^3LA#L&c|DoS`umuYRSb~Zo%qjoT+x0sq&JXTWC1q$ zK&Jgho$ZyJGn4Q{sPCWgZ0D{vsw1<-NO3&d#@^SSNl;gB*@3{`9FrSQ@PNSv zb#7)d2mZ*CQR9QMq6dx^&Tb8Pakg1qm0^pP{s`Vf170nO?eeU*oK($4_)X6wa0`jA zZ`g!Qh1hXxa?$q=Gvai-)nTHY83@ zI=2J!$7zt~s5-=h=vTzm;Eo8p9X#Z79`E5`c&ZAyT0@4}CaAB+9@yoc!wzfJt$LGl zoMx)r+_Z_-ZUEcJ5s)#euOam z-Q``LIDjcm+YN841mUh35PD;^B(Tf7O?@1g`ZrgTodxeQj@ws$^7hkfw;him%je*cCCB#f#6Lj2S{}T+t13jUF8AuiM`}YYfc^3Sbsx^$Kw?S&4EJ$OB;Y@(Qnl^STq{ zV_A&VwHXwIVQJ|OZ-IuD z;!yi#(%*?BgMTy|+oiVlnAJWDK4t-^c58 zBhf``ZqN0jnupufl-?7JvptUK!0JzlTdaBhCAZbh!%Ix5bt=Fv32^g*`$Ou81o?^? z`}Bog{-;*y*;)x9PK9~AEmpHVvoIm3Cz$cNM}=lEPWg1;BY)gZilxZ8JRdZBCAwCB z;k#SXfT-_gmRoZGzl(%%JYaDm&E?c`Q6S$3y_AZ!HC*6d?7GBKThSF2O4bx#0(d4v zl9GBDDufJQ3Y7VuS$W+992e$xj65qU^m*%Ss^u<`tcW~RxvgFJc(p>eT{>hGy>xNX ziQ=@BIxKVKhdLM_*{VG?2q(+4bRf*Wc=H9}JEV&*h%Q1m?$gp{yx#?aGb+X&c}YDT z$d>pku_#ek(?S*N6oGi_EUivmqWO65HS3 zhfG%*9ecmW0062&dv7|enG`|TSW$oGzpQ0eRp*I$@=IUcLJ0GVx`$@^QlV<-DWh13HM^_d zjLtai*1G}XSwy`RJGa>q&c|@Ts)6P{2&mNb$6eYx4;p&1)M4k^ZL`S%8RGmV-Q1ug zDPb)Bgm{J#IM^_Yvh!w+8)ra;t$v~D=et7SWDdBmIZ;sn#6MX+Vy^W!FL<$JyS>p6 z<@Si`YAeq()RugEgvYmwmmbJ)QwBh=M-x(aE6i~m-QDv4%*(D7xFlnFIeIFzfjdgg-<8cdr@4^4vQP~Mf5gO&JUb(yep}h&T=+Vq2`FrpLK(#0sgVjugQ%Mr9l97 z$KMg7J_b!@qYE@^2SMIHO$O>b1n)$qbFX z+z=&m-17)R9o8J{6rse_S@jw`pQ4x^ckUfRG?dFO< z5_QQlwQV-OTM^R?Aq~Jb^U%Nh&k@fO1Z!4ZiWW5lSh31I{fUHVey5g)0gCl~J#1gY z-!&~*nQ>MBf`C%DEZu5s8j8>+9GsegKzpgkPjAw^+t1%z;614MC21=xzqb7Lp@5uG zgKmHA`~}!-sauKVVEq?HRA++8TmDnuJf-=G~P$q<-)y{YDLTXGeZjB_;Z{**OEJWP&A(^*TMC&PpXb&&F0s zyaopXyJ~f|Qp>BA?EMBKo=StY163rF)rh^!t*hjvB9`cYgsXSLV&IMeK!*4jF6ZtX zrf;PRulCQHQhmk!em5EK0#ZG6`~RhZNW$X(e=5pwR#R*DpM3 zGH=0?J`bFX_>BhbO$u!Wo$x}QQ(V3}oS&>8VKa}5@3159C;xC1RlJ=5Hs|k>d{6@2 zPidAyF?rCnd36?CwQ)~ap!m3-3#n#h856Yb1ExlnohLx^AlADeREEP1r;^ba0w9g& z!R-}8LbSktb}X`=v+bhT3{P_yQmRsJ9e%B}Z*=^3!hu9{UQfk4sH6yx>w^vF_9J<& z%Fs%kf9?+t#7U1yt4?;%5Fx_*L+{eKjI?XtR)2d%p*p-jK7S(hHLEA$Kr(OHK0|>$ zPh)b0St>=CoKY3&nQw`6&0twR`hF)V4$mYSZY5l`IFU*&d_OSsTHzh${bds9p3kCP zl0^Z`S!-CNR5_($733EgD2L68%|sm45=ZqoHnjs; zGMSJ8>y;wP?!`LqvjU|R#tL$#J&nq*c<9;L!FwZO(S9pk; zbb=RWg1+m3v+mPR*%6-xWt_w2IjtT_To-)?aB0z+kT zqlJ5ZJjmY?!^7EM7LJdJ0!z#$Qa3tGVVS^hcfx?g$Bd30p3^0XjX=V&ZMdv<(pBiY z@v<@hkz+S(O5ewQ9;{)*B0A3$CY2(tC8H9w;5PI69ea_Qu%H~iK5IRDwFWT z5Y1wwvBjs?CuN6qC@|_ZU%?eWCzKJ)?0n4yB4EBURUK)l9N$A01{;$O`?AhS$nv6R z%A;eJ=%C%@2DV*2URkLcNJD)N%0bpAZ3DUU4jTt~L0g;#U7e_rKA|M*weEV>hR-0l zD2^!p;7Q_l!cJ>1`-DyRP|N4uQtN;lb09+e6kNTLyQ8W@u<_I^PHi77-5cWN5b}9a zcD;?59{+X1wvqXklmZRpb3I)uDJmOrb>O_T({y_R7A%OMCGXy4Aa0%7J5|5?f;!u? z#@OG#HCQtTf|sd~h*dMC9f1`$QSMq>W@vQPzcH^Oh!`~4AYgkePF3=H(|{ZXm$E+( zg6rZ&Fa+to%9klZW~u$bu&7~C?dNB+Ah;!NWMe%sbj<2jl?fj@t4)2AWQW`=9+DQKaMp#HcypIgCvFY;=hLC5J+atPE&zZ8kC)0id@&A*^H+d zPYa|$CVeB%_KRpXkr#F-pZ-6(gXaVO)1!=oM=Cb7!Tk|mw#44NBo1)SQa_IRN&LLT zt2E87O|GCGT3 zMTI}UH^Tm^+l2$3rG=S{K_&Fl4Kn2rE7X2ckgk+ z?yZIs;Cn-gDd!Az^wITd+X`-EIK9OyO~v;9L(#A>-Fk<@dSgEuuZtKBl#4NTEuFw_ zKK5&AR^Jtjl7P1T2|-1`eqQ2vZGc}lZbN*DAkm}H#~GdPV4JyUJg z^e3oZ$A0`uNdMpEx(m^S_TnFu4%qAsN(txwqtpo~NgB3UFo_$5`oPw@^fl$@gaEW( zpHG>FOU~XieW9!+6;K!UzL}x)sg*QiL;4Hq>6NA9SJ2YwwlOF$O%qM|!&ehRz{J`* z!14rFAL_0A_C9nefLzE7()Z}@5LpW*q?2isObADdGh#bT*CTk`gRDgz3j+cu`RAWi`4&%hPkBh)fp zk%gT_fYI--Q{?uK$Go>73>#?wXOW)f^KCmR1}8_oM|DItZ`@*V=()IQ)8m^y8Ev{8 z_ZPBHvl{7t9c#qVX%y&3+U3bz1StH;YcLA7o{4)3+-d#bZO&4;zQvE++3Y41Pjbc1 zWY}Ir+@g5Yd~JDFC&vlMyO6zCEl0o7uAJU^7pnR4mm{b24=LomPwTMFtVv<{x$A&K zWTXX;^EMpWnW`u5LC^@gcj?vNMS*o)Ahdow6OQp^;NuEmb4@Q$HQIc};^~{EP;>iI$ z=HS=vfd6IIs|@mMVBshj32@tD?kc;)ufk8S!T&n0M=2<~pmvP#B4;bx)~ITgaLFhM zV|irg^ON{kFi|^drP!86ZduX?y{^-y(SOIIc3YlIG@67<=RoTJD)Ns-lp6QPqrUYU Qjo_q18CdAo>bm0o2X{CSasU7T literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/_person.png b/weixin-miniprogram/image/icon/_person.png new file mode 100644 index 0000000000000000000000000000000000000000..956c7fc421f733311a050d790842b2ecfad0387f GIT binary patch literal 7364 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 literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/_report.png b/weixin-miniprogram/image/icon/_report.png new file mode 100644 index 0000000000000000000000000000000000000000..c61edf6a01f0c218a410eb9d879a8229b7c9d8dc GIT binary patch literal 14234 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 C)Zp6y literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/code.png b/weixin-miniprogram/image/icon/code.png new file mode 100644 index 0000000000000000000000000000000000000000..0822bcf69dada4270b42aeae9661611d94a19916 GIT binary patch literal 4493 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 HBjJAl0t5UB literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/count.png b/weixin-miniprogram/image/icon/count.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4928108cf686a5c99040832cfaff112769efa0 GIT binary patch literal 5533 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 literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/danger.png b/weixin-miniprogram/image/icon/danger.png new file mode 100644 index 0000000000000000000000000000000000000000..0626cff8e66731ef451533a0f640e9e8b0058761 GIT binary patch literal 5793 zcmcIo_g@pu*9{?rjx=eag#OTjG?5k*Fh~bMqz9GWdlM3A0YL(UA`(P8V(1+Kr3=z~ zuc0YjK%~9#`#-!t?9OLr?#!J%v*+HkH%4Fg5iJ!56#xLB)r6}V65F1C7X_Gj$D5XB z5gQV3!$%JQr30K>004`*rkd)L0IMC#U@Yg$l7MlcnRzjOdbQi!dVXnWWV{#-NrOUYX!-z@a&1T`RFRa2 zp8a;)R|*<5>_q^@zbDc*m^65ejxk>DK$zHpc`a?$8`p)T;Nx&#F{THrLC74dvF!0A z3~=d%juHrQBGrh4kQ4{e)ZvTc@yatL1sm7ytpA4Z04A~{!nzw}21mb+q?nOXnmQ0? ze-s+s_-gFTK{1LvzLstHV+^1kS|O8$)@xfoQKf1p`k^uBaBZ-gC+j*uLD=OC+RuU@ z=8_}5ND4I(+_$e&wJmjorY?%BI4=Em`Fp0Iijhv@5Nk4t=ajeva1)JO=aS|PiQXO% zN(|`~VkB-0UajuE^2wO|+uQZ#;Wr-l$8oc^2(-5iaW|;qSo@yZmn05d4+96A9`t%j zBPf6T1H+Kxj*Gbp$OBp6k$~}P`An&0qXwCNOHwPc0Sv*diw^J*=5pALmShpIT?pk3 z%GzK*;C(LA{ihiZo6#df0o&HU8|^Gm!CXZD5z(ZR!js5A4ITtqyfEnKR*VhxW)RUk zB^{_#Ckr61lwpIuCOZiD)HKM?mOC`Wg8|JB%KQw476`Bb0gJl5N@CM&o$9P8zOmrl znzxTA{rN$yLcb7snbC%^#zjz~{Y<}9LA>fl1_5xQ3kapgd`ZVD2;odSV|jp@*^3r6 z;v@(^;86QRMjZTj9ar2X3WGAB*9EGSd^rOg z0&NIm_-7|}0G03b;nHum`>$Xzu?CQTxH(YSb<}v>NM|9h()}8{Pd=p2dMsg<2ngcl zR)=uR4)_re$STV!RUgvv_Zv>4B}4i=^g25m8NMuR-qPPX!x7rqQL8%ci6R0-fYL!h zyCI3kX{O}vu-yU@ab?ixt1*W=x4Gc-Y7mYtz-%f|e;km10aaHM-bg2T@(+7&2r6& zU`oHpM9Skhxrm&MFYH=*nnX8N`iBRD#t~X#a?8DL?Y%i$RF8mn$A2tZ9vh*Y2sKcH zFa-DdHGnac*7$3h^@A~w4{@eWALohvGlNq2`Qg`c=Kj$XyX^HtmU$W0{gCnlA_fd* zJ+;14NGaZWyNx!Bf+&S_OQ4+w3o7E*t=Wl>fYd0TK9u~c4^NIToP4%VsCY1#9otzm z;F1XU{2^i>1S~Vxa0c&+6IFw7|Lu_ZDGjB$V{-v?C^>jyy>ExEq;?esQci_tdHy-s zLmR~E+?|+#-fD~fkDl6emMp>QrDyA zq7HJndncDPePc1gQ&1+8>F9&Q341II_#0V5ID_05M;6Nqh-Ez>EiIj2?=Mz(QNTmb z)izc87UW?Kx6*-zVX?W+b%9LV@z`974r|E5lao^Tul0o(dyH3W%DJ?Zwm#@C@XVr0 z9I(1gbDr$s5X3G$rgQvlk)N~2G=QN8ieG(aSm!0w-VdpSa{O5b@ph~8`L0I&ylWu zWYFow%6QSoA$O0P{HqPr%^oKz^ax0M)r2sj*Bud)qL>Y+pDXLJSYY4h>g0YC(4lhZ zbgeSYz8CUJ;Mt7#8|C*{Z%4PPK8Pek4>{Qgd3KNe6&{$@SX{AROw(m6{xB9MTN~+| zG8o?6L|!}avT)>atfw3ix)G|h(|bG^e==M11=3I2OGkekh7+ZSLLhtLa`6{xkcEZD zn#b%vbU7k!F|JA)4uBqd=}7A^patn?&A>}v)!xa{W_oas7#;St({yyh&1b zxxa3v@SE0PEru@vA-Rz2*Gek6}(de_I+#c_f;C4pW zR1J?(v(s>>F>jvA*vy2k&(2cV*)4FDO_RM~_EEmggyiSP_agt|_BvqDi5d(LG5ePs z;9s~QuTNi$0`EsZF`Ct^7i!J1 zqFvw3xt**3AF5o*k#nheqSNmkMa1U&C+=3CMf|p-qwiib$yn?Sj<#8lF~JG4NWK2@ zrbT{2W}b-hr0~(V%-vASACHXMUAtW|wNt5W6cNsZJ5aF+nR~n|ifX;`qB(nZZZ75v z_YbkBwK?4%Gv+~j=Rwa{H6=Z%_~?IfLo1cI!uJ)&aZ1lmeku9a;;l)hbXcuyICF%@ z-;<(tXk|qsVD(Nove&iIt8AB{;n>`rvuM{o^E>CuY-eh|ugLO0x@}um^9Un_LR}^3 zcX59uu~A>^Y#E+n|F1~!#d$yHCly^q!x?GJb-?mqCrzP?UB>C2u$z@dm0fsZT7$vUM6a3UfX4orkt|^GGg-Fd`fw;i zSex$?|AB-z{o{v<^p5AkTv8uYNH+xt7m5P9yK}R;5XI4%+hPGnc;!@uS~)%+2_bv4 zxw(3iv!_sJqO}|s;1uI^Wksr63YpP^{4d0McOH@_Khy2qdi$PhHuV(jyjOqE?2^4( zzx`SEO{wSQwTu*}CUmMXT)pW=ANGHn8}?hStoPIs@Y+8nmz5(v*miEZnU&l8=k_Y_ zz+D10HNgn5{!ZP{zE<%TJIXHis1{!X(CF+O-qkBIP`c8h*a=hzx!gi|)OZP_-QV;) zY;?nqoBz`|2H}Ulvs|GCNBu=tl;@WW{60plt2%koS5DNZ{U4gMh@$p$+benA`-U7d zVgqU_wS{jZuBM%2FWFB^CLJQ`-As% zL*&Qjdjy|(_GgerQHHHvGwyxfDY%vTCFARq4%vt)%EQ{4vLx$wOL~~(&4Oz1@~mb< zp?c(+8Nmw5b#q+BQsq;!(}1>IL5ssW72n_y{^GnU0_z>oI-M#uRT~Og(lWR-I&mhM z)9KYgki#!i*oEjzb+2fO*5;M`hV(Rr(R#^VJbFxs*+UkKSF$PEz98<#gzf%ZUs!%T zq5$U77rd{a?;h>MPRv+GANR#vzRcs?6AgMUo(pR8J99z0-Hn=0WE4v|$-j!!i@--Z zPmtIIC+!p}+zFbcL=+Q~)3G|e}KPg4^f#@LoQ z4r1ER@-kPY;<$vX<$)Dq?j?QH4~^68R~bKOU+&&U7_B)qu&TwEhn`gyI_6~v;hY)E zym&!Loq?|p9B5bir8FBpPWBguuBl=S+h*9R%X?{1W1r8z34IV`tKCBE#FXVX2CJIN z)r#$vdfS?|&P_}8=V(-^_y@Ws>F*NH{0xNL{h^S^aCmNSsJp3|N{or#S_;4H{;1sY ze-J1M^e=8$GlPVjRO2g-IrhGVl#Q`zN(?2y<;kOHyT=a)Rewj8hsxJn%L)nhk;aEO zey{s?K=yY6CraFpr#UV%uvNiR%=J!}bP;-y$9;Gu#NBb6dSJgq9dOyoS;A*Y5?VVT z5-52T6pfXV6$KM%eDjr$X)EXKH3lmsS$0Nv3h^W8BK3MiJk1Wx!f$Wg-?*V#F||8Q zxfvo<)GX;2cT~J=k=7mJEkwVI*H(|&8{|cpdGpK=Rjd7L+r!VjS8TSth4Bd%yv=bR zYnV2-J6mac)y@3Qn9;76Q^D)Al`w3)$<0RSm;|-`N&G-69X#Z9_fr z|AJ$D1+r~B@Cr3n`};~(Xk!GP#gTdUAEUcb(`)_Y(nEXAJyd@C{FA-isQ87?+&tD_ zIO5!#>h&~0XhLcXETF4ea?_%f-sywsbY1k3kKsUkXnwh+GFSFj>-o!lnscR*ZLQlf zcD$GjU&<-uk(dwkR|3PP9z`wQ9hgqIFYatbO7gI>dDI@hHa zEDQ(OLmMhw=joQ1Rhnuqar;tVTAs`G<9_0H-_N8FLvBhSL|LeY>gW!7I4?@7Q$nXS z^)`J9@wNZ@ufHi?4)PxvD}6#tw*RD|(>OZ=`i|iEuS2aA=Lx;9Q;UP8{b6CZH#Y^2 zzfwDnzbhpYYS!okSsg3IH$Y`L;1=3Y>52#JJE}CDT;nzpy;@UEaK)5)OYR7b?Tua} zbw?1%g}NCj@1!SM^po7Yw3oIzBxIREAy;}^l3w|ph5=*l4toF=o7`*7vqh0-(s1WT zgSq?MNqZ5Fnx=t6O890Bb%g6r2tWm$k^P5~v>m!1TwVVjJa?^~^pP24Xa&+=W3o&Z zwJO)KN3LU>vXWoijG>CyITQi}a@DUff|G2QpoRkvHBo{B^jVUw!66Rub-tS$Nsp~O zB1!1Q@`I!*@@KwN=52aMzxY+q4On$?x+f>d0A(Q3ZHKzci~fEx+zc9t(qS_tv6|G0 z?=0K26W~T+_eeHP=f86#OgaU+|Nd>2Kf)VC60hDAh0VRB(b@qnf0Ch%7%Sv|KV)L~ zHnhd{jZTqL3TN>#|EC*4=l7kPk{r_IQs(^+akW%5Kt>ebf@n0>Xqa8S#eW zn9?=n!7w*!-a~B<%s28lGErFjtaVqoZF(a8CsHh$mWkzotxXB&30{2Ld>z+u^L&J; z*cJ8UZo=pI&WYTtrKK-$f1uP8Scb#12yqgVZge^BFR5} z^$f=pd1hHRa)#_fyLA?%!x-SPw|VEZeFaYpI4a26nh8{otD&7E@wEIv%?4jF<#h0z zsnqvXqSOxr{n%;cZ;e`rg-K)B=xi}qCgM@a7c&PHlc_WqzPW`x#G5; z!7KtVOHFji4qOo-9Vges%EKB$dT0_Zvq9F+R}KpZ8kA)l-6DoossHMyT-yLgcXu+G zm*;$%^OVBt9{CSvlDU(kXvOJg|ALV%kZfCCnzc-nmZp4F_!=7=;-bev?i1jj;2MsM zjfY~q!3%(>M!49ak_LA+?6WyZX4X*-zY+pMLt2;U71CW@MpV^a&>^a0CsFNGTM?QU zU4Wxy;y-9zWxEv#$d(qEj(x_!XvzkEiz3&QS4t!@xcBL|i}|%frWXi^Gx*OF!`-^* zKHDh;qB@?VDycnKH{ZeeQZibz!7-?f{ec^H|9*L{2LtD~vO#Gx4crN1_th z>f^9goqBA%lpXKS{!F%&K=lFOEN;TDn}6uqnv(?|oP>ydt;aAfKF=P%j|PL~-fxw6 zDp1T4egf`4-DCpCwgU#a32uI7<4|BlR*L-7PIeB%;%B&S8e(*RnaViE9~w z=t^e)IOYZ~vl_8+u23m7Y>m6Qhcq8u!xXCLyTQ~l2)VTfx!c@~4$te6k&?)bYMN$G zG7o*jzd^$iSj1fIryPw{5L~*w)`LU(O5DT>2{i@Kd{*n8(Hk|^vZCd~(1zI=i-Z5f zu6Xj_WKAGxNx}wyPu;%b`HgutmDOY05kq2%qA3;fuiHsI( zJxJnb3(nJmd$ZA_(nm$UOOq1IVeA-j?tTOeWUE`oH%dbsc>!yTkd7u{K+88LX-nC_ sKuIK9j3b;x)Aiqv@Am(HEpm0kTS1K1<61w1SaSwws_UwiKCpTHe;+l-NB{r; literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/feedback.png b/weixin-miniprogram/image/icon/feedback.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f53b9f0c6e81ce359e9d2022da1e0a5dfbcbc4 GIT binary patch literal 4708 zcmeHLS6mZYzfD4npfo8VgktDOM?!B2AiW4;B!DzQ0!RlzP+F7{MM4#%*CQysNbkK! zL_nk;L_`od0g(>hobTm6-Ix1(A7=K$UbFvu_L|>X>pyWfP4yTqAuoYIAO-_{9SdL_ z{P&`T0rzsNiX317`&;N~fhs<5{{Vqlcnx&0mce#g*`al|fq?@Zp}*q6Y;g^^JpEg# z@U(JEaxvE0EgwZzPA;;A6_e70cK%7k{K|mh{w|p%EBn)lvhX%oGIy!zr^|ui1ik=1 zCXaWX?1?v8dPxNF+geYdzp@tsy`;&X+jc{s7HBCbulY9{ ztPr$*F8yoI<|}#F`9||8ZD>GaFcfw%H)TXY?VgPSgOkwsMN?_Lxd)&rVS+`i2Y<_Qg4qsmC#Pv6J6EzO0 za>clg(%ak&6C~#I#eeZk z4niSmM=lL$Nb^Vv1bMm@0}NbQS&}or#1O@x`GLNdF5FDBZk^UKBBtMTGA^MdAap>{ zJS1eMj2>I1;#9)|%9?YQDVWOkhWEnY1B@$;{@K`d$s}JMK~yl5bWtYuwM0VrV%Ml{ zDe&rGTLN3FKjmR;TJh|gIl`P1a~q)xj0pc>`6dgBIvg;QW+ANjaK@iYiWhqzY#Em! zF(G!CT725acm^BKGFXO8|BRL2&bO~1#yZJpYK8#$B#N8g{KWRX_$Na*AxjSB$!c~n zm(r>201Cf6(b(=>>t3TV-v|;bI5qQ4-`xGKn@}SQXG7X`cmN+!AN;CK7~#5v2VCHmqkF zUBEcX`q~q4S*~B+?qzhnL}7d=Po1hkD}6!gva+b%cN^#)r!b}1M1qI0ownS9vt`i+1A#K>n&&w3cq-vraMtO6QRUv0=e&r-AA^R&q~XidciG}h4;h?~F{`PQ(6 zzaN(_i?R$s-K`IqCC!=P%1C=*1aSGhsbGz53K1%!WxWIs)9IZk0_VkX|&wz@MasyYZuIOq{1*7_m^73n7%%% zv0cp29@m9s%(q?-70Y(us*`#DNe}ZAd+Vbl1PQZ;`IKm%Is1z><$jG}v=)iWz;>^w zVHDC`WWq&XeF=Fn%nB}tDr!0YrZn6=I%B*fIzl>#Gu@GqAJoEB$cPySSe3=EmcYaG z9Yi3=G%v{S9!9J7`0ijlZa$HFVrzYXg2Fnze5RXPnj>1@udZ87zrh969Rla9ViFca zntFU6R7t$544*JfH?7OZ8ghZMT~qv+k6o!alfqffNjOBs_DD=ebG7P#*y(^T*wgf- zl<>>S4f;?uV!1t%%nN1+Cdu`PPse~(cwO*m))pDM5HrMhXvR}lYVe|c)R0&NYt4mE zR2|4;h8fkD60j+?RYF=sCF6voY2XMfV1m0#!e(+vg~VjbNBO{urq+BCtN&)?>|KkV!KK>igyDq$43 zRf~7hBRabw)oq`@{W89@dv4C-;Vls@lS6MoqfgBEtA7GiZW(A`rT;_r(MK1X8u^Kn8n z$Rh2$-E>{OmkS<#wZq>UqW5N8jqth(LQE+ie#XFteiCZ#rb{7bx#Su|^xm$iST-{r zbDO6nCYBHz3R#dvg^jz3#vHl-ShM{xd^l)Uy{&)8XwpZy)+<-+!UcvTNN*l;f{meIu{R+Qg zY%{4ND9Pj7!D-&HVCHQR70V}uI#fNLfJ*&Whp3)Tbr!qQdx?Z z<>ZyM!=eI5qPU8XEo$}9=DJ|f*EQTG+!wnx?E{}L^4II?DNGTVH{;1|E8$%DZ+ee%)+B}E?-!jj=|~K+m5KfA16zl!T$1j1Nfkd zknBn1hjH&|pOvVAe7D`QtZVg0Ce!tJS_1QBt5dcz4tO{#u?9)ftlhT38CV8A3hdGm zyQ_Bo{w6~4QRF%eOJDc{``o4|n5^rRVq$Z^x(Q;gq5rqkM0RJatUD4N)#jODTPxK+Z`ad`{;v0Yj9mmc*Jye-GLI{aDp6Wzni zG0oJE@tH52c%lf*7YUD2*Z&zhE|f`sfIE%TP7nuVW6{3dMhw{-sUfr_By)Ia+j-ys z5n~Kk9R>SdkB%V;ZcveY349m5|6aC``~cTB9)>M7w6u4s%(TW5iwu%I9$lgMbYVNK zoEVSyO-K^2+)tedY~BL& zcXx95MIx)}s?>I)_vVPY8~LGG?xvX$VELKx)cbyigXWBHq!LBX-Vr}oX%P{HP7brs z0AFg5IoY{(_)JCkEfspix=fkRO9Eh?oP7m{$MQNa>vW51EZz6mr&TV3 z8CF2?ESivJ!C=+btct2_BaX#43mVt*{F5js*o?5()_lY1DPbd%zB^P}$A$h`Uof*SbVE1}ofVFt*wU;W_B`@n5mDAJW`UgqBX)Ly*qyL_z7;b9MVp^|#&%2|z?( zI-K~SvDZ!9!DSet_K8OeDjEq9U zGQr$`UvB#Tn?E5d2a)x^iWKx07_!GE3*(^L^mCCHcj8Xh%h7f__>-zVTPnVy6W}{mOMaaa))Y7BVa>EPp$0l&{0r#`^H!C zA{e6c6RmfZZ=nQo#ft0BJJvjGjRxQJ=i5Mry+f6IGz}o}xy+lJVnE1!dyt{F2_WB@ z#qI^Bf*2-lpBU!^0?28R-lJy22-pv?FyV0(Fj8=n)#=GyAq+8qT{GD=8}xtK2EB06 z!K_Az9J|PK5$ATX*5am#QYOlw>!2YJE z3Za4_B=41aD*=J{?@wOse*A>e`2A)~9XRHFf%`-aD1rHE$mCiMaLUJ5YOz-#=vXFo zcYia0>(kgTc}!qrZwzmJ6F~K9SnmT$42WSxJ7IPnVA@a9Nnu?(0!Gc(^ZW%6-E>u! z>o*^Uct9ys*avu?Pe^At0$QHO>*krE0L{PjMqy8YCg=al|IguvjH4WVI3k!3@@;`@ z?KSROxI!yfVka-{`pU#(wtzNH?rZ_`ua31=$D*={gntR=PPU3|H7nb@81KZX0|~vZ zZ`Fz<@4i@Gp8;F6?7He!Gh*)pSyeJ}-6eW67x;F|9VL479Tb5i2ndj4#QjVi>LSed z1K)jEDfBOG-?xrwKu#W)f8m0l`>BHw_h*WR=b*d!gN@6mj=I$^fz{}~UxmHUbWi`f zB&!r$AYp%A=cv}BzswHgMU|@s_Gq0N(}LhZndxhzgQ%flxMrxq0S`-`f3{e`8*jSx z?h6-}6?~#LO4qOXY>>0%dA$ap8hhj$`d!UgFra@h;C7j`az7yZ8`V7hC>?h~J0Gjh` zcVX!hFr6|_35BR|(_^bxI=O-rg)HI9tFz`iN|s|m{c6eP zIeZX)@Aqf*GxaBory+uFKzk#lM2nb%E_-rzf3P@;!OSsj{feEKMX`498yW6?M7QBe z!i5J+=ZrD`(DuLQ5h>h1X&%e4!!Hh@&O1ukvo80QnX(V72}X2v(WpLw%zig~^Nnn6MZ^MdK`jeY$_iZ=@+lHX&6 zjcXcz^Tvj8MrpTvg!-?gM6AF{`&8^*%PYX=q##3gBQ&E{a&MADtM{KX4GrG4nN1xHTxdW#o89=){is%krZ)c` znzT6?g8yqr?&tA*g0u6d20KFGSJ;mWqVE!+Dm8I8Mg=LG(1Xhpo2<^Ko`40^u}gDo z|7#MJX5_v1|GEaQ)wcCBAUACq*y$x4Fk?gYquK%b^!o^k54QnkJo`raLIKQrbsMEwVbHJfDs literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/fk.png b/weixin-miniprogram/image/icon/fk.png new file mode 100644 index 0000000000000000000000000000000000000000..00449066976244b4aa241acdf061ed014fad0d77 GIT binary patch literal 4638 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 literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/home.png b/weixin-miniprogram/image/icon/home.png new file mode 100644 index 0000000000000000000000000000000000000000..5190acb80abfd033f947749b1adb3c795e43a023 GIT binary patch literal 6593 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/weixin-miniprogram/image/icon/notice.png b/weixin-miniprogram/image/icon/notice.png new file mode 100644 index 0000000000000000000000000000000000000000..3d5c13e4e19b5e061d2fedea98c81e453ed087c1 GIT binary patch literal 3990 zcmb_fXH-+&(oRAmAyPuIy@H+~V(1Ej6v0H0-i(MK0V5(PMF_o#5K%xuKrr+Uh7QtO zXd)oJyb4k^D1wn5kSh0hzjg2Z^{sV(+#hH5+B47WJ!|i0&&&xkHq_!m{e^-+AY3}y z8U%3c{PQ6XfU?M}I29bAZUn8%km5eUc?g8ZSVseI;%&8%;ulW5F4WP~^vRPA%j2V6 z2y~tTo)wuH2Mb(&Dr@ZJ}-11Za#Q8+c2KjM8yL^%vp!am)TmOBYWy^K6=hqxR_ftL*u zZPj1`A}25Op@Ja@4x6mn9)CDiTkS#eAtV&V*Qx22u!S^^@}E$YK!dobh*{Y+-gIEA zhHMIeIN*5i-Puz({3>~-5C`IL3W?o4T7i_WGwtR<=yV{+@qAoDB;>ycpc=5fubLPh z=Pnvpg1>748HafDQqDjpP)=4-E2~<*#||LozfJbmR`H&*YJ(xWAf9GMJ>obSYRwzK zF0a)n3wSauT+Q{vcuVnoj>l(OwWT@BGf!c|+0Xw7S2kc-VXk2DA){;R=*N!*?N^nU zoI1&-ZhcZe&!Y&VMdaal(el^0ox?brfQ~~+iWY}+^pyL=j3EfI0o$4fSJ)-oGRAyW zDpNAX`qNJi-?iE<%(%F8PM~e)aE&uAW>r78V#=`htQEb(>Iyb=g`Y5i6Ux=U!m*a& zn^`H1h|`l#agv%QpGA;4C$y9-U59K(OCPDZf6W??DBMUl!&I_>0(rrw*U%xQ4`YY2 zWshe{DS5gPnmW{0a{xobh#ld&3V(?1sWg3|pB2go^0TCOvU~$~X+MKM6dZxLy0+)p zg3fY+3D(r+_;K}{C4X5Y81zSJ;$@o|#%JKJlP9bTI2(6%EP;!Z+|$0)Yuh735C80Az8iN zpP!|DC@mnMt9MEsze>sIJqS^1bGmEVeFY>;E7jqp=pZkeh=hFWWz%{zzQeJhK3@}i z#t`wW+$|eXZ^?Pdm7s#s2{6-1}%(#V2jm62kg8jL~bIVxc~-r}#k05@@@4 z%{dH|z9{R|yy~`O%00rCq)D3A{_?Qwe%XZ$SvpW#N*=0#>vPCf1v2^rQ!$n8y~XdZp-0;M=&4-zDI0|w z43>2qQY=(&4D)xH1TtOG-2VRLAzc*XnLF0Q@!$}{?4{BB)@@bkC<6LOta|>J%jnKZ zzL7|B&?`z!x*&n;45cEl_>%^s`&Ly1l`<+Sc(YLg5AV>G--~u?5NK2QGO%jN0V86` zzIFear*H^+=@Qd!AD2PAF;J}Vx1)SM7dD*YG?N2VafDEp^wE}L+_jYf}4D@Y%?tQjk{Np9~z;-pSqSy54rwQn_x&Qa@G`uJcqU5@u1&>wX$v?47 za;%28&F}nsFI{wtI>CT8)~<(lQ}HrStq&N+bV|N zSDc?0~$-nZ=CBaWhahIGpM;+#q*Q)N9!*kctys9C?USvpM%R3 z*C-Q+L5b|KnhEySOk|lDT;d^wWbhWQ%x@!ZlBS{aoAUZ%c*OS7t6^#1UYC#r1`4BH zaK|9C1Nt*6&yQRBL{KtCz!_8GWg>zvhA+R$q*&i_;!6jdC|!#BFw-H}r)a{<{*mm19GV^b!Tz+#H{LFV%^Ni3v5{a8_}y8~#JuQ=7B zY^DUyzwjT8Gu(k-1rLo$8vI!zT8a{A>wU_^`5=Yu>hjvf+mXiTJJ>UvLn1d};Xdb= zgXI*PRlqmxdC)!AUog=X6Ie81YFkMJi-@$Nkin3f(IhPA`g4qIbrxV)WfVvmwYzAA zFqm~@i@jN$B?xW)^eAzqnju}NkAL>&zOPlqX%kw8mK2te>8`w#qxu(nZXb#uj1)M5fzasY*wh~nLnnwQIMs>bsnNzOp_!scn#jJmAM!;eIp4H3(mYLJ}h=bMkq`xi-It%Rgz zYSop~HXXu- z_mm^g#iZ*Qj&UB}s1~_zndN9B>X9t)4waX~ZeH}|Y{S_mdu#h%gwNEM0zR52k2N<* z**M`D->mw2o8a(xlCW!z3Gds%yaTW!$|nE@}U*>QH|gqq3G&6|$ZT6uolb z<6^^B8npB^U$zVhuhz(_E~S^bzw>6Lr&UUc&$?ojI_g{*f>;YPRO4}Ej37;ABdrZ6GJ#P9tA3HyE^Vh_*gOi z{z50&8ijJFEK3)D`g}Cjh0|o?2`T1+IQGPoP7h|DL=W?qjq{l=XeFMUTL?tWcH6wn8igP~rQsdGAmu!pdCF9Fl>X)n9bmkh-_VZ7z{75VM@K#=%(p|3HQ)96%yZEz8N@#`Kj*Gi{4}bPt(gr$j z{E1!;lDq^4BZ#To?r-?jasb`VAVg6C5HkCi zzYC69-7aZb3#-XU-VA4E16j@P0E3?_cOn)2^jcIUMdT{;X-h)tg_KD9wFW4YN&}o5 zDJB^0-NncW5%QjKlWOU<8BD;Y2++%7yV@$#a3WH)k9uXEuSB(U(*nG#N=mYvorAu( z>i2d3SeCZ=Xic93kE9{KU4`w(`l1!xg3;c1G3}jj^NlEv4fUAZb&>qu6z7<(^LZa0 zEj36VERKU9e3F3jU$E^(58nsg3tt4hsMZ2Df;SU2reUP5+F4&N6MKSQT36Y9LFNkx z!kouJD4aXk+9-FCqa`&^f8NEx>S^ag;|X@oX_=K(2bG=~_inIC-)#_E@vBIsD>w?9h13wFe^q;{_hP}I=mPRF7YxDpjA*I3VC9JM%g$7S0)Vt kDek|1zw!GYhOqqTmF;f?o4Y0s{LzN!Trt!rzD%P016N~KhX4Qo literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/password.png b/weixin-miniprogram/image/icon/password.png new file mode 100644 index 0000000000000000000000000000000000000000..2eed77e39500d0bde86c9b8a9dca9691c7de46cd GIT binary patch literal 1292 zcmeAS@N?(olHy`uVBq!ia0vp^5r5%(GQ`zk9!uLS~AsQn;zFfp39xYDT62(s|s5su(?)1Hb_`sNdc^+B->UA;;0DU00rm#qErP_Ju}^8Lt_gCb4xu# zQ%egY6CDL314A=?1515F6I}yCD+5a_149KUPy*Ukl#*r@_=yk-Y7nC4!3xGDeq!wkCrKY$Q<>xAZJ#LkW z+b!le&4cPq!R;0coO<}%WQgLg`)$`gci89AO-kckH#BtG|6Rk>`K`B?dX2-brZLz$ev2BaFdHT~Q4!N3t zm?x>Y<|uwzykp0S#uF!56O$kPz4Cp-l$mo)&u@==`z7b|-!Fe=%yh7kGmlv%lKjF= z_ESN-txodom(Lb>f98xy=HlIPbZ3jphF0Gxslo>Bkv2&Zsw><#pIIfU{o;_|sy!?# zR3(qwNp0+SzUBY^f}Xk~0ga|JZ}uDMp8jPU)>#^}P}pDZbVXA+k5Yr|c1a&4@xVP2 zGq3XarJm=S%jCnO(CMuFImp|rm+6ZotI0x+)otHzIdIAPF>d`-J<;{R>^ITAzY;jE zModbcuKalSvH!1v&FmL3iCs{8{XTqUobIaaQHu=po_757{F=jm%IKw*aYlxoKI7hs z1GZHqEGkb_!}}^_8CTk`tL2tB)ZUR+HF>)5lquKC_r?5{Tky*CZRT~Mg65>TjD~a1 zJ6_|TwRYov*-4WHr>&o~{%qlbG=nbV`RPgC=O^YfvN5FddM;je=wKYEeDZYlb6Mw< G&;$UismiGU literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/person.png b/weixin-miniprogram/image/icon/person.png new file mode 100644 index 0000000000000000000000000000000000000000..79da453e04b45c2d4c4f529059789d7d097178ef GIT binary patch literal 7365 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

`puPzQmkNsd+4NWtqMVIy zCV^5_WARz2&^K{#ykF8Le)=qU3hDCOrwE++Qbqv_#CN`Ua^xm<%N{{1tphASBkb>~ zunrPPyP0lqZm9+Gv$UiF6S4$B!SA0DcK0|A1r0LjvtN)i9~GfaUZOE40_NRE#pjh~ zeg!rm!eXHs=_zmh3Uz?GjA0}yO$52x5QJG7YmESQEPg8;s9&Lvtx4k#ea(Ox$!jOa zc&!=89OUDloQ<}jHuG~>A6t{=smhj3b3f&y$pdea$$Kybs_CR8MD+k^{0kW8l%)42 z|5jtkouzdsQ#byw!@BtKb99OBfly4Wr;TJBRO^CmIdcpeX}WQ5Q7s=^i5ac?>{;^z*^L7;<5P}pF|C0kDhJNKwW9urz0QzqYm%! zyIKM^eovj1obMKpJV^-v%aB&UE|Bye?Hk}D3x-eK2F)B*TBYE#ZH1uHv`Zq9;6d<- zWyaF5YPDw>F3}D=rZ0my8vT^K%Np{SbYo$addSR5OyOoO=*Bvo8qB?JV z!k*q6F=kzOg(O_dk`^OD6fh?lTkN&}FGlxLDX-mJtU@kCP<=^&g4{dVsyAlA{|6Lr But5L- literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/report.png b/weixin-miniprogram/image/icon/report.png new file mode 100644 index 0000000000000000000000000000000000000000..5f09c6b1a0126042cd5c8a8e61dd03de0a0fcc74 GIT binary patch literal 14611 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 literal 0 HcmV?d00001 diff --git a/weixin-miniprogram/image/icon/updPwd.png b/weixin-miniprogram/image/icon/updPwd.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e02f0622fd175cce45122d1a9df58ef28502db GIT binary patch literal 4186 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 +``` + +In your application code, calculate the +([hex](https://en.wikipedia.org/wiki/Hexadecimal)-encoded) +[MD5](https://en.wikipedia.org/wiki/MD5) hash of a string by calling the **md5** +method with the string as argument: + +```js +var hash = md5('value') // "2063c1608d6e0baf80249c42e2be5804" +``` + +### Server-side + +The following is an example how to use the JavaScript MD5 module on the +server-side with [Node.js](https://nodejs.org/). + +Install the **blueimp-md5** package with [NPM](https://www.npmjs.org/): + +```sh +npm install blueimp-md5 +``` + +Add a file **server.js** with the following content: + +```js +require('http') + .createServer(function (req, res) { + // The md5 module exports the md5() function: + var md5 = require('./md5'), + // Use the following version if you installed the package with npm: + // var md5 = require("blueimp-md5"), + url = require('url'), + query = url.parse(req.url).query + res.writeHead(200, { 'Content-Type': 'text/plain' }) + // Calculate and print the MD5 hash of the url query: + res.end(md5(query)) + }) + .listen(8080, 'localhost') +console.log('Server running at http://localhost:8080/') +``` + +Run the application with the following command: + +```sh +node server.js +``` + +## Requirements + +The JavaScript MD5 script has zero dependencies. + +## API + +Calculate the ([hex](https://en.wikipedia.org/wiki/Hexadecimal)-encoded) +[MD5](https://en.wikipedia.org/wiki/MD5) hash of a given string value: + +```js +var hash = md5('value') // "2063c1608d6e0baf80249c42e2be5804" +``` + +Calculate the ([hex](https://en.wikipedia.org/wiki/Hexadecimal)-encoded) +[HMAC](https://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and +key: + +```js +var hash = md5('value', 'key') // "01433efd5f16327ea4b31144572c67f6" +``` + +Calculate the raw [MD5](https://en.wikipedia.org/wiki/MD5) hash of a given +string value: + +```js +var hash = md5('value', null, true) +``` + +Calculate the raw [HMAC](https://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given +string value and key: + +```js +var hash = md5('value', 'key', true) +``` + +## Tests + +The JavaScript MD5 project comes with +[Unit Tests](https://en.wikipedia.org/wiki/Unit_testing). +There are two different ways to run the tests: + +- Open test/index.html in your browser or +- run `npm test` in the Terminal in the root path of the repository package. + +The first one tests the browser integration, the second one the +[Node.js](https://nodejs.org/) integration. + +## License + +The JavaScript MD5 script is released under the +[MIT license](https://opensource.org/licenses/MIT). diff --git a/weixin-miniprogram/node_modules/blueimp-md5/js/md5.js b/weixin-miniprogram/node_modules/blueimp-md5/js/md5.js new file mode 100644 index 0000000..67cebfc --- /dev/null +++ b/weixin-miniprogram/node_modules/blueimp-md5/js/md5.js @@ -0,0 +1,402 @@ +/* + * JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* global define */ + +/* eslint-disable strict */ + +;(function ($) { + 'use strict' + + /** + * Add integers, wrapping at 2^32. + * This uses 16-bit operations internally to work around bugs in interpreters. + * + * @param {number} x First integer + * @param {number} y Second integer + * @returns {number} Sum + */ + function safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff) + var msw = (x >> 16) + (y >> 16) + (lsw >> 16) + return (msw << 16) | (lsw & 0xffff) + } + + /** + * Bitwise rotate a 32-bit number to the left. + * + * @param {number} num 32-bit number + * @param {number} cnt Rotation count + * @returns {number} Rotated number + */ + function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)) + } + + /** + * Basic operation the algorithm uses. + * + * @param {number} q q + * @param {number} a a + * @param {number} b b + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | (~b & d), a, b, x, s, t) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & ~d), a, b, x, s, t) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t) + } + + /** + * Calculate the MD5 of an array of little-endian words, and a bit length. + * + * @param {Array} x Array of little-endian words + * @param {number} len Bit length + * @returns {Array} MD5 Array + */ + function binlMD5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32 + x[(((len + 64) >>> 9) << 4) + 14] = len + + var i + var olda + var oldb + var oldc + var oldd + var a = 1732584193 + var b = -271733879 + var c = -1732584194 + var d = 271733878 + + for (i = 0; i < x.length; i += 16) { + olda = a + oldb = b + oldc = c + oldd = d + + a = md5ff(a, b, c, d, x[i], 7, -680876936) + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586) + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819) + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330) + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897) + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426) + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341) + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983) + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416) + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417) + c = md5ff(c, d, a, b, x[i + 10], 17, -42063) + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162) + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682) + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101) + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290) + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329) + + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510) + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632) + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713) + b = md5gg(b, c, d, a, x[i], 20, -373897302) + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691) + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083) + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335) + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848) + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438) + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690) + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961) + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501) + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467) + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784) + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473) + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734) + + a = md5hh(a, b, c, d, x[i + 5], 4, -378558) + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463) + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562) + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556) + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060) + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353) + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632) + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640) + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174) + d = md5hh(d, a, b, c, x[i], 11, -358537222) + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979) + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189) + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487) + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835) + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520) + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651) + + a = md5ii(a, b, c, d, x[i], 6, -198630844) + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415) + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905) + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055) + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571) + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606) + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523) + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799) + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359) + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744) + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380) + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649) + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070) + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379) + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259) + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551) + + a = safeAdd(a, olda) + b = safeAdd(b, oldb) + c = safeAdd(c, oldc) + d = safeAdd(d, oldd) + } + return [a, b, c, d] + } + + /** + * Convert an array of little-endian words to a string + * + * @param {Array} input MD5 Array + * @returns {string} MD5 string + */ + function binl2rstr(input) { + var i + var output = '' + var length32 = input.length * 32 + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff) + } + return output + } + + /** + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + * + * @param {string} input Raw input string + * @returns {Array} Array of little-endian words + */ + function rstr2binl(input) { + var i + var output = [] + output[(input.length >> 2) - 1] = undefined + for (i = 0; i < output.length; i += 1) { + output[i] = 0 + } + var length8 = input.length * 8 + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32 + } + return output + } + + /** + * Calculate the MD5 of a raw string + * + * @param {string} s Input string + * @returns {string} Raw MD5 string + */ + function rstrMD5(s) { + return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)) + } + + /** + * Calculates the HMAC-MD5 of a key and some data (raw strings) + * + * @param {string} key HMAC key + * @param {string} data Raw input string + * @returns {string} Raw MD5 string + */ + function rstrHMACMD5(key, data) { + var i + var bkey = rstr2binl(key) + var ipad = [] + var opad = [] + var hash + ipad[15] = opad[15] = undefined + if (bkey.length > 16) { + bkey = binlMD5(bkey, key.length * 8) + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636 + opad[i] = bkey[i] ^ 0x5c5c5c5c + } + hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8) + return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)) + } + + /** + * Convert a raw string to a hex string + * + * @param {string} input Raw input string + * @returns {string} Hex encoded string + */ + function rstr2hex(input) { + var hexTab = '0123456789abcdef' + var output = '' + var x + var i + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i) + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f) + } + return output + } + + /** + * Encode a string as UTF-8 + * + * @param {string} input Input string + * @returns {string} UTF8 string + */ + function str2rstrUTF8(input) { + return unescape(encodeURIComponent(input)) + } + + /** + * Encodes input string as raw MD5 string + * + * @param {string} s Input string + * @returns {string} Raw MD5 string + */ + function rawMD5(s) { + return rstrMD5(str2rstrUTF8(s)) + } + /** + * Encodes input string as Hex encoded string + * + * @param {string} s Input string + * @returns {string} Hex encoded string + */ + function hexMD5(s) { + return rstr2hex(rawMD5(s)) + } + /** + * Calculates the raw HMAC-MD5 for the given key and data + * + * @param {string} k HMAC key + * @param {string} d Input string + * @returns {string} Raw MD5 string + */ + function rawHMACMD5(k, d) { + return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)) + } + /** + * Calculates the Hex encoded HMAC-MD5 for the given key and data + * + * @param {string} k HMAC key + * @param {string} d Input string + * @returns {string} Raw MD5 string + */ + function hexHMACMD5(k, d) { + return rstr2hex(rawHMACMD5(k, d)) + } + + /** + * Calculates MD5 value for a given string. + * If a key is provided, calculates the HMAC-MD5 value. + * Returns a Hex encoded string unless the raw argument is given. + * + * @param {string} string Input string + * @param {string} [key] HMAC key + * @param {boolean} [raw] Raw output switch + * @returns {string} MD5 output + */ + function md5(string, key, raw) { + if (!key) { + if (!raw) { + return hexMD5(string) + } + return rawMD5(string) + } + if (!raw) { + return hexHMACMD5(key, string) + } + return rawHMACMD5(key, string) + } + + if (typeof define === 'function' && define.amd) { + define(function () { + return md5 + }) + } else if (typeof module === 'object' && module.exports) { + module.exports = md5 + } else { + $.md5 = md5 + } +})(this) diff --git a/weixin-miniprogram/node_modules/blueimp-md5/js/md5.min.js b/weixin-miniprogram/node_modules/blueimp-md5/js/md5.min.js new file mode 100644 index 0000000..f414e7c --- /dev/null +++ b/weixin-miniprogram/node_modules/blueimp-md5/js/md5.min.js @@ -0,0 +1,2 @@ +!function(n){"use strict";function d(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function f(n,t,r,e,o,u){return d((u=d(d(t,n),d(e,u)))<>>32-o,r)}function l(n,t,r,e,o,u,c){return f(t&r|~t&e,n,t,o,u,c)}function g(n,t,r,e,o,u,c){return f(t&e|r&~e,n,t,o,u,c)}function v(n,t,r,e,o,u,c){return f(t^r^e,n,t,o,u,c)}function m(n,t,r,e,o,u,c){return f(r^(t|~e),n,t,o,u,c)}function c(n,t){var r,e,o,u;n[t>>5]|=128<>>9<<4)]=t;for(var c=1732584193,f=-271733879,i=-1732584194,a=271733878,h=0;h>5]>>>e%32&255);return t}function a(n){var t=[];for(t[(n.length>>2)-1]=void 0,e=0;e>5]|=(255&n.charCodeAt(e/8))<>>4&15)+r.charAt(15&t);return e}function r(n){return unescape(encodeURIComponent(n))}function o(n){return i(c(a(n=r(n)),8*n.length))}function u(n,t){return function(n,t){var r,e=a(n),o=[],u=[];for(o[15]=u[15]=void 0,16 + + + + 欢迎你,{{ displayUsername }}! + + + 调试信息:{{ debugText }} + + + + + + + {{ menuItem.title }} + + + + + + \ No newline at end of file diff --git a/weixin-miniprogram/pages/index/index.wxss b/weixin-miniprogram/pages/index/index.wxss new file mode 100644 index 0000000..8e9c81f --- /dev/null +++ b/weixin-miniprogram/pages/index/index.wxss @@ -0,0 +1 @@ +/* pages/index/index.wxss */ \ No newline at end of file diff --git a/weixin-miniprogram/pages/index/login.js b/weixin-miniprogram/pages/index/login.js new file mode 100644 index 0000000..adc455c --- /dev/null +++ b/weixin-miniprogram/pages/index/login.js @@ -0,0 +1,129 @@ +// pages/index/login.js +const app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + username: '', + password: '', + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + + + bindKeyInput: function (e) { + // console.log('e', e) + let newData = {} + newData[e.target.id] = e.detail.value + this.setData(newData) + }, + + login() { + console.log("login userInput", this.data.username, this.data.password) + if (!this.data.username || !this.data.password) { + wx.showToast({ + title: "请完善登录信息", + icon: 'error', + duration: 2000 + }) + } else { + wx.showLoading({ + title: '加载中' + }) + wx.request({ + url: `${app.globalData.baseUrl}/user/login`, + method: "POST", + header: { + "Content-Type": "application/x-www-form-urlencoded" //用于post + }, + data: { + username: this.data.username, + password: this.data.password, + }, + success: function (d) { + wx.hideLoading() + let result = d.data; + if (result.success) { + // 登录成功 + wx.setStorageSync("userInfo", result.data.userInfo); + console.log("userInfo", wx.getStorageSync("userInfo")) + wx.switchTab({ + url: '/pages/index/index' + }) + } else { + wx.showToast({ + title: result.msg, + icon: 'error', + duration: 2000 + }) + } + }, + fail: function () { + wx.hideLoading() + wx.showToast({ + title: "请求失败", + icon: 'error', + duration: 2000 + }) + } + }) + } + } +}) diff --git a/weixin-miniprogram/pages/index/login.json b/weixin-miniprogram/pages/index/login.json new file mode 100644 index 0000000..a38ebaa --- /dev/null +++ b/weixin-miniprogram/pages/index/login.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "登录" +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/index/login.wxml b/weixin-miniprogram/pages/index/login.wxml new file mode 100644 index 0000000..5c31198 --- /dev/null +++ b/weixin-miniprogram/pages/index/login.wxml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/weixin-miniprogram/pages/index/login.wxss b/weixin-miniprogram/pages/index/login.wxss new file mode 100644 index 0000000..4f022ab --- /dev/null +++ b/weixin-miniprogram/pages/index/login.wxss @@ -0,0 +1,31 @@ +/* pages/index/login.wxss */ +.container { + line-height: 1.5em; + padding: 30px 0; +} + +.login-icon { + text-align: center; + height: 35vh; +} + +.login-img { + width: 50vw; +} + +.login-from { + padding: 0 20vw; +} + +.inputText { + width: 95%; + border-bottom: solid 1px; + margin-bottom: 50px; +} + +.loginBtnView { + margin-top: 70px; +} +.loginBtn { + margin-bottom: 25px; +} diff --git a/weixin-miniprogram/pages/index2/index.js b/weixin-miniprogram/pages/index2/index.js new file mode 100644 index 0000000..0bc1771 --- /dev/null +++ b/weixin-miniprogram/pages/index2/index.js @@ -0,0 +1,48 @@ +// index.js +// 获取应用实例 +const app = getApp() + +Page({ + data: { + motto: 'Hello World', + userInfo: {}, + hasUserInfo: false, + canIUse: wx.canIUse('button.open-type.getUserInfo'), + canIUseGetUserProfile: false, + canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false + }, + // 事件处理函数 + bindViewTap() { + wx.navigateTo({ + url: '../logs/logs' + }) + }, + onLoad() { + if (wx.getUserProfile) { + this.setData({ + canIUseGetUserProfile: true + }) + } + }, + getUserProfile(e) { + // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗 + wx.getUserProfile({ + desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 + success: (res) => { + console.log(res) + this.setData({ + userInfo: res.userInfo, + hasUserInfo: true + }) + } + }) + }, + getUserInfo(e) { + // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息 + console.log(e) + this.setData({ + userInfo: e.detail.userInfo, + hasUserInfo: true + }) + } +}) diff --git a/weixin-miniprogram/pages/index2/index.json b/weixin-miniprogram/pages/index2/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/weixin-miniprogram/pages/index2/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/index2/index.wxml b/weixin-miniprogram/pages/index2/index.wxml new file mode 100644 index 0000000..f00d294 --- /dev/null +++ b/weixin-miniprogram/pages/index2/index.wxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + 请使用1.4.4及以上版本基础库 + + + + {{userInfo.nickName}} + + + + {{motto}} + + diff --git a/weixin-miniprogram/pages/index2/index.wxss b/weixin-miniprogram/pages/index2/index.wxss new file mode 100644 index 0000000..eb64203 --- /dev/null +++ b/weixin-miniprogram/pages/index2/index.wxss @@ -0,0 +1,19 @@ +/**index.wxss**/ +.userinfo { + display: flex; + flex-direction: column; + align-items: center; + color: #aaa; +} + +.userinfo-avatar { + overflow: hidden; + width: 128rpx; + height: 128rpx; + margin: 20rpx; + border-radius: 50%; +} + +.usermotto { + margin-top: 200px; +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/logs/logs.js b/weixin-miniprogram/pages/logs/logs.js new file mode 100644 index 0000000..85f6aac --- /dev/null +++ b/weixin-miniprogram/pages/logs/logs.js @@ -0,0 +1,18 @@ +// logs.js +const util = require('../../utils/util.js') + +Page({ + data: { + logs: [] + }, + onLoad() { + this.setData({ + logs: (wx.getStorageSync('logs') || []).map(log => { + return { + date: util.formatTime(new Date(log)), + timeStamp: log + } + }) + }) + } +}) diff --git a/weixin-miniprogram/pages/logs/logs.json b/weixin-miniprogram/pages/logs/logs.json new file mode 100644 index 0000000..3ee76c1 --- /dev/null +++ b/weixin-miniprogram/pages/logs/logs.json @@ -0,0 +1,4 @@ +{ + "navigationBarTitleText": "查看启动日志", + "usingComponents": {} +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/logs/logs.wxml b/weixin-miniprogram/pages/logs/logs.wxml new file mode 100644 index 0000000..0b6b645 --- /dev/null +++ b/weixin-miniprogram/pages/logs/logs.wxml @@ -0,0 +1,6 @@ + + + + {{index + 1}}. {{log.date}} + + diff --git a/weixin-miniprogram/pages/logs/logs.wxss b/weixin-miniprogram/pages/logs/logs.wxss new file mode 100644 index 0000000..94d4b88 --- /dev/null +++ b/weixin-miniprogram/pages/logs/logs.wxss @@ -0,0 +1,8 @@ +.log-list { + display: flex; + flex-direction: column; + padding: 40rpx; +} +.log-item { + margin: 10rpx; +} diff --git a/weixin-miniprogram/pages/person/person.js b/weixin-miniprogram/pages/person/person.js new file mode 100644 index 0000000..e2a57e9 --- /dev/null +++ b/weixin-miniprogram/pages/person/person.js @@ -0,0 +1,66 @@ +// pages/person/person.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/weixin-miniprogram/pages/person/person.json b/weixin-miniprogram/pages/person/person.json new file mode 100644 index 0000000..a905e86 --- /dev/null +++ b/weixin-miniprogram/pages/person/person.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "我" +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/person/person.wxml b/weixin-miniprogram/pages/person/person.wxml new file mode 100644 index 0000000..74f353a --- /dev/null +++ b/weixin-miniprogram/pages/person/person.wxml @@ -0,0 +1,2 @@ + +pages/person/person.wxml diff --git a/weixin-miniprogram/pages/person/person.wxss b/weixin-miniprogram/pages/person/person.wxss new file mode 100644 index 0000000..08f4ce6 --- /dev/null +++ b/weixin-miniprogram/pages/person/person.wxss @@ -0,0 +1 @@ +/* pages/person/person.wxss */ \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/code.js b/weixin-miniprogram/pages/residents/code.js new file mode 100644 index 0000000..2037260 --- /dev/null +++ b/weixin-miniprogram/pages/residents/code.js @@ -0,0 +1,215 @@ +// pages/residents/code.js +import SparkMD5 from '../../utils/spark-md5.min' +import utils from '../../utils/util' +import drawQrcode from '../../utils/qrcode/index' +import scanQRCode from '../../utils/scanQRCode' + +const app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + timeInterval: null, + isShow: 'none', + userText: '', + showText: '', + showTextColor: '', + time: '', + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + console.log('onShow') + // setTimeout(this.refershData, 100) + this.refershData() + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + console.log('onHide') + clearInterval(this.data.timeInterval); + this.setData({ + isShow: 'none', + time: '' + }) + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + console.log('onUnload') + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + console.log('onPullDownRefresh') + this.refershData(() => { + wx.stopPullDownRefresh(); + }); + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + + + refershData(callback) { + console.log('this.refershData()') + wx.showNavigationBarLoading(); + clearInterval(this.data.timeInterval); + this.setData({ + isShow: 'none', + time: '', + userInfo: wx.getStorageSync("userInfo"), + }) + if (!this.data.userInfo) { + wx.redirectTo({ + url: '/pages/index/login' + }) + } + wx.showLoading({ + title: '加载中' + }) + var that = this; + wx.request({ + url: `${app.globalData.baseUrl}/access/code/getCodeInfo`, + method: "POST", + header: { + "Content-Type": "application/x-www-form-urlencoded" //用于post + }, + data: { + id: this.data.userInfo.id, + }, + success: function (d) { + console.log("begin success") + wx.hideLoading() + let result = d.data; + if (result.success) { + console.log("result.data", result.data); + that.setData({ + userText: `${that.data.userInfo.id} | ${that.data.userInfo.realname}`, + showText: result.data.infoText, + showTextColor: result.data.infoTextColor + }) + + let t = Date.now(); + let chksum = SparkMD5.hash(JSON.stringify({ + id: that.data.userInfo.id, + t: t + })); + console.log("chksum", chksum) + that.drawCode(`https://epp.cxyxiaomo.com/access/validCode?id=${that.data.userInfo.id}&t=${t}&chksum=${chksum}`, result.data.qrcodeColor) + } else { + wx.showToast({ + title: result.msg, + icon: 'error', + duration: 2000 + }) + } + that.setData({ + isShow: '' + }) + console.log("end success") + }, + fail: function () { + console.log("begin fail") + wx.hideLoading() + wx.showToast({ + title: "请求失败", + icon: 'error', + duration: 2000 + }) + console.log("end fail") + }, + complete: function () { + console.log("begin complete") + if (typeof (callback) === "function") + callback(); + wx.hideNavigationBarLoading(); + console.log("end complete") + } + }) + }, + drawCode(text = 'https://www.baidu.com/', foreground = 'red') { + console.log("drawCode was called.") + var that = this; + const query = wx.createSelectorQuery() + query.select('#myQrcode') + .fields({ + node: true, + size: true + }) + .exec(async (res) => { + console.log("before drawQrcode") + var canvas = res[0].node + if (!canvas) { + wx.showToast({ + title: "canvas获取失败", + icon: 'error', + duration: 2000 + }) + return + } + console.log("canvas:", canvas, "res:", res) + // 调用方法drawQrcode生成二维码 + await drawQrcode(wx, { + canvas: canvas, + canvasId: 'myQrcode', + width: 150, + padding: 0, + background: '#ffffff', + foreground: foreground, + text: text, + }) + console.log("end drawQrcode") + + this.updateTime(); + this.setData({ + timeInterval: setInterval(this.updateTime, 1000) + }) + }) + }, + updateTime() { + this.setData({ + time: utils.formatTime(new Date()) + }) + console.log("刷新时间") + }, + scan() { + scanQRCode(wx) + } +}) diff --git a/weixin-miniprogram/pages/residents/code.json b/weixin-miniprogram/pages/residents/code.json new file mode 100644 index 0000000..977af0d --- /dev/null +++ b/weixin-miniprogram/pages/residents/code.json @@ -0,0 +1,5 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "身份码", + "enablePullDownRefresh": true +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/code.wxml b/weixin-miniprogram/pages/residents/code.wxml new file mode 100644 index 0000000..f30bf41 --- /dev/null +++ b/weixin-miniprogram/pages/residents/code.wxml @@ -0,0 +1,10 @@ + + + {{ userText }} + {{ time }} + + {{ showText }} + 下拉可刷新 + + + \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/code.wxss b/weixin-miniprogram/pages/residents/code.wxss new file mode 100644 index 0000000..29d2ac1 --- /dev/null +++ b/weixin-miniprogram/pages/residents/code.wxss @@ -0,0 +1,37 @@ +/* pages/residents/code.wxss */ +#codeView { + text-align: center; + margin-top: 50px; +} + +#user-text { + font-size: 18px; +} + +#time-text { + font-weight: bold; + font-size: 22px; + margin-top: 30px; +} + +#myQrcode { + display: block; + margin: 30px auto; +} + +#show-text { + font-weight: bold; + font-size: 25px; +} + +#small-text { + margin-top: 30px; + color: grey; + font-size: small; +} + +#scan-btn { + margin-top: 20px; + padding: 9px 60px; + font-size: initial; +} diff --git a/weixin-miniprogram/pages/residents/report.js b/weixin-miniprogram/pages/residents/report.js new file mode 100644 index 0000000..2c59051 --- /dev/null +++ b/weixin-miniprogram/pages/residents/report.js @@ -0,0 +1,291 @@ +// pages/residents/report.js +import utils from '../../utils/util' + +const app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + isSkipOnShowFunc: false, // 是否跳过 onShow + userInfo: null, + timeInterval: null, + formData: { + userId: '', + userRealname: '', + address: '', + time: '', + timestamp: '', + temperature: 0, + }, + // 是否填报过 + isFilled: true, + filledMsg: "", + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + if (this.data.isSkipOnShowFunc) { + this.setData({ + isSkipOnShowFunc: false, + }) + return + } + + console.log('onShow') + let userInfo = wx.getStorageSync("userInfo") + console.log("userInfo", userInfo) + this.setData({ + userInfo: userInfo, + "formData.userId": userInfo.id, + "formData.userRealname": userInfo.realname, + timeInterval: setInterval(this.updateTime, 1000) + }) + console.log("formData", this.data.formData) + + this.updateTime(); + + // 获取用户当日是否填报过 + wx.showLoading({ + title: '加载中' + }) + var that = this; + wx.request({ + url: `${app.globalData.baseUrl}/access/report/getLatestRecord`, + method: "POST", + header: { + "Content-Type": "application/x-www-form-urlencoded" //用于post + }, + data: { + userId: this.data.userInfo.id + }, + success: function (d) { + wx.hideLoading() + let result = d.data + console.log("result", result) + if (result.success) { + console.log("result.data", result.data); + if (result.data == null || new Date(result.data.time) < new Date(new Date().toISOString().substring(0, 10))) { + // 如果没有填报记录,或者填报记录不是今天,那么说明没有填报过 + that.setData({ + isFilled: false + }) + } else { + // 有今日记录,说明已经填报过 + that.setData({ + isFilled: true, + filledMsg: "您已完成今日体温填报" + }) + } + } else { + wx.showToast({ + title: "加载填报信息失败", + icon: 'error', + duration: 2000 + }) + } + }, + fail: function () { + wx.hideLoading() + wx.showToast({ + title: "请求失败", + icon: 'error', + duration: 2000 + }) + }, + complete: function () { + wx.hideNavigationBarLoading(); + } + }) + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + + + bindTemperatureChanged(e) { + this.setData({ + "formData.temperature": e.detail.value + }) + + }, + + updateTime() { + let timestamp = Date.now() + this.setData({ + "formData.timestamp": timestamp, + "formData.time": utils.formatTime(new Date(timestamp)) + }) + }, + chooseLocation: async function () { + wx.showLoading({ + title: '正在获取权限' + }) + await new Promise((resolve) => { + wx.getSetting({ + success(res) { + wx.hideLoading() + if (!res.authSetting['scope.userLocation']) { + wx.authorize({ + scope: 'scope.userLocationBackground', + success() { + resolve(); + } + }) + } else { + resolve(); + } + } + }) + }); + wx.showLoading({ + title: '正在定位' + }) + var that = this; + this.setData({ + isSkipOnShowFunc: true, // 关闭位置选择器后,会触发 onShow,这里避免掉 + }) + wx.chooseLocation({ + success: function (res) { + console.log("wx.chooseLocation success") + that.setData({ + "formData.address": res.address + }) + }, + fail: function () { + console.log("wx.chooseLocation fail", that.data.formData) + if (!that.data.formData.address) { + wx.showToast({ + title: "请获取当前位置", + icon: 'error' + }) + } + }, + }) + wx.hideLoading() + }, + // 体温上报 提交按钮 + report() { + console.log("点击提交", "this.data.formData", this.data.formData) + if (!this.data.formData.address) { + wx.showToast({ + title: "请获取当前位置", + icon: 'error' + }) + return; + } + wx.showLoading({ + title: '加载中' + }) + var that = this; + wx.request({ + url: `${app.globalData.baseUrl}/access/report/submit`, + method: "POST", + header: { + "Content-Type": "application/x-www-form-urlencoded" //用于post + }, + data: { + ...this.data.formData, + }, + success: function (d) { + console.log("begin success") + wx.hideLoading() + let result = d.data; + if (result.success) { + // 填报完成 + that.setData({ + isFilled: true, + filledMsg: "您已完成今日体温填报" + }) + console.log("result.data", result.data); + wx.showToast({ + title: "填报成功", + icon: 'success', + duration: 2000 + }) + } else { + wx.showToast({ + title: result.msg || "出错啦", + icon: 'error', + duration: 2000 + }) + } + that.isShow = '' + console.log("end success") + }, + fail: function () { + console.log("begin fail") + wx.hideLoading() + wx.showToast({ + title: "请求失败", + icon: 'error', + duration: 2000 + }) + console.log("end fail") + }, + complete: function () { + console.log("begin complete") + if (typeof (callback) === "function") + callback(); + wx.hideNavigationBarLoading(); + console.log("end complete") + } + }) + }, + // 历史填报 + myreport() { + wx.navigateTo({ + url: "/pages/residents/reportHistory" + }) + } +}) diff --git a/weixin-miniprogram/pages/residents/report.json b/weixin-miniprogram/pages/residents/report.json new file mode 100644 index 0000000..b47f39b --- /dev/null +++ b/weixin-miniprogram/pages/residents/report.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "体温上报" +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/report.wxml b/weixin-miniprogram/pages/residents/report.wxml new file mode 100644 index 0000000..63c43a4 --- /dev/null +++ b/weixin-miniprogram/pages/residents/report.wxml @@ -0,0 +1,59 @@ + + + + + + 姓名 + + + + + + + + + 填报时间 + + + + + + + + + 地址 + + + + + + + + + 今日体温 + + + + 正常 + 异常(≥37.3°) + + + + + + + * 本人承诺以上所填报的内容全部真实,并愿意承担相应责任。 + + + + + + + + + + + {{ filledMsg }} + + + \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/report.wxss b/weixin-miniprogram/pages/residents/report.wxss new file mode 100644 index 0000000..82bee9e --- /dev/null +++ b/weixin-miniprogram/pages/residents/report.wxss @@ -0,0 +1,39 @@ +/* pages/residents/report.wxss */ +.form { + padding: 20px 30px; +} + +.row { + margin: 30px 0; + border-bottom: 2px solid grey; +} + +.rowItem { + margin: 0; + padding: 0; + display: inline-block; + + vertical-align: middle; + height: 1.6rem; +} + +.rowLeft { + width: 30%; +} + +.rowRight { + width: 70%; +} + +.rowRightElement { + width: 100%; +} + +.center { + text-align: center; +} + +.controlBtn { + width: 250px; + margin: 0 30px; +} diff --git a/weixin-miniprogram/pages/residents/reportHistory.js b/weixin-miniprogram/pages/residents/reportHistory.js new file mode 100644 index 0000000..0d803c9 --- /dev/null +++ b/weixin-miniprogram/pages/residents/reportHistory.js @@ -0,0 +1,125 @@ +// pages/residents/reportHistory.js + +const app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + userInfo: null, + displayName: '', + displayResult: [], + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + console.log('onShow') + let userInfo = wx.getStorageSync("userInfo") + this.setData({ + userInfo: userInfo, + displayName: userInfo.realname + }) + + // 获取用户填报历史 + wx.showLoading({ + title: '加载中' + }) + var that = this; + wx.request({ + url: `${app.globalData.baseUrl}/access/report/getRecordList`, + method: "POST", + header: { + "Content-Type": "application/x-www-form-urlencoded" //用于post + }, + data: { + userId: this.data.userInfo.id + }, + success: function (d) { + wx.hideLoading() + let result = d.data + console.log("result", result) + if (result.success) { + console.log("result.data", result.data) + that.setData({ + displayResult: result.data.map(item => { + // 时间友好化显示 + let t = new Date(item.time).getTime() + 8 * 3600 * 1000 + item.time = new Date(t).toISOString().substring(0, 19).replace("T", " ") + return item + }) + }) + } else { + wx.showToast({ + title: "加载填报信息失败", + icon: 'error', + duration: 2000 + }) + } + }, + fail: function () { + wx.hideLoading() + wx.showToast({ + title: "请求失败", + icon: 'error', + duration: 2000 + }) + }, + complete: function () { + wx.hideNavigationBarLoading(); + } + }) + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) diff --git a/weixin-miniprogram/pages/residents/reportHistory.json b/weixin-miniprogram/pages/residents/reportHistory.json new file mode 100644 index 0000000..69c52cb --- /dev/null +++ b/weixin-miniprogram/pages/residents/reportHistory.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "体温上报 - 历史记录" +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/reportHistory.wxml b/weixin-miniprogram/pages/residents/reportHistory.wxml new file mode 100644 index 0000000..064f650 --- /dev/null +++ b/weixin-miniprogram/pages/residents/reportHistory.wxml @@ -0,0 +1,21 @@ + + + + 姓名:{{ displayName }} + + + + + + + {{ item.time }} + + + + {{ item.address }} + + + {{ item.temperature == 1 ? "异常" : "正常" }} + + + \ No newline at end of file diff --git a/weixin-miniprogram/pages/residents/reportHistory.wxss b/weixin-miniprogram/pages/residents/reportHistory.wxss new file mode 100644 index 0000000..ac45398 --- /dev/null +++ b/weixin-miniprogram/pages/residents/reportHistory.wxss @@ -0,0 +1,33 @@ +/* pages/residents/reportHistory.wxss */ +.item { + /* background-color: #dedede; */ + border-radius: 8px; + margin: 12px 20px; + padding: 18px; + display: grid; + grid-template-columns: 1fr auto; + place-items: center; + color: white; +} + +.item.normal { + background-color: green; +} + +.item.abnormal { + background-color: red; +} + +.record_time { + font-size: 17px; +} + +.record_address { + font-size: 15px; +} + +.statusText { + font-size: large; + font-weight: bold; + padding: 0 20px; +} diff --git a/weixin-miniprogram/pages/scan/entrance.js b/weixin-miniprogram/pages/scan/entrance.js new file mode 100644 index 0000000..74fc986 --- /dev/null +++ b/weixin-miniprogram/pages/scan/entrance.js @@ -0,0 +1,66 @@ +// pages/scan/entrance.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/weixin-miniprogram/pages/scan/entrance.json b/weixin-miniprogram/pages/scan/entrance.json new file mode 100644 index 0000000..99da1f6 --- /dev/null +++ b/weixin-miniprogram/pages/scan/entrance.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "进入社区" +} \ No newline at end of file diff --git a/weixin-miniprogram/pages/scan/entrance.wxml b/weixin-miniprogram/pages/scan/entrance.wxml new file mode 100644 index 0000000..e68bd82 --- /dev/null +++ b/weixin-miniprogram/pages/scan/entrance.wxml @@ -0,0 +1,4 @@ + + + 您将要进入社区 + \ No newline at end of file diff --git a/weixin-miniprogram/pages/scan/entrance.wxss b/weixin-miniprogram/pages/scan/entrance.wxss new file mode 100644 index 0000000..55cba94 --- /dev/null +++ b/weixin-miniprogram/pages/scan/entrance.wxss @@ -0,0 +1 @@ +/* pages/scan/entrance.wxss */ \ No newline at end of file diff --git a/weixin-miniprogram/project.config.json b/weixin-miniprogram/project.config.json new file mode 100644 index 0000000..870fdaf --- /dev/null +++ b/weixin-miniprogram/project.config.json @@ -0,0 +1,51 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "bundle": false, + "userConfirmedBundleSwitch": false, + "urlCheck": true, + "scopeDataCheck": false, + "coverView": true, + "es6": true, + "postcss": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "preloadBackgroundData": false, + "minified": true, + "autoAudits": false, + "newFeature": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "useIsolateContext": true, + "nodeModules": false, + "enhance": true, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": true, + "packNpmManually": false, + "enableEngineNative": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "showES6CompileOption": false, + "minifyWXML": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + } + }, + "compileType": "miniprogram", + "libVersion": "2.19.4", + "appid": "wx332e2e578f09873a", + "projectname": "miniprogram-92", + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + } +} \ No newline at end of file diff --git a/weixin-miniprogram/project.private.config.json b/weixin-miniprogram/project.private.config.json new file mode 100644 index 0000000..683c479 --- /dev/null +++ b/weixin-miniprogram/project.private.config.json @@ -0,0 +1,8 @@ +{ + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "weixin-miniprogram", + "setting": { + "compileHotReLoad": false, + "urlCheck": false + } +} \ No newline at end of file diff --git a/weixin-miniprogram/sitemap.json b/weixin-miniprogram/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/weixin-miniprogram/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/weixin-miniprogram/utils/const.js b/weixin-miniprogram/utils/const.js new file mode 100644 index 0000000..b093d86 --- /dev/null +++ b/weixin-miniprogram/utils/const.js @@ -0,0 +1,12 @@ +module.exports = { + user: { + role: { + ADMIN: 0, + STAFF: 1, + RESIDENTS_OWNER: 2, + RESIDENTS_MEMBER: 3, + RESIDENTS_TENENT: 4, + VISITOR: 5 + } + } +} diff --git a/weixin-miniprogram/utils/getUserGroupByRole.js b/weixin-miniprogram/utils/getUserGroupByRole.js new file mode 100644 index 0000000..cd39b00 --- /dev/null +++ b/weixin-miniprogram/utils/getUserGroupByRole.js @@ -0,0 +1,29 @@ +const ENUM = require('./const.js'); + +function getUserGroupByRole(userRole) { + const role = ENUM.user.role; + userRole = Number(userRole); + let userGroupDict = { + 'visitor': [ + role.VISITOR, + ].includes(userRole), + 'user': [ + role.RESIDENTS_OWNER, + role.RESIDENTS_MEMBER, + role.RESIDENTS_TENENT, + ].includes(userRole), + 'admin': [ + role.ADMIN, + role.STAFF, + ].includes(userRole) + } + console.log("userGroupDict", userGroupDict, userRole, role) + for (let userGroup of Object.keys(userGroupDict)) { + if (userGroupDict[userGroup]) { + return userGroup; + } + } + return 'unknown'; +} + +module.exports = getUserGroupByRole; diff --git a/weixin-miniprogram/utils/menuList.js b/weixin-miniprogram/utils/menuList.js new file mode 100644 index 0000000..f07019c --- /dev/null +++ b/weixin-miniprogram/utils/menuList.js @@ -0,0 +1,104 @@ +const switchTab = "switchTab"; +const navigateTo = "navigateTo"; +let id = 0; + +let menuItemDict = { + 'login': { + for: ['unknown'], + title: "登录", + image: "code.png", + switchFunc: switchTab, + url: '/pages/index/login', + }, + 'code': { + for: ['visitor', 'user'], + title: "进出码", + image: "code.png", + switchFunc: switchTab, + url: '/pages/residents/code' + }, + 'report': { + for: ['user'], + title: "体温上报", + image: "report.png", + switchFunc: switchTab, + url: '/pages/residents/report' + }, + 'apply-record': { + for: ['visitor', 'user'], + title: "申请记录", + image: "apply.png", + switchFunc: switchTab, + url: '' + }, + 'apply-approval': { + for: ['admin'], + title: "申请审批", + image: "apply.png", // ApplyReplay + switchFunc: switchTab, + url: '' + }, + 'visitor-apply': { + for: ['admin'], + title: "访客审批", + image: "visitor.png", + switchFunc: switchTab, + url: '' + }, + 'abnormal': { + for: ['admin'], + title: "异常人员", + image: "danger.png", + switchFunc: switchTab, + url: '' + }, + 'feedback-submit': { + for: ['visitor', 'user'], + title: "提交反馈", + image: "fk.png", + switchFunc: switchTab, + url: '' + }, + 'feedback-list': { + for: ['visitor', 'user'], + title: "反馈查看", + image: "feedback.png", + switchFunc: switchTab, + url: '' + }, + 'feedback-reply': { + for: ['admin'], + title: "反馈回复", + image: "feedback.png", + switchFunc: switchTab, + url: '' + }, + 'update-password': { + for: ['user', 'admin'], + title: "密码修改", + image: "updPwd.png", + switchFunc: switchTab, + url: '' + }, + 'assign': { + for: ['admin'], + title: "分配账号", + image: "count.png", + switchFunc: switchTab, + url: '' + }, + 'unfinish': { + for: ['admin'], + title: "今日未填", // RedList + image: "_report.png", + switchFunc: switchTab, + url: '' + } +} +let keys = Object.keys(menuItemDict); +for (let key of keys) { + menuItemDict[key].id = id++; + menuItemDict[key].addDot = false; +} + +module.exports = menuItemDict diff --git a/weixin-miniprogram/utils/qrcode/index.js b/weixin-miniprogram/utils/qrcode/index.js new file mode 100644 index 0000000..2978bd2 --- /dev/null +++ b/weixin-miniprogram/utils/qrcode/index.js @@ -0,0 +1,128 @@ +// import extend from 'extend' +import { + QRCode, + QRErrorCorrectLevel +} from './qrcode' + +// support Chinese +function utf16to8(str) { + var out, i, len, c + out = '' + len = str.length + for (i = 0; i < len; i++) { + c = str.charCodeAt(i) + if ((c >= 0x0001) && (c <= 0x007F)) { + out += str.charAt(i) + } else if (c > 0x07FF) { + out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)) + out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)) + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) + } else { + out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)) + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) + } + } + return out +} + +function drawQrcode(Taro, opt) { + let defaultOpt = { + canvasId: 'myQrcode', + canvas: null, + text: '爱一个人就要勇敢说出来', + width: 260, + padding: 20, + paddingColor: null, // 默认与background一致 + typeNumber: -1, + correctLevel: QRErrorCorrectLevel.H, + background: '#ffffff', + foreground: '#000000', + image: { + imageResource: '', + width: 80, + height: 80, + round: true + } + } + let options = defaultOpt + for (let key in opt) { + options[key] = opt[key] + } + + if (!options.canvasId && !options.canvas) { + console.warn('please set canvasId or canvas!') + return + } + + if (!options.paddingColor) options.paddingColor = options.background + + // createCanvas + // create the qrcode itself + var qrcode = new QRCode(options.typeNumber, options.correctLevel) + qrcode.addData(utf16to8(options.text)) + qrcode.make() + + const dpr = Taro.getSystemInfoSync().pixelRatio + var canvas = options.canvas + const ctx = canvas.getContext('2d') + canvas.width = options.width * dpr + canvas.height = options.width * dpr + const width = canvas.width + console.log(`canvas, ctx, width, dpr, qrcode, options`, canvas, ctx, width, dpr, qrcode, options) + + // 填充背景色 + ctx.fillStyle = options.paddingColor + // ctx.clearRect(0, 0, width + options.padding * 2, width + options.padding * 2) // 绘制前清空画布 + ctx.fillRect(0, 0, width + options.padding * 2, width + options.padding * 2); + + var tileW = (width - options.padding * 2) / qrcode.getModuleCount() + var tileH = (width - options.padding * 2) / qrcode.getModuleCount() + + // 绘制二维码 + for (var row = 0; row < qrcode.getModuleCount(); row++) { + for (var col = 0; col < qrcode.getModuleCount(); col++) { + ctx.fillStyle = qrcode.isDark(row, col) ? options.foreground : options.background + var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW)) + var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW)) + ctx.fillRect(Math.round(col * tileW) + options.padding, Math.round(row * tileH) + options.padding, w, h); + } + } + + // 绘制中心图标 + if (options.image.imageResource) { + const imgW = options.image.width * dpr + const imgH = options.image.height * dpr + const dx = (width - imgW) / 2 + const dy = (width - imgH) / 2 + if (options.image.round) { + // Logo边框 + const imgW2 = options.image.width * dpr + 30 + const dx2 = (width - imgW2) / 2 + const r2 = imgW2 / 2 + const cx2 = dx2 + r2; + ctx.beginPath(); + ctx.arc(cx2, cx2, r2, 0, 2 * Math.PI); + ctx.fillStyle = '#ffffff' + ctx.fill(); + ctx.restore(); + + // 画Logo + const r = imgW / 2 + const cx = dx + r; + const cy = dy + r; + ctx.beginPath(); + ctx.arc(cx, cy, r, 0, 2 * Math.PI); + ctx.clip(); + + ctx.drawImage(options.image.imageResource, dx, dy, imgW, imgW); + ctx.restore(); + } else { + ctx.drawImage(options.image.imageResource, dx, dy, imgW, imgH) + ctx.restore(); + } + } + + return ctx +} + +export default drawQrcode diff --git a/weixin-miniprogram/utils/qrcode/qrcode.js b/weixin-miniprogram/utils/qrcode/qrcode.js new file mode 100644 index 0000000..3289c78 --- /dev/null +++ b/weixin-miniprogram/utils/qrcode/qrcode.js @@ -0,0 +1,1242 @@ +//--------------------------------------------------------------------- +// QRCode for JavaScript +// +// Copyright (c) 2009 Kazuhiko Arase +// +// URL: http://www.d-project.com/ +// +// Licensed under the MIT license: +// http://www.opensource.org/licenses/mit-license.php +// +// The word "QR Code" is registered trademark of +// DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/faqpatent-e.html +// +//--------------------------------------------------------------------- + +//--------------------------------------------------------------------- +// QR8bitByte +//--------------------------------------------------------------------- + +function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; +} + +QR8bitByte.prototype = { + + getLength : function(buffer) { + return this.data.length; + }, + + write : function(buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } +}; + +//--------------------------------------------------------------------- +// QRCode +//--------------------------------------------------------------------- + +function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); +} + +QRCode.prototype = { + + addData : function(data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark : function(row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount : function() { + return this.moduleCount; + }, + + make : function() { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1 ){ + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) + break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern() ); + }, + + makeImpl : function(test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null;//(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern : function(row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if ( (0 <= r && r <= 6 && (c == 0 || c == 6) ) + || (0 <= c && c <= 6 && (r == 0 || r == 6) ) + || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern : function() { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip : function(target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern : function() { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = (c % 2 == 0); + } + }, + + setupPositionAdjustPattern : function() { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 + || (r == 0 && c == 0) ) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber : function(test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = (!test && ( (bits >> i) & 1) == 1); + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = (!test && ( (bits >> i) & 1) == 1); + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo : function(test, maskPattern) { + + var data = (this.errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = (!test && ( (bits >> i) & 1) == 1); + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = (!test && ( (bits >> i) & 1) == 1); + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = (!test); + + }, + + mapData : function(data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + + } + +}; + +QRCode.PAD0 = 0xEC; +QRCode.PAD1 = 0x11; + +QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + + buffer.getLengthInBits() + + ">" + + totalDataCount * 8 + + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); +} + +QRCode.createBytes = function(buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0)? modPoly.get(modIndex) : 0; + } + + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; + +} + +//--------------------------------------------------------------------- +// QRMode +//--------------------------------------------------------------------- + +var QRMode = { + MODE_NUMBER : 1 << 0, + MODE_ALPHA_NUM : 1 << 1, + MODE_8BIT_BYTE : 1 << 2, + MODE_KANJI : 1 << 3 +}; + +//--------------------------------------------------------------------- +// QRErrorCorrectLevel +//--------------------------------------------------------------------- + +var QRErrorCorrectLevel = { + L : 1, + M : 0, + Q : 3, + H : 2 +}; + +//--------------------------------------------------------------------- +// QRMaskPattern +//--------------------------------------------------------------------- + +var QRMaskPattern = { + PATTERN000 : 0, + PATTERN001 : 1, + PATTERN010 : 2, + PATTERN011 : 3, + PATTERN100 : 4, + PATTERN101 : 5, + PATTERN110 : 6, + PATTERN111 : 7 +}; + +//--------------------------------------------------------------------- +// QRUtil +//--------------------------------------------------------------------- + +var QRUtil = { + + PATTERN_POSITION_TABLE : [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + + G15 : (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18 : (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK : (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + + getBCHTypeInfo : function(data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) ) ); + } + return ( (data << 10) | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber : function(data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) ) ); + } + return (data << 12) | d; + }, + + getBCHDigit : function(data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition : function(typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask : function(maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000 : return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001 : return i % 2 == 0; + case QRMaskPattern.PATTERN010 : return j % 3 == 0; + case QRMaskPattern.PATTERN011 : return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100 : return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; + case QRMaskPattern.PATTERN101 : return (i * j) % 2 + (i * j) % 3 == 0; + case QRMaskPattern.PATTERN110 : return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; + case QRMaskPattern.PATTERN111 : return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; + + default : + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial : function(errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0) ); + } + + return a; + }, + + getLengthInBits : function(mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch(mode) { + case QRMode.MODE_NUMBER : return 10; + case QRMode.MODE_ALPHA_NUM : return 9; + case QRMode.MODE_8BIT_BYTE : return 8; + case QRMode.MODE_KANJI : return 8; + default : + throw new Error("mode:" + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch(mode) { + case QRMode.MODE_NUMBER : return 12; + case QRMode.MODE_ALPHA_NUM : return 11; + case QRMode.MODE_8BIT_BYTE : return 16; + case QRMode.MODE_KANJI : return 10; + default : + throw new Error("mode:" + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch(mode) { + case QRMode.MODE_NUMBER : return 14; + case QRMode.MODE_ALPHA_NUM : return 13; + case QRMode.MODE_8BIT_BYTE : return 16; + case QRMode.MODE_KANJI : return 12; + default : + throw new Error("mode:" + mode); + } + + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint : function(qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c) ) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col ) ) count++; + if (qrCode.isDark(row + 1, col ) ) count++; + if (qrCode.isDark(row, col + 1) ) count++; + if (qrCode.isDark(row + 1, col + 1) ) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) + && !qrCode.isDark(row, col + 1) + && qrCode.isDark(row, col + 2) + && qrCode.isDark(row, col + 3) + && qrCode.isDark(row, col + 4) + && !qrCode.isDark(row, col + 5) + && qrCode.isDark(row, col + 6) ) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) + && !qrCode.isDark(row + 1, col) + && qrCode.isDark(row + 2, col) + && qrCode.isDark(row + 3, col) + && qrCode.isDark(row + 4, col) + && !qrCode.isDark(row + 5, col) + && qrCode.isDark(row + 6, col) ) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col) ) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + +}; + + +//--------------------------------------------------------------------- +// QRMath +//--------------------------------------------------------------------- + +var QRMath = { + + glog : function(n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp : function(n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE : new Array(256), + + LOG_TABLE : new Array(256) + +}; + +for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; +} +for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] + ^ QRMath.EXP_TABLE[i - 5] + ^ QRMath.EXP_TABLE[i - 6] + ^ QRMath.EXP_TABLE[i - 8]; +} +for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i] ] = i; +} + +//--------------------------------------------------------------------- +// QRPolynomial +//--------------------------------------------------------------------- + +function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } +} + +QRPolynomial.prototype = { + + get : function(index) { + return this.num[index]; + }, + + getLength : function() { + return this.num.length; + }, + + multiply : function(e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i) ) + QRMath.glog(e.get(j) ) ); + } + } + + return new QRPolynomial(num, 0); + }, + + mod : function(e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0) ) - QRMath.glog(e.get(0) ); + + var num = new Array(this.getLength() ); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i) ) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } +}; + +//--------------------------------------------------------------------- +// QRRSBlock +//--------------------------------------------------------------------- + +function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; +} + +QRRSBlock.RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] +]; + +QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount) ); + } + } + + return list; +} + +QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) { + + switch(errorCorrectLevel) { + case QRErrorCorrectLevel.L : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default : + return undefined; + } +} + +//--------------------------------------------------------------------- +// QRBitBuffer +//--------------------------------------------------------------------- + +function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; +} + +QRBitBuffer.prototype = { + + get : function(index) { + var bufIndex = Math.floor(index / 8); + return ( (this.buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; + }, + + put : function(num, length) { + for (var i = 0; i < length; i++) { + this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); + } + }, + + getLengthInBits : function() { + return this.length; + }, + + putBit : function(bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= (0x80 >>> (this.length % 8) ); + } + + this.length++; + } +}; + +export { + QRCode, + QRErrorCorrectLevel +} diff --git a/weixin-miniprogram/utils/qrcode/refer.txt b/weixin-miniprogram/utils/qrcode/refer.txt new file mode 100644 index 0000000..9616276 --- /dev/null +++ b/weixin-miniprogram/utils/qrcode/refer.txt @@ -0,0 +1 @@ +https://github.com/DoctorWei/weapp-qrcode-canvas-2d diff --git a/weixin-miniprogram/utils/scanQRCode.js b/weixin-miniprogram/utils/scanQRCode.js new file mode 100644 index 0000000..ff8a63f --- /dev/null +++ b/weixin-miniprogram/utils/scanQRCode.js @@ -0,0 +1,25 @@ +function scanQRCode(Taro) { + // 只允许从相机扫码 + Taro.scanCode({ + onlyFromCamera: true, + success(res) { + console.log(res) + if (res.scanType == "WX_CODE" && res.path) { + let searchParams = res.path.split('?'); + if (searchParams.length > 1 && searchParams[1].startsWith('scene=guard')) { + Taro.navigateTo({ + url: "/pages/scan/entrance" + }) + return + } + } + Taro.showToast({ + title: "您扫描的不是门禁码", + icon: 'error', + duration: 2000 + }) + } + }) +} + +module.exports = scanQRCode; diff --git a/weixin-miniprogram/utils/spark-md5.min.js b/weixin-miniprogram/utils/spark-md5.min.js new file mode 100644 index 0000000..2ef527d --- /dev/null +++ b/weixin-miniprogram/utils/spark-md5.min.js @@ -0,0 +1 @@ +(function(factory){if(typeof exports==="object"){module.exports=factory()}else if(typeof define==="function"&&define.amd){define(factory)}else{var glob;try{glob=window}catch(e){glob=self}glob.SparkMD5=factory()}})(function(undefined){"use strict";var add32=function(a,b){return a+b&4294967295},hex_chr=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function cmn(q,a,b,x,s,t){a=add32(add32(a,q),add32(x,t));return add32(a<>>32-s,b)}function md5cycle(x,k){var a=x[0],b=x[1],c=x[2],d=x[3];a+=(b&c|~b&d)+k[0]-680876936|0;a=(a<<7|a>>>25)+b|0;d+=(a&b|~a&c)+k[1]-389564586|0;d=(d<<12|d>>>20)+a|0;c+=(d&a|~d&b)+k[2]+606105819|0;c=(c<<17|c>>>15)+d|0;b+=(c&d|~c&a)+k[3]-1044525330|0;b=(b<<22|b>>>10)+c|0;a+=(b&c|~b&d)+k[4]-176418897|0;a=(a<<7|a>>>25)+b|0;d+=(a&b|~a&c)+k[5]+1200080426|0;d=(d<<12|d>>>20)+a|0;c+=(d&a|~d&b)+k[6]-1473231341|0;c=(c<<17|c>>>15)+d|0;b+=(c&d|~c&a)+k[7]-45705983|0;b=(b<<22|b>>>10)+c|0;a+=(b&c|~b&d)+k[8]+1770035416|0;a=(a<<7|a>>>25)+b|0;d+=(a&b|~a&c)+k[9]-1958414417|0;d=(d<<12|d>>>20)+a|0;c+=(d&a|~d&b)+k[10]-42063|0;c=(c<<17|c>>>15)+d|0;b+=(c&d|~c&a)+k[11]-1990404162|0;b=(b<<22|b>>>10)+c|0;a+=(b&c|~b&d)+k[12]+1804603682|0;a=(a<<7|a>>>25)+b|0;d+=(a&b|~a&c)+k[13]-40341101|0;d=(d<<12|d>>>20)+a|0;c+=(d&a|~d&b)+k[14]-1502002290|0;c=(c<<17|c>>>15)+d|0;b+=(c&d|~c&a)+k[15]+1236535329|0;b=(b<<22|b>>>10)+c|0;a+=(b&d|c&~d)+k[1]-165796510|0;a=(a<<5|a>>>27)+b|0;d+=(a&c|b&~c)+k[6]-1069501632|0;d=(d<<9|d>>>23)+a|0;c+=(d&b|a&~b)+k[11]+643717713|0;c=(c<<14|c>>>18)+d|0;b+=(c&a|d&~a)+k[0]-373897302|0;b=(b<<20|b>>>12)+c|0;a+=(b&d|c&~d)+k[5]-701558691|0;a=(a<<5|a>>>27)+b|0;d+=(a&c|b&~c)+k[10]+38016083|0;d=(d<<9|d>>>23)+a|0;c+=(d&b|a&~b)+k[15]-660478335|0;c=(c<<14|c>>>18)+d|0;b+=(c&a|d&~a)+k[4]-405537848|0;b=(b<<20|b>>>12)+c|0;a+=(b&d|c&~d)+k[9]+568446438|0;a=(a<<5|a>>>27)+b|0;d+=(a&c|b&~c)+k[14]-1019803690|0;d=(d<<9|d>>>23)+a|0;c+=(d&b|a&~b)+k[3]-187363961|0;c=(c<<14|c>>>18)+d|0;b+=(c&a|d&~a)+k[8]+1163531501|0;b=(b<<20|b>>>12)+c|0;a+=(b&d|c&~d)+k[13]-1444681467|0;a=(a<<5|a>>>27)+b|0;d+=(a&c|b&~c)+k[2]-51403784|0;d=(d<<9|d>>>23)+a|0;c+=(d&b|a&~b)+k[7]+1735328473|0;c=(c<<14|c>>>18)+d|0;b+=(c&a|d&~a)+k[12]-1926607734|0;b=(b<<20|b>>>12)+c|0;a+=(b^c^d)+k[5]-378558|0;a=(a<<4|a>>>28)+b|0;d+=(a^b^c)+k[8]-2022574463|0;d=(d<<11|d>>>21)+a|0;c+=(d^a^b)+k[11]+1839030562|0;c=(c<<16|c>>>16)+d|0;b+=(c^d^a)+k[14]-35309556|0;b=(b<<23|b>>>9)+c|0;a+=(b^c^d)+k[1]-1530992060|0;a=(a<<4|a>>>28)+b|0;d+=(a^b^c)+k[4]+1272893353|0;d=(d<<11|d>>>21)+a|0;c+=(d^a^b)+k[7]-155497632|0;c=(c<<16|c>>>16)+d|0;b+=(c^d^a)+k[10]-1094730640|0;b=(b<<23|b>>>9)+c|0;a+=(b^c^d)+k[13]+681279174|0;a=(a<<4|a>>>28)+b|0;d+=(a^b^c)+k[0]-358537222|0;d=(d<<11|d>>>21)+a|0;c+=(d^a^b)+k[3]-722521979|0;c=(c<<16|c>>>16)+d|0;b+=(c^d^a)+k[6]+76029189|0;b=(b<<23|b>>>9)+c|0;a+=(b^c^d)+k[9]-640364487|0;a=(a<<4|a>>>28)+b|0;d+=(a^b^c)+k[12]-421815835|0;d=(d<<11|d>>>21)+a|0;c+=(d^a^b)+k[15]+530742520|0;c=(c<<16|c>>>16)+d|0;b+=(c^d^a)+k[2]-995338651|0;b=(b<<23|b>>>9)+c|0;a+=(c^(b|~d))+k[0]-198630844|0;a=(a<<6|a>>>26)+b|0;d+=(b^(a|~c))+k[7]+1126891415|0;d=(d<<10|d>>>22)+a|0;c+=(a^(d|~b))+k[14]-1416354905|0;c=(c<<15|c>>>17)+d|0;b+=(d^(c|~a))+k[5]-57434055|0;b=(b<<21|b>>>11)+c|0;a+=(c^(b|~d))+k[12]+1700485571|0;a=(a<<6|a>>>26)+b|0;d+=(b^(a|~c))+k[3]-1894986606|0;d=(d<<10|d>>>22)+a|0;c+=(a^(d|~b))+k[10]-1051523|0;c=(c<<15|c>>>17)+d|0;b+=(d^(c|~a))+k[1]-2054922799|0;b=(b<<21|b>>>11)+c|0;a+=(c^(b|~d))+k[8]+1873313359|0;a=(a<<6|a>>>26)+b|0;d+=(b^(a|~c))+k[15]-30611744|0;d=(d<<10|d>>>22)+a|0;c+=(a^(d|~b))+k[6]-1560198380|0;c=(c<<15|c>>>17)+d|0;b+=(d^(c|~a))+k[13]+1309151649|0;b=(b<<21|b>>>11)+c|0;a+=(c^(b|~d))+k[4]-145523070|0;a=(a<<6|a>>>26)+b|0;d+=(b^(a|~c))+k[11]-1120210379|0;d=(d<<10|d>>>22)+a|0;c+=(a^(d|~b))+k[2]+718787259|0;c=(c<<15|c>>>17)+d|0;b+=(d^(c|~a))+k[9]-343485551|0;b=(b<<21|b>>>11)+c|0;x[0]=a+x[0]|0;x[1]=b+x[1]|0;x[2]=c+x[2]|0;x[3]=d+x[3]|0}function md5blk(s){var md5blks=[],i;for(i=0;i<64;i+=4){md5blks[i>>2]=s.charCodeAt(i)+(s.charCodeAt(i+1)<<8)+(s.charCodeAt(i+2)<<16)+(s.charCodeAt(i+3)<<24)}return md5blks}function md5blk_array(a){var md5blks=[],i;for(i=0;i<64;i+=4){md5blks[i>>2]=a[i]+(a[i+1]<<8)+(a[i+2]<<16)+(a[i+3]<<24)}return md5blks}function md51(s){var n=s.length,state=[1732584193,-271733879,-1732584194,271733878],i,length,tail,tmp,lo,hi;for(i=64;i<=n;i+=64){md5cycle(state,md5blk(s.substring(i-64,i)))}s=s.substring(i-64);length=s.length;tail=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(i=0;i>2]|=s.charCodeAt(i)<<(i%4<<3)}tail[i>>2]|=128<<(i%4<<3);if(i>55){md5cycle(state,tail);for(i=0;i<16;i+=1){tail[i]=0}}tmp=n*8;tmp=tmp.toString(16).match(/(.*?)(.{0,8})$/);lo=parseInt(tmp[2],16);hi=parseInt(tmp[1],16)||0;tail[14]=lo;tail[15]=hi;md5cycle(state,tail);return state}function md51_array(a){var n=a.length,state=[1732584193,-271733879,-1732584194,271733878],i,length,tail,tmp,lo,hi;for(i=64;i<=n;i+=64){md5cycle(state,md5blk_array(a.subarray(i-64,i)))}a=i-64>2]|=a[i]<<(i%4<<3)}tail[i>>2]|=128<<(i%4<<3);if(i>55){md5cycle(state,tail);for(i=0;i<16;i+=1){tail[i]=0}}tmp=n*8;tmp=tmp.toString(16).match(/(.*?)(.{0,8})$/);lo=parseInt(tmp[2],16);hi=parseInt(tmp[1],16)||0;tail[14]=lo;tail[15]=hi;md5cycle(state,tail);return state}function rhex(n){var s="",j;for(j=0;j<4;j+=1){s+=hex_chr[n>>j*8+4&15]+hex_chr[n>>j*8&15]}return s}function hex(x){var i;for(i=0;i>16)+(y>>16)+(lsw>>16);return msw<<16|lsw&65535}}if(typeof ArrayBuffer!=="undefined"&&!ArrayBuffer.prototype.slice){(function(){function clamp(val,length){val=val|0||0;if(val<0){return Math.max(val+length,0)}return Math.min(val,length)}ArrayBuffer.prototype.slice=function(from,to){var length=this.byteLength,begin=clamp(from,length),end=length,num,target,targetArray,sourceArray;if(to!==undefined){end=clamp(to,length)}if(begin>end){return new ArrayBuffer(0)}num=end-begin;target=new ArrayBuffer(num);targetArray=new Uint8Array(target);sourceArray=new Uint8Array(this,begin,num);targetArray.set(sourceArray);return target}})()}function toUtf8(str){if(/[\u0080-\uFFFF]/.test(str)){str=unescape(encodeURIComponent(str))}return str}function utf8Str2ArrayBuffer(str,returnUInt8Array){var length=str.length,buff=new ArrayBuffer(length),arr=new Uint8Array(buff),i;for(i=0;i>2]|=buff.charCodeAt(i)<<(i%4<<3)}this._finish(tail,length);ret=hex(this._hash);if(raw){ret=hexToBinaryString(ret)}this.reset();return ret};SparkMD5.prototype.reset=function(){this._buff="";this._length=0;this._hash=[1732584193,-271733879,-1732584194,271733878];return this};SparkMD5.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}};SparkMD5.prototype.setState=function(state){this._buff=state.buff;this._length=state.length;this._hash=state.hash;return this};SparkMD5.prototype.destroy=function(){delete this._hash;delete this._buff;delete this._length};SparkMD5.prototype._finish=function(tail,length){var i=length,tmp,lo,hi;tail[i>>2]|=128<<(i%4<<3);if(i>55){md5cycle(this._hash,tail);for(i=0;i<16;i+=1){tail[i]=0}}tmp=this._length*8;tmp=tmp.toString(16).match(/(.*?)(.{0,8})$/);lo=parseInt(tmp[2],16);hi=parseInt(tmp[1],16)||0;tail[14]=lo;tail[15]=hi;md5cycle(this._hash,tail)};SparkMD5.hash=function(str,raw){return SparkMD5.hashBinary(toUtf8(str),raw)};SparkMD5.hashBinary=function(content,raw){var hash=md51(content),ret=hex(hash);return raw?hexToBinaryString(ret):ret};SparkMD5.ArrayBuffer=function(){this.reset()};SparkMD5.ArrayBuffer.prototype.append=function(arr){var buff=concatenateArrayBuffers(this._buff.buffer,arr,true),length=buff.length,i;this._length+=arr.byteLength;for(i=64;i<=length;i+=64){md5cycle(this._hash,md5blk_array(buff.subarray(i-64,i)))}this._buff=i-64>2]|=buff[i]<<(i%4<<3)}this._finish(tail,length);ret=hex(this._hash);if(raw){ret=hexToBinaryString(ret)}this.reset();return ret};SparkMD5.ArrayBuffer.prototype.reset=function(){this._buff=new Uint8Array(0);this._length=0;this._hash=[1732584193,-271733879,-1732584194,271733878];return this};SparkMD5.ArrayBuffer.prototype.getState=function(){var state=SparkMD5.prototype.getState.call(this);state.buff=arrayBuffer2Utf8Str(state.buff);return state};SparkMD5.ArrayBuffer.prototype.setState=function(state){state.buff=utf8Str2ArrayBuffer(state.buff,true);return SparkMD5.prototype.setState.call(this,state)};SparkMD5.ArrayBuffer.prototype.destroy=SparkMD5.prototype.destroy;SparkMD5.ArrayBuffer.prototype._finish=SparkMD5.prototype._finish;SparkMD5.ArrayBuffer.hash=function(arr,raw){var hash=md51_array(new Uint8Array(arr)),ret=hex(hash);return raw?hexToBinaryString(ret):ret};return SparkMD5}); diff --git a/weixin-miniprogram/utils/util.js b/weixin-miniprogram/utils/util.js new file mode 100644 index 0000000..c21fddb --- /dev/null +++ b/weixin-miniprogram/utils/util.js @@ -0,0 +1,27 @@ +const formatTime = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + + return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}` +} + +const formatDate = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + + return [year, month, day].map(formatNumber).join('-') +} + +const formatNumber = n => { + n = n.toString() + return n[1] ? n : `0${n}` +} + +module.exports = { + formatTime +}