├── .gitignore ├── LICENSE ├── README.md ├── cloudfunctionTemplate └── cloud.json ├── cloudfunctions └── cloud │ ├── config.json │ ├── config │ ├── biz_config.js │ ├── config.js │ ├── msg_config.js │ └── route.js │ ├── framework │ ├── client │ │ └── controller.js │ ├── cloud │ │ ├── cloud_base.js │ │ └── cloud_util.js │ ├── core │ │ ├── app_code.js │ │ ├── app_error.js │ │ ├── app_job.js │ │ ├── app_other.js │ │ ├── app_util.js │ │ └── application.js │ ├── database │ │ ├── db_util.js │ │ ├── model.js │ │ └── mysql_util.js │ ├── lib │ │ ├── faker_lib.js │ │ ├── http_lib.js │ │ ├── md5_lib.js │ │ └── mini_lib.js │ ├── utils │ │ ├── cache_util.js │ │ ├── constant.js │ │ ├── data_util.js │ │ ├── log_util.js │ │ ├── math_util.js │ │ ├── time_util.js │ │ └── util.js │ └── validate │ │ ├── content_check.js │ │ └── data_check.js │ ├── index.js │ ├── package-lock.json │ ├── package.json │ └── project │ ├── controller │ ├── admin │ │ ├── admin_export_controller.js │ │ ├── admin_home_controller.js │ │ ├── admin_meet_controller.js │ │ ├── admin_mgr_controller.js │ │ ├── admin_news_controller.js │ │ ├── admin_order_controller.js │ │ ├── admin_setup_controller.js │ │ ├── admin_user_controller.js │ │ └── base_admin_controller.js │ ├── base_controller.js │ ├── check_controller.js │ ├── home_controller.js │ ├── meet_controller.js │ ├── my_controller.js │ ├── news_controller.js │ ├── passport_controller.js │ └── test │ │ ├── test_controller.js │ │ └── test_meet_controller.js │ ├── model │ ├── admin_model.js │ ├── base_model.js │ ├── cache_model.js │ ├── day_model.js │ ├── export_model.js │ ├── join_model.js │ ├── log_model.js │ ├── meet_model.js │ ├── news_model.js │ ├── setup_model.js │ ├── temp_model.js │ └── user_model.js │ └── service │ ├── admin │ ├── admin_export_service.js │ ├── admin_home_service.js │ ├── admin_meet_service.js │ ├── admin_mgr_service.js │ ├── admin_news_service.js │ ├── admin_setup_service.js │ ├── admin_temp_service.js │ ├── admin_user_service.js │ └── base_admin_service.js │ ├── base_service.js │ ├── data_service.js │ ├── home_service.js │ ├── meet_service.js │ ├── news_service.js │ └── passport_service.js ├── demo ├── 二维码.png ├── 储物柜预约.png ├── 填报预约.png ├── 工单.png ├── 我的.png ├── 日历.png ├── 自习室预约.png ├── 菜单.png ├── 预约成.png ├── 预约添加.png ├── 预约管理.png ├── 预约规则.png ├── 预约详情.png └── 首页.png ├── miniprogram ├── app.js ├── app.json ├── app.wxss ├── behavior │ ├── about_contact_bh.js │ ├── about_index_bh.js │ ├── calendar_index_bh.js │ ├── default_index_bh.js │ ├── meet_detail_bh.js │ ├── meet_index_bh.js │ ├── meet_join_bh.js │ ├── meet_self_bh.js │ ├── my_edit_bh.js │ ├── my_index_bh.js │ ├── my_join_bh.js │ ├── my_join_detail_bh.js │ ├── news_detail_bh.js │ ├── news_index_bh.js │ ├── public_hint_bh.js │ └── search_bh.js ├── biz │ ├── admin_biz.js │ ├── admin_meet_biz.js │ ├── admin_news_biz.js │ ├── base_biz.js │ ├── biz_helper.js │ ├── constants.js │ ├── meet_biz.js │ ├── news_biz.js │ ├── passport_biz.js │ └── search_biz.js ├── cmpts │ ├── biz │ │ ├── foot │ │ │ ├── foot_cmpt.js │ │ │ ├── foot_cmpt.json │ │ │ ├── foot_cmpt.wxml │ │ │ └── foot_cmpt.wxss │ │ └── test │ │ │ ├── test_cmpt.js │ │ │ ├── test_cmpt.json │ │ │ ├── test_cmpt.wxml │ │ │ └── test_cmpt.wxss │ ├── lib │ │ └── wxa-plugin-canvas │ │ │ ├── index │ │ │ ├── index.js │ │ │ ├── index.json │ │ │ ├── index.wxml │ │ │ └── index.wxss │ │ │ └── poster │ │ │ ├── index.js │ │ │ ├── index.json │ │ │ ├── index.wxml │ │ │ ├── index.wxss │ │ │ └── poster.js │ └── public │ │ ├── calendar │ │ ├── calendar_comm │ │ │ ├── calendar_comm_cmpt.js │ │ │ ├── calendar_comm_cmpt.json │ │ │ ├── calendar_comm_cmpt.wxml │ │ │ ├── calendar_comm_cmpt.wxss │ │ │ └── din.wxss │ │ ├── calendar_lib.js │ │ └── calendar_meet │ │ │ ├── calendar_meet_cmpt.js │ │ │ ├── calendar_meet_cmpt.json │ │ │ ├── calendar_meet_cmpt.wxml │ │ │ └── calendar_meet_cmpt.wxss │ │ ├── checkbox │ │ ├── checkbox_cmpt.js │ │ ├── checkbox_cmpt.json │ │ ├── checkbox_cmpt.wxml │ │ └── checkbox_cmpt.wxss │ │ ├── editor │ │ ├── editor_cmpt.js │ │ ├── editor_cmpt.json │ │ ├── editor_cmpt.wxml │ │ └── editor_cmpt.wxss │ │ ├── form │ │ ├── form_set │ │ │ ├── field │ │ │ │ ├── form_set_field.js │ │ │ │ ├── form_set_field.json │ │ │ │ ├── form_set_field.wxml │ │ │ │ └── form_set_field.wxss │ │ │ ├── form_set_cmpt.js │ │ │ ├── form_set_cmpt.json │ │ │ ├── form_set_cmpt.wxml │ │ │ └── form_set_cmpt.wxss │ │ ├── form_set_helper.js │ │ └── form_show │ │ │ ├── form_show_cmpt.js │ │ │ ├── form_show_cmpt.json │ │ │ ├── form_show_cmpt.wxml │ │ │ └── form_show_cmpt.wxss │ │ ├── img │ │ ├── img_upload_cmpt.js │ │ ├── img_upload_cmpt.json │ │ ├── img_upload_cmpt.wxml │ │ └── img_upload_cmpt.wxss │ │ ├── list │ │ ├── comm_list_cmpt.js │ │ ├── comm_list_cmpt.json │ │ ├── comm_list_cmpt.wxml │ │ └── comm_list_cmpt.wxss │ │ ├── modal │ │ ├── modal_cmpt.js │ │ ├── modal_cmpt.json │ │ ├── modal_cmpt.wxml │ │ └── modal_cmpt.wxss │ │ ├── picker │ │ ├── picker_cmpt.js │ │ ├── picker_cmpt.json │ │ ├── picker_cmpt.wxml │ │ └── picker_cmpt.wxss │ │ ├── picker_multi │ │ ├── picker_multi_cmpt.js │ │ ├── picker_multi_cmpt.json │ │ ├── picker_multi_cmpt.wxml │ │ └── picker_multi_cmpt.wxss │ │ ├── picker_time │ │ ├── datetime_picker.js │ │ ├── picker_time_cmpt.js │ │ ├── picker_time_cmpt.json │ │ ├── picker_time_cmpt.wxml │ │ └── picker_time_cmpt.wxss │ │ ├── poster │ │ ├── images │ │ │ ├── friend.png │ │ │ └── wechat.png │ │ ├── poster_cmpt.js │ │ ├── poster_cmpt.json │ │ ├── poster_cmpt.wxml │ │ ├── poster_cmpt.wxss │ │ └── wxa-plugin-canvas │ │ │ ├── index │ │ │ ├── index.js │ │ │ ├── index.json │ │ │ ├── index.wxml │ │ │ └── index.wxss │ │ │ └── poster │ │ │ ├── index.js │ │ │ ├── index.json │ │ │ ├── index.wxml │ │ │ ├── index.wxss │ │ │ └── poster.js │ │ └── table │ │ ├── table_cmpt.js │ │ ├── table_cmpt.json │ │ ├── table_cmpt.wxml │ │ └── table_cmpt.wxss ├── helper │ ├── cache_helper.js │ ├── cloud_helper.js │ ├── content_check_helper.js │ ├── data_helper.js │ ├── file_helper.js │ ├── form_helper.js │ ├── helper.js │ ├── page_helper.js │ ├── pic_helper.js │ ├── sys_helper.js │ ├── time_helper.js │ └── validate.js ├── images │ └── default_cover_pic.gif ├── lib │ └── tools │ │ ├── base64_lib.js │ │ ├── lunar_lib.js │ │ └── qrcode_lib.js ├── pages │ └── admin │ │ ├── content │ │ ├── admin_content.js │ │ ├── admin_content.json │ │ ├── admin_content.wxml │ │ └── admin_content.wxss │ │ ├── index │ │ ├── home │ │ │ ├── admin_home.js │ │ │ ├── admin_home.json │ │ │ ├── admin_home.wxml │ │ │ └── admin_home.wxss │ │ └── login │ │ │ ├── admin_login.js │ │ │ ├── admin_login.json │ │ │ ├── admin_login.wxml │ │ │ └── admin_login.wxss │ │ ├── meet │ │ ├── content │ │ │ ├── admin_meet_content.js │ │ │ ├── admin_meet_content.json │ │ │ ├── admin_meet_content.wxml │ │ │ └── admin_meet_content.wxss │ │ ├── cover │ │ │ ├── admin_meet_cover.js │ │ │ ├── admin_meet_cover.json │ │ │ ├── admin_meet_cover.wxml │ │ │ └── admin_meet_cover.wxss │ │ ├── edit │ │ │ ├── admin_meet_edit.js │ │ │ ├── admin_meet_edit.json │ │ │ ├── admin_meet_edit.wxml │ │ │ └── admin_meet_edit.wxss │ │ ├── export │ │ │ ├── admin_join_export.js │ │ │ ├── admin_join_export.json │ │ │ ├── admin_join_export.wxml │ │ │ └── admin_join_export.wxss │ │ ├── join │ │ │ ├── admin_meet_join.js │ │ │ ├── admin_meet_join.json │ │ │ ├── admin_meet_join.wxml │ │ │ └── admin_meet_join.wxss │ │ ├── list │ │ │ ├── admin_meet_list.js │ │ │ ├── admin_meet_list.json │ │ │ ├── admin_meet_list.wxml │ │ │ └── admin_meet_list.wxss │ │ ├── record │ │ │ ├── admin_record_list.js │ │ │ ├── admin_record_list.json │ │ │ ├── admin_record_list.wxml │ │ │ └── admin_record_list.wxss │ │ ├── scan │ │ │ ├── admin_meet_scan.js │ │ │ ├── admin_meet_scan.json │ │ │ ├── admin_meet_scan.wxml │ │ │ └── admin_meet_scan.wxss │ │ ├── self │ │ │ ├── admin_meet_self.js │ │ │ ├── admin_meet_self.json │ │ │ ├── admin_meet_self.wxml │ │ │ └── admin_meet_self.wxss │ │ ├── temp │ │ │ ├── admin_temp_select.js │ │ │ ├── admin_temp_select.json │ │ │ ├── admin_temp_select.wxml │ │ │ └── admin_temp_select.wxss │ │ └── time │ │ │ ├── admin_meet_time.js │ │ │ ├── admin_meet_time.json │ │ │ ├── admin_meet_time.wxml │ │ │ └── admin_meet_time.wxss │ │ ├── mgr │ │ └── log │ │ │ ├── admin_log_list.js │ │ │ ├── admin_log_list.json │ │ │ ├── admin_log_list.wxml │ │ │ └── admin_log_list.wxss │ │ ├── news │ │ ├── add │ │ │ ├── admin_news_add.js │ │ │ ├── admin_news_add.json │ │ │ ├── admin_news_add.wxml │ │ │ └── admin_news_add.wxss │ │ ├── admin_news_form_tpl.wxml │ │ ├── content │ │ │ ├── admin_news_content.js │ │ │ ├── admin_news_content.json │ │ │ ├── admin_news_content.wxml │ │ │ └── admin_news_content.wxss │ │ ├── edit │ │ │ ├── admin_news_edit.js │ │ │ ├── admin_news_edit.json │ │ │ ├── admin_news_edit.wxml │ │ │ └── admin_news_edit.wxss │ │ └── list │ │ │ ├── admin_news_list.js │ │ │ ├── admin_news_list.json │ │ │ ├── admin_news_list.wxml │ │ │ └── admin_news_list.wxss │ │ ├── setup │ │ ├── about │ │ │ ├── admin_setup_about.js │ │ │ ├── admin_setup_about.json │ │ │ ├── admin_setup_about.wxml │ │ │ └── admin_setup_about.wxss │ │ ├── contact │ │ │ ├── admin_setup_contact.js │ │ │ ├── admin_setup_contact.json │ │ │ ├── admin_setup_contact.wxml │ │ │ └── admin_setup_contact.wxss │ │ └── qr │ │ │ ├── admin_setup_qr.js │ │ │ ├── admin_setup_qr.json │ │ │ ├── admin_setup_qr.wxml │ │ │ └── admin_setup_qr.wxss │ │ └── user │ │ ├── export │ │ ├── admin_user_export.js │ │ ├── admin_user_export.json │ │ ├── admin_user_export.wxml │ │ └── admin_user_export.wxss │ │ └── list │ │ ├── admin_user_list.js │ │ ├── admin_user_list.json │ │ ├── admin_user_list.wxml │ │ └── admin_user_list.wxss ├── projects │ └── A00 │ │ ├── about │ │ ├── contact │ │ │ ├── about_contact.js │ │ │ ├── about_contact.json │ │ │ ├── about_contact.wxml │ │ │ └── about_contact.wxss │ │ └── index │ │ │ ├── about_index.js │ │ │ ├── about_index.json │ │ │ ├── about_index.wxml │ │ │ └── about_index.wxss │ │ ├── calendar │ │ └── index │ │ │ ├── calendar_index.js │ │ │ ├── calendar_index.json │ │ │ ├── calendar_index.wxml │ │ │ └── calendar_index.wxss │ │ ├── default │ │ └── index │ │ │ ├── default_index.js │ │ │ ├── default_index.json │ │ │ ├── default_index.wxml │ │ │ └── default_index.wxss │ │ ├── meet │ │ ├── detail │ │ │ ├── meet_detail.js │ │ │ ├── meet_detail.json │ │ │ ├── meet_detail.wxml │ │ │ └── meet_detail.wxss │ │ ├── index │ │ │ ├── meet_index.js │ │ │ ├── meet_index.json │ │ │ ├── meet_index.wxml │ │ │ └── meet_index.wxss │ │ ├── join │ │ │ ├── meet_join.js │ │ │ ├── meet_join.json │ │ │ ├── meet_join.wxml │ │ │ └── meet_join.wxss │ │ └── self │ │ │ ├── meet_self.js │ │ │ ├── meet_self.json │ │ │ ├── meet_self.wxml │ │ │ └── meet_self.wxss │ │ ├── my │ │ ├── edit │ │ │ ├── my_edit.js │ │ │ ├── my_edit.json │ │ │ ├── my_edit.wxml │ │ │ └── my_edit.wxss │ │ ├── index │ │ │ ├── my_index.js │ │ │ ├── my_index.json │ │ │ ├── my_index.wxml │ │ │ └── my_index.wxss │ │ ├── join │ │ │ ├── my_join.js │ │ │ ├── my_join.json │ │ │ ├── my_join.wxml │ │ │ └── my_join.wxss │ │ └── join_detail │ │ │ ├── my_join_detail.js │ │ │ ├── my_join_detail.json │ │ │ ├── my_join_detail.wxml │ │ │ └── my_join_detail.wxss │ │ ├── news │ │ ├── cate1 │ │ │ ├── news_cate1.js │ │ │ ├── news_cate1.json │ │ │ ├── news_cate1.wxml │ │ │ └── news_cate1.wxss │ │ ├── cate2 │ │ │ ├── news_cate2.js │ │ │ ├── news_cate2.json │ │ │ ├── news_cate2.wxml │ │ │ └── news_cate2.wxss │ │ ├── detail │ │ │ ├── news_detail.js │ │ │ ├── news_detail.json │ │ │ ├── news_detail.wxml │ │ │ └── news_detail.wxss │ │ └── index │ │ │ ├── news_index.js │ │ │ ├── news_index.json │ │ │ ├── news_index.wxml │ │ │ └── news_index.wxss │ │ ├── search │ │ ├── search.js │ │ ├── search.json │ │ ├── search.wxml │ │ └── search.wxss │ │ └── skin │ │ ├── images │ │ ├── default_index_bg.jpg │ │ ├── menu │ │ │ ├── meet_1.png │ │ │ ├── meet_2.png │ │ │ └── news_1.png │ │ └── tabbar │ │ │ ├── cate1.png │ │ │ ├── cate1_cur.png │ │ │ ├── day.png │ │ │ ├── day_cur.png │ │ │ ├── home.png │ │ │ ├── home_cur.png │ │ │ ├── my.png │ │ │ └── my_cur.png │ │ ├── skin.js │ │ └── skin.wxss ├── setting │ └── setting.js ├── sitemap.json ├── style │ ├── comm │ │ ├── animation.wxss │ │ ├── avatar.wxss │ │ ├── background.wxss │ │ ├── bar.wxss │ │ ├── base.wxss │ │ ├── border.wxss │ │ ├── button.wxss │ │ ├── comm.wxss │ │ ├── form.wxss │ │ ├── icon.wxss │ │ ├── image.wxss │ │ ├── layout.wxss │ │ ├── list.wxss │ │ ├── load.wxss │ │ ├── modal.wxss │ │ ├── nav.wxss │ │ ├── shadow.wxss │ │ ├── table.wxss │ │ ├── tag.wxss │ │ └── text.wxss │ └── project │ │ ├── about_contact_base.wxss │ │ ├── about_index_base.wxss │ │ ├── base │ │ ├── admin.wxss │ │ ├── appt.wxss │ │ ├── article_list.wxss │ │ ├── detail.wxss │ │ └── project.wxss │ │ ├── calendar_index_base.wxss │ │ ├── default_index_base.wxss │ │ ├── meet_detail_base.wxss │ │ ├── meet_index_base.wxss │ │ ├── meet_join_base.wxss │ │ ├── meet_self_base.wxss │ │ ├── my_edit_base.wxss │ │ ├── my_index_base.wxss │ │ ├── my_join_base.wxss │ │ ├── my_join_detail_base.wxss │ │ ├── news_detail_base.wxss │ │ ├── news_index_base.wxss │ │ └── search_base.wxss └── tpls │ ├── project │ ├── about_contact_tpl.wxml │ ├── about_index_tpl.wxml │ ├── calendar_index_tpl.wxml │ ├── default_index_tpl.wxml │ ├── meet_detail_tpl.wxml │ ├── meet_index_tpl.wxml │ ├── meet_join_tpl.wxml │ ├── meet_self_tpl.wxml │ ├── my_edit_tpl.wxml │ ├── my_index_tpl.wxml │ ├── my_join_detail_tpl.wxml │ ├── my_join_tpl.wxml │ ├── news_detail_tpl.wxml │ ├── news_index_tpl.wxml │ └── search_tpl.wxml │ ├── public │ ├── base_list_tpl.wxml │ ├── list_load_tpl.wxml │ ├── menu_tpl.wxml │ └── top_tpl.wxml │ └── wxs │ └── tools.wxs ├── project.config.json ├── project.private.config.json └── 自习室小程序安装使用手册.docx /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows 2 | [Dd]esktop.ini 3 | Thumbs.db 4 | $RECYCLE.BIN/ 5 | 6 | # macOS 7 | .DS_Store 8 | .fseventsd 9 | .Spotlight-V100 10 | .TemporaryItems 11 | .Trashes 12 | 13 | # Node.js 14 | node_modules/ 15 | init/ -------------------------------------------------------------------------------- /cloudfunctionTemplate/cloud.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "测试", 4 | "value": { 5 | "route": "test/test", 6 | "pid": "DEMO2" 7 | } 8 | }, 9 | { 10 | "name": "OA模拟", 11 | "value": { 12 | "CreateTime": 0, 13 | "Event": "subscribe", 14 | "EventKey": "", 15 | "FromUserName": "os85tuO2OaiWSHPi2UECnU5TlDrk", 16 | "MsgType": "event", 17 | "ToUserName": "gh_12824cfe1b7b", 18 | "userInfo": { 19 | "appId": "wx1a3ad7903d85f33a", 20 | "openId": "os85tuO2OaiWSHPi2UECnU5TlDrk" 21 | } 22 | } 23 | }, 24 | { 25 | "name": "支付回调", 26 | "value": { 27 | "outTradeNo": "X20211128170943-T0-M999900-pb95y", 28 | "transactionId": "transactionId1", 29 | "userInfo": { 30 | "openId": "userid3243l4l3j24324324" 31 | } 32 | } 33 | }, 34 | { 35 | "name": "MEET JOIN 测试", 36 | "value": { 37 | "route": "test/meet_test_join", 38 | "pid": "DEMO2" 39 | } 40 | } 41 | ] -------------------------------------------------------------------------------- /cloudfunctions/cloud/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "permissions": { 3 | "openapi": ["wxacode.getUnlimited", "security.imgSecCheck", "security.msgSecCheck","serviceMarket.invokeService"] 4 | } 5 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/config/biz_config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 本模块业务相关公用 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2022-01-23 19:20:00 5 | */ 6 | 7 | 8 | module.exports = { 9 | 10 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/config/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | //### 环境相关 4 | CLOUD_ID: 'dev-5gf0o85o226fad1d', //你的云环境id 5 | 6 | ADMIN_NAME: 'admin', // 管理员账号(5-30位) 7 | ADMIN_PWD: '123456', // 管理员密码(5-30位) 8 | 9 | 10 | // ################################################################## 11 | PID: 'A00', 12 | IS_DEMO: false, 13 | 14 | NEWS_CATE: '1=预约规则', 15 | MEET_TYPE: '1=自习室预约,2=储物柜预约', 16 | // ################################################################## 17 | // #### 调试相关 18 | TEST_MODE: false, 19 | TEST_TOKEN_ID: '', 20 | 21 | COLLECTION_NAME: 'ax_admin|ax_cache|ax_day|ax_export|ax_join|ax_log|ax_meet|ax_news|ax_setup|ax_temp|ax_user', 22 | 23 | DATA_EXPORT_PATH: 'export/', //数据导出路径 24 | MEET_TIMEMARK_QR_PATH: 'meet/usercheckin/', //用户签到码路径 25 | SETUP_PATH: 'setup/', 26 | 27 | // ## 缓存相关 28 | IS_CACHE: true, //是否开启缓存 29 | CACHE_CALENDAR_TIME: 60 * 30, //日历缓存 30 | 31 | // #### 内容安全 32 | CLIENT_CHECK_CONTENT: false, //前台图片文字是否校验 33 | ADMIN_CHECK_CONTENT: false, //后台图片文字是否校验 34 | 35 | // #### 预约相关 36 | MEET_LOG_LEVEL: 'debug', 37 | 38 | // ### 后台业务相关 39 | ADMIN_LOGIN_EXPIRE: 86400, //管理员token过期时间 (秒) 40 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/config/msg_config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 消息提醒配置 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-11-11 14:00:00 5 | */ 6 | 7 | module.exports = { 8 | 9 | /** 10 | * 打卡提醒 (20647 工具>>备忘录) 11 | * 计划名称 {{thing1.DATA}} 12 | * 完成进度 {{thing2.DATA}} 13 | * 备注 {{thing3.DATA}} 14 | * 上次打卡时间 {{time4.DATA}} 15 | * 16 | */ 17 | MINI_TEMP_CARD_HAS_TIME: 'VCb4GZ-3yK5j66iVxOH5U1MClzXd2f97vFTYlN-K5JU', //有打卡时间 18 | MINI_TEMP_CARD_NO_TIME: 'VCb4GZ-3yK5j66iVxOH5U3wurLqu2QjwYCSyDgn5CTw', //无打卡时间 19 | 20 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/client/controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 基础控制器 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat) 4 | * Date: 2020-09-05 04:00:00 5 | */ 6 | class Controller { 7 | 8 | constructor(route, openId, event) { 9 | this._route = route; // 路由 10 | this._openId = openId; //用户身份 11 | this._event = event; // 所有参数 12 | this._request = event.params; //数据参数 13 | 14 | } 15 | } 16 | 17 | module.exports = Controller; -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/cloud/cloud_base.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 云初始化实例 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat) 4 | * Date: 2020-09-05 04:00:00 5 | */ 6 | 7 | const config = require('../../config/config.js'); 8 | 9 | /** 10 | * 获得云实例 11 | */ 12 | function getCloud() { 13 | const cloud = require('wx-server-sdk'); 14 | cloud.init({ 15 | env: config.CLOUD_ID 16 | }); 17 | return cloud; 18 | } 19 | 20 | module.exports = { 21 | getCloud 22 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/core/app_code.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 错误代码定义 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-09-05 04:00:00 5 | */ 6 | module.exports = { 7 | SUCC: 200, 8 | SVR: 500, // 服务器错误 9 | LOGIC: 1600, //逻辑错误 10 | DATA: 1301, // 数据校验错误 11 | HEADER: 1302, // header 校验错误 12 | 13 | 14 | //2000开始为业务错误代码, 15 | 16 | ADMIN_ERROR: 2401 //管理员错误 17 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/core/app_error.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 应用异常处理类 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-09-05 04:00:00 5 | */ 6 | 7 | 8 | const appCode = require('./app_code.js'); 9 | 10 | class AppError extends Error { 11 | constructor(message, code = appCode.LOGIC) { 12 | super(message); 13 | this.name = 'AppError'; 14 | this.code = code; 15 | } 16 | } 17 | 18 | module.exports = AppError; -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/core/app_other.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 云函数非标业务处理 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-10-21 04:00:00 5 | */ 6 | 7 | function handlerOther(event) { 8 | let isOther = false; 9 | 10 | if (!event) return { 11 | isOther, 12 | eventX 13 | }; 14 | 15 | // 公众号事件处理 16 | if (event['FromUserName'] && event['MsgType']) { 17 | console.log('公众号事件处理'); 18 | let ret = { 19 | route: 'oa/serve', 20 | params: event 21 | } 22 | return { 23 | isOther: true, 24 | eventX: ret 25 | }; 26 | } 27 | 28 | return { 29 | isOther, 30 | eventX: event 31 | }; 32 | } 33 | 34 | 35 | module.exports = { 36 | handlerOther, 37 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/core/app_util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 云函数业务主逻辑函数 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-02-09 04:00:00 5 | */ 6 | 7 | const appCode = require('./app_code.js'); 8 | 9 | function handlerBasic(code, msg = '', data = {}) { 10 | 11 | switch (code) { 12 | case appCode.SUCC: 13 | msg = (msg) ? msg + ':ok' : 'ok'; 14 | break; 15 | case appCode.SVR: 16 | msg = '服务器繁忙,请稍后再试'; 17 | break; 18 | case appCode.LOGIC: 19 | break; 20 | case appCode.DATA: 21 | break; 22 | 23 | /* 24 | default: 25 | msg = '服务器开小差了,请稍后再试'; 26 | break;*/ 27 | } 28 | 29 | return { 30 | code: code, 31 | msg: msg, 32 | data: data 33 | } 34 | 35 | } 36 | 37 | function handlerSvrErr(msg = '') { 38 | return handlerBasic(appCode.SVR, msg); 39 | } 40 | 41 | function handlerSucc(msg = '') { 42 | return handlerBasic(appCode.SUCC, msg); 43 | } 44 | 45 | function handlerAppErr(msg = '', code = appCode.LOGIC) { 46 | return handlerBasic(code, msg); 47 | } 48 | 49 | 50 | function handlerData(data, msg = '') { 51 | return handlerBasic(appCode.SUCC, msg, data); 52 | } 53 | 54 | module.exports = { 55 | handlerBasic, 56 | handlerData, 57 | handlerSucc, 58 | handlerSvrErr, 59 | handlerAppErr 60 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/lib/mini_lib.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 小程序封装类库 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-09-06 14:00:00 5 | */ 6 | const cloudBase = require('../cloud/cloud_base.js'); 7 | const cloudUtil = require('../cloud/cloud_util.js'); 8 | const config = require('../../config/config'); 9 | 10 | 11 | // 消息长度截取 12 | function fmtThing(str) { //20个以内字符,可汉字、数字、字母或符号组合 13 | return str.substr(0, 20); 14 | } 15 | 16 | function fmtCharacterString(str) { //32位以内数字、字母或符号 17 | return str.substr(0, 32); 18 | } 19 | 20 | function fmtPhrase(str) { //5个以内汉字 21 | return str.substr(0, 5); 22 | } 23 | 24 | 25 | 26 | /** 27 | * 发送一次性消息 28 | * @param {*} body 29 | * @param {*} key 30 | */ 31 | async function sendMiniOnceTempMsg(body, key = '') { 32 | // console.log('##sendOnceTempMsg[' + key + ']', body); 33 | let cloud = cloudBase.getCloud(); 34 | try { 35 | // 默认参数 36 | body.lang = 'zh_CN'; 37 | body.miniprogramState = 'formal'; 38 | 39 | await cloud.openapi.subscribeMessage.send(body); 40 | } catch (err) { 41 | cloudUtil.log('##sendOnceTempMsg[' + key + ']', err); 42 | } 43 | } 44 | module.exports = { 45 | sendMiniOnceTempMsg, 46 | 47 | fmtThing, 48 | fmtCharacterString, 49 | fmtPhrase 50 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/utils/constant.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 通用常量定义 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-09-05 04:00:00 5 | */ 6 | module.exports = { 7 | 8 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/utils/math_util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 数学计算相关操作函数 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-10-04 04:00:00 5 | */ 6 | 7 | 8 | /** 获取百分比, 保留2位小数 */ 9 | function percent(num1, num2) { 10 | return Math.round(num1 / num2 * 10000) / 100.00; 11 | } 12 | 13 | /** 数组对象排序 */ 14 | function arrayObjecSortAsc(property){ 15 | return function(a,b){ 16 | var value1 = a[property]; 17 | var value2 = b[property]; 18 | return value1 - value2; 19 | } 20 | } 21 | 22 | /** 数组对象排序 */ 23 | function arrayObjecSortDesc(property){ 24 | return function(a,b){ 25 | var value1 = a[property]; 26 | var value2 = b[property]; 27 | return value2 - value1; 28 | } 29 | } 30 | 31 | module.exports = { 32 | percent, // 百分比,保留2位小数 33 | arrayObjecSortAsc, // 数组对象排序 34 | arrayObjecSortDesc, // 数组对象排序 35 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/framework/utils/util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 通用工具函数 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-09-05 04:00:00 5 | */ 6 | 7 | /** 8 | * 判断变量,参数,对象属性是否定义 9 | * @param {*} val 10 | */ 11 | function isDefined(val) { 12 | // == 不能判断是否为null 13 | if (val === undefined) 14 | return false; 15 | else 16 | return true; 17 | } 18 | 19 | /** 20 | * 判断对象是否为空 21 | * @param {*} obj 22 | */ 23 | function isObjectNull(obj) { 24 | return (Object.keys(obj).length == 0); 25 | } 26 | 27 | 28 | 29 | /** 30 | * 休眠时间,配合await使用 31 | * @param {*} time 毫秒 32 | */ 33 | function sleep(time) { 34 | return new Promise((resolve) => setTimeout(resolve, time)); 35 | }; 36 | 37 | 38 | 39 | 40 | module.exports = { 41 | isDefined, //判断变量,参数,对象属性是否定义 42 | sleep, 43 | isObjectNull, 44 | 45 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/index.js: -------------------------------------------------------------------------------- 1 | const application = require('./framework/core/application.js'); 2 | 3 | // 云函数入口函数 4 | exports.main = async (event, context) => { 5 | return await application.app(event, context); 6 | } -------------------------------------------------------------------------------- /cloudfunctions/cloud/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloud", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "date-utils": "^1.2.21", 13 | "mysql": "^2.18.1", 14 | "node-xlsx": "^0.16.1", 15 | "wx-server-sdk": "~2.1.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/admin/admin_home_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 后台登录与首页模块 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | const BaseAdminController = require('./base_admin_controller.js'); 7 | const AdminHomeService = require('../../service/admin/admin_home_service.js'); 8 | 9 | class AdminHomeController extends BaseAdminController { 10 | 11 | 12 | // 管理首页 13 | async adminHome() { 14 | await this.isAdmin(); 15 | 16 | // 数据校验 17 | let rules = { 18 | 19 | }; 20 | 21 | // 取得数据 22 | let input = this.validateData(rules); 23 | 24 | let service = new AdminHomeService(); 25 | return await service.adminHome(); 26 | } 27 | 28 | // 清除缓存 29 | async clearCache() { 30 | let service = new AdminHomeService(); 31 | await service.clearCache(); 32 | } 33 | 34 | // 管理员登录 35 | async adminLogin() { 36 | 37 | // 数据校验 38 | let rules = { 39 | name: 'required|string|min:5|max:30|name=管理员名', 40 | pwd: 'required|string|min:5|max:30|name=密码', 41 | }; 42 | 43 | // 取得数据 44 | let input = this.validateData(rules); 45 | 46 | let service = new AdminHomeService(); 47 | return await service.adminLogin(input.name, input.pwd); 48 | } 49 | 50 | } 51 | 52 | module.exports = AdminHomeController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/admin/admin_mgr_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 管理员控制模块 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-07-11 10:20:00 5 | */ 6 | 7 | const BaseAdminController = require('./base_admin_controller.js'); 8 | const LogModel = require('../../model/log_model.js'); 9 | 10 | const AdminMgrService = require('../../service/admin/admin_mgr_service.js'); 11 | const timeUtil = require('../../../framework/utils/time_util.js'); 12 | const contentCheck = require('../../../framework/validate/content_check.js'); 13 | 14 | class AdminMgrController extends BaseAdminController { 15 | 16 | 17 | async getLogList() { 18 | await this.isAdmin(); 19 | 20 | // 数据校验 21 | let rules = { 22 | search: 'string|min:1|max:30|name=搜索条件', 23 | sortType: 'string|name=搜索类型', 24 | sortVal: 'name=搜索类型值', 25 | orderBy: 'object|name=排序', 26 | whereEx: 'object|name=附加查询条件', 27 | page: 'must|int|default=1', 28 | size: 'int', 29 | isTotal: 'bool', 30 | oldTotal: 'int', 31 | }; 32 | 33 | // 取得数据 34 | let input = this.validateData(rules); 35 | 36 | let service = new AdminMgrService(); 37 | let result = await service.getLogList(input); 38 | 39 | // 数据格式化 40 | let list = result.list; 41 | for (let k in list) { 42 | list[k].LOG_TYPE_DESC = LogModel.getDesc('TYPE', list[k].LOG_TYPE); 43 | list[k].LOG_ADD_TIME = timeUtil.timestamp2Time(list[k].LOG_ADD_TIME); 44 | } 45 | result.list = list; 46 | 47 | return result; 48 | 49 | } 50 | } 51 | 52 | module.exports = AdminMgrController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/admin/admin_setup_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 设置控制模块 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-07-11 10:20:00 5 | */ 6 | 7 | const BaseAdminController = require('./base_admin_controller.js'); 8 | const AdminSetupService = require('../../service/admin/admin_setup_service.js'); 9 | 10 | const contentCheck = require('../../../framework/validate/content_check.js'); 11 | 12 | class AdminSetupController extends BaseAdminController { 13 | 14 | 15 | /** 关于我们 */ 16 | async setupAbout() { 17 | await this.isAdmin(); 18 | 19 | // 数据校验 20 | let rules = { 21 | about: 'must|string|min:10|max:50000|name=关于我们', 22 | aboutPic: 'array|name=介绍图片', 23 | }; 24 | 25 | // 取得数据 26 | let input = this.validateData(rules); 27 | let service = new AdminSetupService(); 28 | await service.setupAbout(input); 29 | 30 | } 31 | 32 | /** 联系我们 */ 33 | async setupContact() { 34 | await this.isAdmin(); 35 | 36 | // 数据校验 37 | let rules = { 38 | phone: 'string|name=电话', 39 | address: 'string|name=地址', 40 | servicePic: 'array|name=客服二维码图片', 41 | officePic: 'array|name=官微二维码图片', 42 | }; 43 | 44 | // 取得数据 45 | let input = this.validateData(rules); 46 | let service = new AdminSetupService(); 47 | await service.setupContact(input); 48 | 49 | } 50 | 51 | async genMiniQr() { 52 | await this.isAdmin(); 53 | let service = new AdminSetupService(); 54 | return await service.genMiniQr(); 55 | } 56 | } 57 | 58 | module.exports = AdminSetupController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/admin/base_admin_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 后台管理控制模块 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | const BaseController = require('../base_controller.js'); 7 | const BaseAdminService = require('../../service/admin/base_admin_service.js'); 8 | 9 | const timeUtil = require('../../../framework/utils/time_util.js'); 10 | 11 | class AdminController extends BaseController { 12 | 13 | constructor(route, openId, event) { 14 | super(route, openId, event); 15 | 16 | // 当前时间戳 17 | this._timestamp = timeUtil.time(); 18 | 19 | this._admin = null; 20 | this._adminId = '0'; 21 | 22 | } 23 | 24 | /** 是否管理员 */ 25 | async isAdmin() { 26 | // 判断是否管理员 27 | let service = new BaseAdminService(); 28 | let admin = await service.isAdmin(this._token); 29 | this._admin = admin; 30 | this._adminId = admin.ADMIN_ID; 31 | } 32 | 33 | /** 是否超级管理员 */ 34 | async isSuperAdmin() { 35 | // 判断是否管理员 36 | let service = new BaseAdminService(); 37 | let admin = await service.isSuperAdmin(this._token); 38 | this._admin = admin; 39 | this._adminId = admin.ADMIN_ID; 40 | } 41 | 42 | /** 记录日志 */ 43 | async log(content, type) { 44 | let service = new BaseAdminService(); 45 | await service.insertLog(content, this._admin, type); 46 | } 47 | 48 | /**日志除前获取名称 */ 49 | async getNameBeforeLog(type, oid) { 50 | let service = new BaseAdminService(); 51 | return await service.getNameBeforeLog(type, oid); 52 | } 53 | 54 | } 55 | 56 | module.exports = AdminController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/check_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 内容检测控制器 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | const BaseController = require('./base_controller.js'); 7 | const contentCheck = require('../../framework/validate/content_check.js'); 8 | 9 | class CheckController extends BaseController { 10 | 11 | /** 12 | * 图片校验 13 | */ 14 | async checkImg() { 15 | 16 | // 数据校验 17 | let rules = { 18 | img: 'name=img', 19 | mine: 'must|default=jpg', 20 | }; 21 | 22 | // 取得数据 23 | let input = this.validateData(rules); 24 | 25 | return await contentCheck.checkImg(input.img, 'jpg'); 26 | 27 | } 28 | 29 | } 30 | 31 | module.exports = CheckController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/home_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 全局或者主页模块控制器 3 | * Date: 2020-11-05 10:20:00 4 | */ 5 | 6 | const BaseController = require('./base_controller.js'); 7 | const HomeService = require('../service/home_service.js'); 8 | const timeUtil = require('../../framework/utils/time_util.js'); 9 | const config = require('../../config/config.js'); 10 | 11 | class HomeController extends BaseController { 12 | 13 | /** 获取所有配置 */ 14 | async getSetupAll() { 15 | 16 | // 数据校验 17 | let rules = {}; 18 | 19 | // 取得数据 20 | let input = this.validateData(rules); 21 | 22 | let service = new HomeService(); 23 | let result = await service.getSetup('SETUP_ABOUT,SETUP_ABOUT_PIC,SETUP_ADDRESS,SETUP_OFFICE_PIC,SETUP_PHONE,SETUP_SERVICE_PIC'); 24 | 25 | return result; 26 | 27 | } 28 | } 29 | 30 | module.exports = HomeController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/my_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 用户中心模块控制器 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | const BaseController = require('./base_controller.js'); 7 | class MyController extends BaseController { 8 | 9 | 10 | 11 | 12 | } 13 | 14 | module.exports = MyController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/passport_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: passport模块控制器 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | const BaseController = require('./base_controller.js'); 7 | const PassportService = require('../service/passport_service.js'); 8 | const contentCheck = require('../../framework/validate/content_check.js'); 9 | const timeUtil = require('../../framework/utils/time_util.js'); 10 | const util = require('../../framework/utils/util.js'); 11 | const config = require('../../config/config.js'); 12 | 13 | class PassportController extends BaseController { 14 | 15 | /** 取得我的用户信息 */ 16 | async getMyDetail() { 17 | let service = new PassportService(); 18 | return await service.getMyDetail(this._userId); 19 | } 20 | 21 | /** 获取手机号码 */ 22 | async getPhone() { 23 | 24 | // 数据校验 25 | let rules = { 26 | cloudID: 'must|string|min:1|max:200|name=cloudID', 27 | }; 28 | 29 | // 取得数据 30 | let input = this.validateData(rules); 31 | 32 | 33 | let service = new PassportService(); 34 | return await service.getPhone(input.cloudID); 35 | } 36 | 37 | 38 | 39 | 40 | /** 修改用户资料 */ 41 | async editBase() { 42 | // 数据校验 43 | let rules = { 44 | name: 'must|string|min:1|max:20', 45 | mobile: 'must|mobile|name=手机', 46 | city: 'string|max:100|name=所在城市', 47 | work: 'string|max:100|name=所在单位', 48 | trade: 'string|max:100|name=行业领域', 49 | }; 50 | 51 | // 取得数据 52 | let input = this.validateData(rules); 53 | 54 | // 内容审核 55 | await contentCheck.checkTextMultiClient(input); 56 | 57 | let service = new PassportService(); 58 | return await service.editBase(this._userId, input); 59 | } 60 | 61 | } 62 | 63 | module.exports = PassportController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/controller/test/test_controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 测试模块控制器 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | const BaseController = require('../base_controller.js'); 7 | const config = require('../../../config/config.js'); 8 | class TestController { 9 | 10 | async test() { 11 | console.log('1111') 12 | 13 | let userId = 'userid3243l4l3j24324324'; 14 | 15 | console.log(__filename); 16 | } 17 | 18 | } 19 | 20 | module.exports = TestController; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/admin_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 系统管理员实体 3 | * Date: 2021-03-15 19:20:00 4 | */ 5 | 6 | 7 | const BaseModel = require('./base_model.js'); 8 | 9 | class AdminModel extends BaseModel { 10 | 11 | } 12 | 13 | // 集合名 14 | AdminModel.CL = "ax_admin"; 15 | 16 | AdminModel.DB_STRUCTURE = { 17 | _pid: 'string|true', 18 | ADMIN_ID: 'string|true', 19 | ADMIN_NAME: 'string|true', 20 | ADMIN_PHONE: 'string|true|comment=登录电话', 21 | ADMIN_STATUS: 'int|true|default=1|comment=状态:0=禁用 1=启用', 22 | 23 | ADMIN_LOGIN_CNT: 'int|true|default=0|comment=登录次数', 24 | ADMIN_LOGIN_TIME: 'int|true|default=0|comment=最后登录时间', 25 | ADMIN_TYPE: 'int|true|default=0|comment=类型 0=普通管理员 1=超级管理员', 26 | 27 | ADMIN_TOKEN: 'string|false|comment=当前登录token', 28 | ADMIN_TOKEN_TIME: 'int|true|default=0|comment=当前登录token time', 29 | 30 | ADMIN_ADD_TIME: 'int|true', 31 | ADMIN_EDIT_TIME: 'int|true', 32 | ADMIN_ADD_IP: 'string|false', 33 | ADMIN_EDIT_IP: 'string|false', 34 | }; 35 | 36 | // 字段前缀 37 | AdminModel.FIELD_PREFIX = "ADMIN_"; 38 | 39 | 40 | 41 | 42 | 43 | 44 | module.exports = AdminModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/cache_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 缓存实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2022-01-26 19:20:00 5 | */ 6 | 7 | 8 | const BaseModel = require('./base_model.js'); 9 | 10 | class CacheModel extends BaseModel { 11 | 12 | } 13 | 14 | // 集合名 15 | CacheModel.CL = "ax_cache"; 16 | 17 | CacheModel.DB_STRUCTURE = { 18 | _pid: 'string|true', 19 | CACHE_ID: 'string|true', 20 | 21 | CACHE_KEY: 'string|true', 22 | CACHE_VALUE: 'object|true', 23 | 24 | CACHE_TIMEOUT: 'int|true|comment=超时时间,毫秒', 25 | 26 | CACHE_ADD_TIME: 'int|true', 27 | CACHE_EDIT_TIME: 'int|true', 28 | CACHE_ADD_IP: 'string|false', 29 | CACHE_EDIT_IP: 'string|false', 30 | }; 31 | 32 | // 字段前缀 33 | CacheModel.FIELD_PREFIX = "CACHE_"; 34 | 35 | module.exports = CacheModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/day_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 预约日期设置实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-01-25 19:20:00 5 | */ 6 | 7 | 8 | const BaseModel = require('./base_model.js'); 9 | 10 | class DayModel extends BaseModel { 11 | 12 | } 13 | 14 | // 集合名 15 | DayModel.CL = "ax_day"; 16 | 17 | DayModel.DB_STRUCTURE = { 18 | _pid: 'string|true', 19 | DAY_ID: 'string|true', 20 | DAY_MEET_ID: 'string|true', 21 | 22 | day: 'string|true|comment=日期 yyyy-mm-dd', 23 | dayDesc: 'string|true|comment=描述', 24 | times: 'array|true|comment=具体时间段', 25 | /* 26 | { 27 | 1. mark=唯一性标识, 28 | 2. start=开始时间点hh:mm ~, 29 | 3. end=结束时间点hh:mm, 30 | 4. isLimit=是否人数限制, 31 | 5. limit=报名上限, 32 | 6. status=状态 0/1 33 | 7. stat:{ //统计数据 34 | succCnt=1预约成功*, 35 | cancelCnt=10已取消, 36 | adminCancelCnt=99后台取消 37 | } 38 | }', 39 | */ 40 | 41 | DAY_ADD_TIME: 'int|true', 42 | DAY_EDIT_TIME: 'int|true', 43 | DAY_ADD_IP: 'string|false', 44 | DAY_EDIT_IP: 'string|false', 45 | }; 46 | 47 | // 字段前缀 48 | DayModel.FIELD_PREFIX = "DAY_"; 49 | 50 | 51 | 52 | module.exports = DayModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/export_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 导出数据表 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-03-01 19:20:00 5 | */ 6 | 7 | 8 | const BaseModel = require('./base_model.js'); 9 | 10 | class ExportModel extends BaseModel { 11 | 12 | } 13 | 14 | // 集合名 15 | ExportModel.CL = "ax_export"; 16 | 17 | ExportModel.DB_STRUCTURE = { 18 | _pid: 'string|true', 19 | EXPORT_ID: 'string|true', 20 | EXPORT_KEY: 'string|true', 21 | EXPORT_CLOUD_ID: 'string|true|comment=cloudID', 22 | 23 | EXPORT_ADD_TIME: 'int|true', 24 | EXPORT_EDIT_TIME: 'int|true', 25 | EXPORT_ADD_IP: 'string|false', 26 | EXPORT_EDIT_IP: 'string|false', 27 | }; 28 | 29 | // 字段前缀 30 | ExportModel.FIELD_PREFIX = "EXPORT_"; 31 | 32 | 33 | module.exports = ExportModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/log_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 后台操作日志实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-10-16 19:20:00 5 | */ 6 | 7 | 8 | const BaseModel = require('./base_model.js'); 9 | 10 | class LogModel extends BaseModel { 11 | 12 | } 13 | 14 | // 集合名 15 | LogModel.CL = "ax_log"; 16 | 17 | LogModel.DB_STRUCTURE = { 18 | _pid: 'string|true', 19 | LOG_ID: 'string|true', 20 | 21 | LOG_ADMIN_ID: 'string|true|comment=管理员', 22 | LOG_ADMIN_PHONE: 'string|false', 23 | LOG_ADMIN_NAME: 'string|true', 24 | 25 | LOG_CONTENT: 'string|true', 26 | 27 | LOG_TYPE: 'int|true|comment=日志类型 ', 28 | 29 | LOG_ADD_TIME: 'int|true', 30 | LOG_EDIT_TIME: 'int|true', 31 | LOG_ADD_IP: 'string|false', 32 | LOG_EDIT_IP: 'string|false', 33 | }; 34 | 35 | // 字段前缀 36 | LogModel.FIELD_PREFIX = "LOG_"; 37 | 38 | LogModel.TYPE = { 39 | USER: 0, 40 | MEET: 1, 41 | NEWS: 2, 42 | SYS: 99 43 | } 44 | LogModel.TYPE_DESC = { 45 | USER: '用户', 46 | MEET: '预约/活动', 47 | NEWS: '内容/文章', 48 | SYS: '系统' 49 | } 50 | 51 | module.exports = LogModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/meet_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 预约实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-12-07 19:20:00 5 | * Version : CCMiniCloud Framework Ver 2.0.1 ALL RIGHTS RESERVED BY 明章科技 6 | */ 7 | 8 | 9 | const BaseModel = require('./base_model.js'); 10 | 11 | class MeetModel extends BaseModel { 12 | 13 | } 14 | 15 | // 集合名 16 | MeetModel.CL = "ax_meet"; 17 | 18 | MeetModel.DB_STRUCTURE = { 19 | _pid: 'string|true', 20 | MEET_ID: 'string|true', 21 | MEET_ADMIN_ID: 'string|true|comment=添加的管理员', 22 | MEET_TITLE: 'string|true|comment=标题', 23 | 24 | MEET_CONTENT: 'array|true|default=[]|comment=详细介绍', 25 | /* img=cloudID, text=文本 26 | [{type:'text/img',val:''}] 27 | */ 28 | 29 | // MEET_DAYS_SET: //**** 映射到day表 30 | MEET_DAYS: 'array|true|default=[]|comment=最近一次修改保存的可用日期', 31 | 32 | MEET_TYPE_ID: 'string|true|comment=分类编号', 33 | MEET_TYPE_NAME: 'string|true|comment=分类冗余', 34 | 35 | MEET_IS_SHOW_LIMIT: 'int|true|default=1|comment=是否显示可预约人数', 36 | 37 | MEET_STYLE_SET: 'object|true|default={}|comment=样式设置', 38 | /*{ 39 | desc: 'string|false|comment=简介', 40 | pic:' string|false|default=[]|comment=封面图cloudId]' 41 | } 42 | */ 43 | 44 | MEET_FORM_SET: 'array|true|default=[]|comment=表单字段设置', 45 | 46 | 47 | MEET_STATUS: 'int|true|default=1|comment=状态 0=未启用,1=使用中,9=停止预约,10=已关闭', 48 | MEET_ORDER: 'int|true|default=9999', 49 | 50 | MEET_ADD_TIME: 'int|true', 51 | MEET_EDIT_TIME: 'int|true', 52 | MEET_ADD_IP: 'string|false', 53 | MEET_EDIT_IP: 'string|false', 54 | }; 55 | 56 | // 字段前缀 57 | MeetModel.FIELD_PREFIX = "MEET_"; 58 | 59 | /** 60 | * 状态 0=未启用,1=使用中,9=停止预约,10=已关闭 61 | */ 62 | MeetModel.STATUS = { 63 | UNUSE: 0, 64 | COMM: 1, 65 | OVER: 9, 66 | CLOSE: 10 67 | }; 68 | 69 | MeetModel.STATUS_DESC = { 70 | UNUSE: '未启用', 71 | COMM: '使用中', 72 | OVER: '停止预约(可见)', 73 | CLOSE: '已关闭(不可见)' 74 | }; 75 | 76 | 77 | 78 | module.exports = MeetModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/news_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 资讯实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-10-28 19:20:00 5 | */ 6 | 7 | 8 | const BaseModel = require('./base_model.js'); 9 | 10 | class NewsModel extends BaseModel { 11 | 12 | } 13 | 14 | // 集合名 15 | NewsModel.CL = "ax_news"; 16 | 17 | NewsModel.DB_STRUCTURE = { 18 | _pid: 'string|true', 19 | NEWS_ID: 'string|true', 20 | NEWS_ADMIN_ID: 'string|true', 21 | 22 | NEWS_TYPE: 'int|true|default=0|comment=类型 0=本地文章,1=外部链接', 23 | NEWS_TITLE: 'string|false|comment=标题', 24 | NEWS_DESC: 'string|false|comment=描述', 25 | NEWS_URL: 'string|false|comment=外部链接URL', 26 | NEWS_STATUS: 'int|true|default=1|comment=状态 0/1', 27 | 28 | NEWS_CATE_ID: 'string|true|comment=分类编号', 29 | NEWS_CATE_NAME: 'string|true|comment=分类冗余', 30 | 31 | NEWS_ORDER: 'int|true|default=9999', 32 | 33 | NEWS_HOME: 'int|true|default=9999|comment=推荐到首页', 34 | 35 | NEWS_CONTENT: 'array|true|default=[]|comment=内容', 36 | 37 | NEWS_VIEW_CNT: 'int|true|default=0|comment=访问次数', 38 | NEWS_FAV_CNT: 'int|true|default=0|comment=收藏人数', 39 | NEWS_COMMENT_CNT: 'int|true|default=0|comment=评论数', 40 | NEWS_LIKE_CNT: 'int|true|default=0|comment=点赞数', 41 | 42 | 43 | NEWS_PIC: 'array|false|default=[]|comment=附加图片 [cloudId1,cloudId2,cloudId3...]', 44 | 45 | NEWS_ADD_TIME: 'int|true', 46 | NEWS_EDIT_TIME: 'int|true', 47 | NEWS_ADD_IP: 'string|false', 48 | NEWS_EDIT_IP: 'string|false', 49 | }; 50 | 51 | // 字段前缀 52 | NewsModel.FIELD_PREFIX = "NEWS_"; 53 | 54 | 55 | module.exports = NewsModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/setup_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 系统设置实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-05 19:20:00 5 | * Version : CCMiniCloud Framework Ver 2.0.1 ALL RIGHTS RESERVED BY 明章科技 6 | */ 7 | 8 | 9 | const BaseAlumniModel = require('./base_model.js'); 10 | 11 | class SetupModel extends BaseAlumniModel { 12 | 13 | } 14 | 15 | // 集合名 16 | SetupModel.CL = "ax_setup"; 17 | 18 | SetupModel.DB_STRUCTURE = { 19 | _pid: 'string|true', 20 | SETUP_ID: 'string|true', 21 | 22 | SETUP_NAME: 'string|false', 23 | 24 | SETUP_ABOUT: 'string|false|comment=关于我们', 25 | SETUP_ABOUT_PIC: 'array|false|default=[]|comment=关于我们的图片cloudId', 26 | 27 | SETUP_SERVICE_PIC: 'array|false|default=[]|comment=客服图片cloudId', 28 | SETUP_OFFICE_PIC: 'array|false|default=[]|comment=官微图片cloudId', 29 | 30 | SETUP_ADDRESS: 'string|false|comment=地址', 31 | SETUP_PHONE: 'string|false|comment=电话', 32 | 33 | SETUP_ADD_TIME: 'int|true', 34 | SETUP_EDIT_TIME: 'int|true', 35 | SETUP_ADD_IP: 'string|false', 36 | SETUP_EDIT_IP: 'string|false', 37 | }; 38 | 39 | // 字段前缀 40 | SetupModel.FIELD_PREFIX = "SETUP_"; 41 | 42 | 43 | 44 | module.exports = SetupModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/temp_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 模板实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2022-01-02 19:20:00 5 | * Version : CCMiniCloud Framework Ver 2.0.1 ALL RIGHTS RESERVED BY 明章科技 6 | */ 7 | 8 | 9 | const BaseModel = require('./base_model.js'); 10 | 11 | class TempModel extends BaseModel { 12 | 13 | } 14 | 15 | // 集合名 16 | TempModel.CL = "ax_temp"; 17 | 18 | TempModel.DB_STRUCTURE = { 19 | _pid: 'string|true', 20 | TEMP_ID: 'string|true', 21 | TEMP_NAME: 'string|true|comment=名字', 22 | 23 | TEMP_TIMES: 'array|true|comment=时间段', 24 | 25 | 26 | TEMP_ADD_TIME: 'int|true', 27 | TEMP_EDIT_TIME: 'int|true', 28 | TEMP_ADD_IP: 'string|false', 29 | TEMP_EDIT_IP: 'string|false', 30 | }; 31 | 32 | // 字段前缀 33 | TempModel.FIELD_PREFIX = "TEMP_"; 34 | 35 | module.exports = TempModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/model/user_model.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 用户实体 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-10-14 19:20:00 5 | */ 6 | 7 | 8 | const BaseModel = require('./base_model.js'); 9 | class UserModel extends BaseModel {} 10 | 11 | // 集合名 12 | UserModel.CL = "ax_user"; 13 | 14 | UserModel.DB_STRUCTURE = { 15 | _pid: 'string|true', 16 | USER_ID: 'string|true', 17 | 18 | USER_MINI_OPENID: 'string|true|comment=小程序openid', 19 | USER_STATUS: 'int|true|default=1|comment=状态 0=待审核,1=正常', 20 | 21 | USER_NAME: 'string|false|comment=用户姓名', 22 | USER_MOBILE: 'string|false|comment=联系电话', 23 | 24 | USER_WORK: 'string|false|comment=所在单位', 25 | USER_CITY: 'string|false|comment=所在城市', 26 | USER_TRADE: 'string|false|comment=职业领域', 27 | 28 | 29 | USER_LOGIN_CNT: 'int|true|default=0|comment=登陆次数', 30 | USER_LOGIN_TIME: 'int|false|comment=最近登录时间', 31 | 32 | 33 | USER_ADD_TIME: 'int|true', 34 | USER_ADD_IP: 'string|false', 35 | 36 | USER_EDIT_TIME: 'int|true', 37 | USER_EDIT_IP: 'string|false', 38 | } 39 | 40 | // 字段前缀 41 | UserModel.FIELD_PREFIX = "USER_"; 42 | 43 | /** 44 | * 状态 0=待审核,1=正常 45 | */ 46 | UserModel.STATUS = { 47 | UNUSE: 0, 48 | COMM: 1 49 | }; 50 | 51 | UserModel.STATUS_DESC = { 52 | UNUSE: '待审核', 53 | COMM: '正常' 54 | }; 55 | 56 | 57 | module.exports = UserModel; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/service/admin/admin_mgr_service.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 管理员管理 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-07-11 07:48:00 5 | */ 6 | 7 | const BaseAdminService = require('./base_admin_service.js'); 8 | 9 | const util = require('../../../framework/utils/util.js'); 10 | const AdminModel = require('../../model/admin_model.js'); 11 | const LogModel = require('../../model/log_model.js'); 12 | 13 | 14 | class AdminMgrService extends BaseAdminService { 15 | 16 | 17 | /** 取得日志分页列表 */ 18 | async getLogList({ 19 | search, // 搜索条件 20 | sortType, // 搜索菜单 21 | sortVal, // 搜索菜单 22 | orderBy, // 排序 23 | whereEx, //附加查询条件 24 | page, 25 | size, 26 | oldTotal = 0 27 | }) { 28 | 29 | orderBy = orderBy || { 30 | LOG_ADD_TIME: 'desc' 31 | }; 32 | let fields = '*'; 33 | let where = {}; 34 | 35 | if (util.isDefined(search) && search) { 36 | where.or = [{ 37 | LOG_CONTENT: ['like', search] 38 | }, { 39 | LOG_ADMIN_NAME: ['like', search] 40 | }, { 41 | LOG_ADD_IP: ['like', search] 42 | }]; 43 | 44 | } else if (sortType && util.isDefined(sortVal)) { 45 | // 搜索菜单 46 | switch (sortType) { 47 | case 'type': 48 | // 按类型 49 | where.LOG_TYPE = Number(sortVal); 50 | break; 51 | } 52 | } 53 | let result = await LogModel.getList(where, fields, orderBy, page, size, true, oldTotal); 54 | 55 | 56 | return result; 57 | } 58 | 59 | } 60 | 61 | module.exports = AdminMgrService; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/service/admin/admin_setup_service.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 设置管理 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-07-11 07:48:00 5 | */ 6 | 7 | const BaseAdminService = require('./base_admin_service.js'); 8 | const cloudBase = require('../../../framework/cloud/cloud_base.js'); 9 | const cloudUtil = require('../../../framework/cloud/cloud_util.js'); 10 | const SetupModel = require('../../model/setup_model.js'); 11 | const config = require('../../../config/config.js'); 12 | 13 | class AdminSetupService extends BaseAdminService { 14 | 15 | 16 | /** 关于我们 */ 17 | async setupAbout({ 18 | about, 19 | aboutPic 20 | }) { 21 | 22 | this.AppError('此功能暂不开放,如有需要请加作者微信:cclinux0730'); 23 | } 24 | 25 | /** 联系我们设置 */ 26 | async setupContact({ 27 | address, 28 | phone, 29 | officePic, 30 | servicePic, 31 | }) { 32 | 33 | this.AppError('此功能暂不开放,如有需要请加作者微信:cclinux0730'); 34 | } 35 | 36 | /** 小程序码 */ 37 | async genMiniQr() { 38 | //生成小程序qr buffer 39 | let cloud = cloudBase.getCloud(); 40 | 41 | let page = "projects/" + this.getProjectId() + "/default/index/default_index"; 42 | console.log(page); 43 | 44 | let result = await cloud.openapi.wxacode.getUnlimited({ 45 | scene: 'qr', 46 | width: 280, 47 | check_path: false, 48 | env_version: 'release', //trial,develop 49 | page 50 | }); 51 | 52 | let upload = await cloud.uploadFile({ 53 | cloudPath: config.SETUP_PATH + 'qr.png', 54 | fileContent: result.buffer, 55 | }); 56 | 57 | if (!upload || !upload.fileID) return; 58 | 59 | return upload.fileID; 60 | } 61 | 62 | } 63 | 64 | module.exports = AdminSetupService; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/service/admin/admin_temp_service.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 预约后台管理 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-12-08 07:48:00 5 | */ 6 | 7 | const BaseAdminService = require('./base_admin_service.js'); 8 | const TempModel = require('../../model/temp_model.js'); 9 | 10 | class AdminTempService extends BaseAdminService { 11 | 12 | /**添加模板 */ 13 | async insertTemp({ 14 | name, 15 | times, 16 | }) { 17 | this.AppError('此功能暂不开放,如有需要请加作者微信:cclinux0730'); 18 | } 19 | 20 | /**更新数据 */ 21 | async editTemp({ 22 | id, 23 | limit, 24 | isLimit 25 | }) { 26 | this.AppError('此功能暂不开放,如有需要请加作者微信:cclinux0730'); 27 | } 28 | 29 | 30 | /**删除数据 */ 31 | async delTemp(id) { 32 | this.AppError('此功能暂不开放,如有需要请加作者微信:cclinux0730'); 33 | } 34 | 35 | 36 | /**分页列表 */ 37 | async getTempList() { 38 | let orderBy = { 39 | 'TEMP_ADD_TIME': 'desc' 40 | }; 41 | let fields = 'TEMP_NAME,TEMP_TIMES'; 42 | 43 | let where = {}; 44 | return await TempModel.getAll(where, fields, orderBy); 45 | } 46 | } 47 | 48 | module.exports = AdminTempService; -------------------------------------------------------------------------------- /cloudfunctions/cloud/project/service/home_service.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 全局/首页模块业务逻辑 3 | * Date: 2021-03-15 04:00:00 4 | */ 5 | 6 | const BaseService = require('./base_service.js'); 7 | 8 | const SetupModel = require('../model/setup_model.js'); 9 | const dataUtil = require('../../framework/utils/data_util.js'); 10 | const config = require('../../config/config.js'); 11 | 12 | class HomeService extends BaseService { 13 | /** 14 | * 取得系统设置 15 | * @param {*} param0 16 | */ 17 | async getSetup(fields = '*') { 18 | let where = {} 19 | let setup = await SetupModel.getOne(where, fields); 20 | 21 | if (!setup) { 22 | let data = { 23 | SETUP_ABOUT: '关于我们' 24 | }; 25 | await SetupModel.insert(data); 26 | setup = await SetupModel.getOne(where, fields); 27 | } 28 | return setup; 29 | 30 | } 31 | } 32 | 33 | module.exports = HomeService; -------------------------------------------------------------------------------- /demo/二维码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/二维码.png -------------------------------------------------------------------------------- /demo/储物柜预约.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/储物柜预约.png -------------------------------------------------------------------------------- /demo/填报预约.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/填报预约.png -------------------------------------------------------------------------------- /demo/工单.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/工单.png -------------------------------------------------------------------------------- /demo/我的.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/我的.png -------------------------------------------------------------------------------- /demo/日历.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/日历.png -------------------------------------------------------------------------------- /demo/自习室预约.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/自习室预约.png -------------------------------------------------------------------------------- /demo/菜单.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/菜单.png -------------------------------------------------------------------------------- /demo/预约成.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/预约成.png -------------------------------------------------------------------------------- /demo/预约添加.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/预约添加.png -------------------------------------------------------------------------------- /demo/预约管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/预约管理.png -------------------------------------------------------------------------------- /demo/预约规则.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/预约规则.png -------------------------------------------------------------------------------- /demo/预约详情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/预约详情.png -------------------------------------------------------------------------------- /demo/首页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/demo/首页.png -------------------------------------------------------------------------------- /miniprogram/app.js: -------------------------------------------------------------------------------- 1 | const setting = require('./setting/setting.js'); 2 | 3 | App({ 4 | onLaunch: function (options) { 5 | 6 | if (!wx.cloud) { 7 | console.error('请使用 2.2.3 或以上的基础库以使用云能力') 8 | } else { 9 | wx.cloud.init({ 10 | // env 参数说明: 11 | // env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源 12 | // 此处请填入环境 ID, 环境 ID 可打开云控制台查看 13 | // 如不填则使用默认环境(第一个创建的环境) 14 | // env: 'my-env-id', 15 | env: setting.CLOUD_ID, 16 | traceUser: true, 17 | }) 18 | } 19 | 20 | this.globalData = {}; 21 | 22 | // 用于自定义导航栏 23 | wx.getSystemInfo({ 24 | success: e => { 25 | this.globalData.statusBar = e.statusBarHeight; 26 | let capsule = wx.getMenuButtonBoundingClientRect(); 27 | if (capsule) { 28 | this.globalData.custom = capsule; 29 | this.globalData.customBar = capsule.bottom + capsule.top - e.statusBarHeight; 30 | } else { 31 | this.globalData.customBar = e.statusBarHeight + 50; 32 | } 33 | } 34 | }); 35 | }, 36 | 37 | 38 | /* 39 | onShow: function (options) { 40 | // 启动,或者从后台进入前台 41 | //GroupBiz.initGroupShareTicket(options); 42 | }, 43 | onHide: function () { 44 | // 小程序从前台进入后台 45 | //GroupBiz.clearGroupShareTicket(); 46 | }*/ 47 | }) -------------------------------------------------------------------------------- /miniprogram/app.wxss: -------------------------------------------------------------------------------- 1 | @import "style/comm/comm.wxss"; 2 | @import "style/project/base/project.wxss"; 3 | -------------------------------------------------------------------------------- /miniprogram/behavior/about_contact_bh.js: -------------------------------------------------------------------------------- 1 | const cloudHelper = require('../helper/cloud_helper.js'); 2 | const pageHelper = require('../helper/page_helper.js'); 3 | 4 | module.exports = Behavior({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | isLoad: false 11 | }, 12 | 13 | methods: { 14 | /** 15 | * 生命周期函数--监听页面加载 16 | */ 17 | onLoad: async function (options) { 18 | const accountInfo = wx.getAccountInfoSync(); 19 | this.setData({ 20 | accountInfo 21 | }); 22 | 23 | this._loadDetail(); 24 | }, 25 | 26 | _loadDetail: async function () { 27 | let opts = { 28 | title: 'bar' 29 | } 30 | let about = await cloudHelper.callCloudData('home/setup_all', {}, opts); 31 | if (!about) { 32 | this.setData({ 33 | isLoad: null 34 | }); 35 | return; 36 | } 37 | 38 | if (about) this.setData({ 39 | about, 40 | isLoad: true 41 | }); 42 | }, 43 | 44 | /** 45 | * 生命周期函数--监听页面初次渲染完成 46 | */ 47 | onReady: function () { 48 | 49 | }, 50 | 51 | /** 52 | * 生命周期函数--监听页面显示 53 | */ 54 | onShow: function () { 55 | 56 | }, 57 | 58 | /** 59 | * 生命周期函数--监听页面隐藏 60 | */ 61 | onHide: function () { 62 | 63 | }, 64 | 65 | /** 66 | * 生命周期函数--监听页面卸载 67 | */ 68 | onUnload: function () { 69 | 70 | }, 71 | 72 | /** 73 | * 页面相关事件处理函数--监听用户下拉动作 74 | */ 75 | onPullDownRefresh: function () { 76 | this._loadDetail(); 77 | wx.stopPullDownRefresh(); 78 | }, 79 | 80 | 81 | /** 82 | * 用户点击右上角分享 83 | */ 84 | onShareAppMessage: function () { 85 | 86 | }, 87 | 88 | url: function (e) { 89 | pageHelper.url(e, this); 90 | } 91 | } 92 | }) -------------------------------------------------------------------------------- /miniprogram/behavior/about_index_bh.js: -------------------------------------------------------------------------------- 1 | const cloudHelper = require('../helper/cloud_helper.js'); 2 | const pageHelper = require('../helper/page_helper.js'); 3 | 4 | module.exports = Behavior({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | isLoad: false 11 | }, 12 | 13 | methods: { 14 | /** 15 | * 生命周期函数--监听页面加载 16 | */ 17 | onLoad: async function (options) { 18 | const accountInfo = wx.getAccountInfoSync(); 19 | this.setData({ 20 | accountInfo 21 | }); 22 | 23 | this._loadDetail(); 24 | }, 25 | 26 | _loadDetail: async function () { 27 | let opts = { 28 | title: 'bar' 29 | } 30 | let about = await cloudHelper.callCloudData('home/setup_all', {}, opts); 31 | if (!about) { 32 | this.setData({ 33 | isLoad: null 34 | }); 35 | return; 36 | } 37 | 38 | if (about) this.setData({ 39 | about, 40 | isLoad: true 41 | }); 42 | }, 43 | 44 | /** 45 | * 生命周期函数--监听页面初次渲染完成 46 | */ 47 | onReady: function () { 48 | 49 | }, 50 | 51 | /** 52 | * 生命周期函数--监听页面显示 53 | */ 54 | onShow: function () { 55 | 56 | }, 57 | 58 | /** 59 | * 生命周期函数--监听页面隐藏 60 | */ 61 | onHide: function () { 62 | 63 | }, 64 | 65 | /** 66 | * 生命周期函数--监听页面卸载 67 | */ 68 | onUnload: function () { 69 | 70 | }, 71 | 72 | /** 73 | * 页面相关事件处理函数--监听用户下拉动作 74 | */ 75 | onPullDownRefresh: function () { 76 | this._loadDetail(); 77 | wx.stopPullDownRefresh(); 78 | }, 79 | 80 | 81 | /** 82 | * 用户点击右上角分享 83 | */ 84 | onShareAppMessage: function () { 85 | 86 | }, 87 | 88 | url: function (e) { 89 | pageHelper.url(e, this); 90 | } 91 | } 92 | }) -------------------------------------------------------------------------------- /miniprogram/behavior/default_index_bh.js: -------------------------------------------------------------------------------- 1 | const pageHelper = require('../helper/page_helper.js'); 2 | const cloudHelper = require('../helper/cloud_helper.js'); 3 | const setting = require('../setting/setting.js'); 4 | 5 | module.exports = Behavior({ 6 | 7 | /** 8 | * 页面的初始数据 9 | */ 10 | data: { 11 | 12 | }, 13 | 14 | methods: { 15 | /** 16 | * 生命周期函数--监听页面加载 17 | */ 18 | onLoad: async function (options) { 19 | if (setting.IS_SUB) wx.hideHomeButton(); 20 | }, 21 | 22 | _loadList: async function () { 23 | let opts = { 24 | title: 'bar' 25 | } 26 | await cloudHelper.callCloudSumbit('news/home_list', {}, opts).then(res => { 27 | this.setData({ 28 | dataList: res.data 29 | }); 30 | }) 31 | }, 32 | 33 | /** 34 | * 生命周期函数--监听页面初次渲染完成 35 | */ 36 | onReady: function () {}, 37 | 38 | /** 39 | * 生命周期函数--监听页面显示 40 | */ 41 | onShow: async function () { 42 | this._loadList(); 43 | }, 44 | 45 | onPullDownRefresh: async function () { 46 | await this._loadList(); 47 | wx.stopPullDownRefresh(); 48 | }, 49 | 50 | /** 51 | * 生命周期函数--监听页面隐藏 52 | */ 53 | onHide: function () { 54 | 55 | }, 56 | 57 | /** 58 | * 生命周期函数--监听页面卸载 59 | */ 60 | onUnload: function () { 61 | 62 | }, 63 | 64 | url: async function (e) { 65 | pageHelper.url(e, this); 66 | }, 67 | 68 | 69 | /** 70 | * 用户点击右上角分享 71 | */ 72 | onShareAppMessage: function () { 73 | 74 | }, 75 | } 76 | }) -------------------------------------------------------------------------------- /miniprogram/behavior/meet_self_bh.js: -------------------------------------------------------------------------------- 1 | const pageHelper = require('../helper/page_helper.js'); 2 | const cloudHelper = require('../helper/cloud_helper.js'); 3 | 4 | module.exports = Behavior({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | 11 | }, 12 | 13 | methods: { 14 | /** 15 | * 生命周期函数--监听页面加载 16 | */ 17 | onLoad: async function (options) { 18 | if (options && options.scene) { 19 | let params = { 20 | timeMark: options.scene 21 | }; 22 | let opts = { 23 | title: 'bar' 24 | } 25 | try { 26 | await cloudHelper.callCloudSumbit('my/my_join_checkin', params, opts).then(res => { 27 | let cb = () => { 28 | wx.reLaunch({ 29 | url: pageHelper.fmtURLByPID('/pages/my/index/my_index'), 30 | }); 31 | } 32 | pageHelper.showModal(res.data.ret, '温馨提示', cb); 33 | }); 34 | } catch (err) { 35 | console.error(err); 36 | } 37 | } else { 38 | pageHelper.showModal('签到码扫描错误,请关闭本小程序,使用「微信›扫一扫」重新扫码'); 39 | } 40 | }, 41 | 42 | /** 43 | * 生命周期函数--监听页面初次渲染完成 44 | */ 45 | onReady: function () { 46 | 47 | }, 48 | 49 | /** 50 | * 生命周期函数--监听页面显示 51 | */ 52 | onShow: function () { 53 | 54 | }, 55 | 56 | /** 57 | * 生命周期函数--监听页面隐藏 58 | */ 59 | onHide: function () { 60 | 61 | }, 62 | 63 | /** 64 | * 生命周期函数--监听页面卸载 65 | */ 66 | onUnload: function () { 67 | 68 | }, 69 | 70 | /** 71 | * 页面相关事件处理函数--监听用户下拉动作 72 | */ 73 | onPullDownRefresh: function () { 74 | 75 | }, 76 | 77 | /** 78 | * 页面上拉触底事件的处理函数 79 | */ 80 | onReachBottom: function () { 81 | 82 | }, 83 | 84 | /** 85 | * 用户点击右上角分享 86 | */ 87 | onShareAppMessage: function () { 88 | 89 | } 90 | } 91 | }) -------------------------------------------------------------------------------- /miniprogram/behavior/public_hint_bh.js: -------------------------------------------------------------------------------- 1 | const pageHelper = require('../helper/page_helper.js'); 2 | const PassportBiz = require('../biz/passport_biz.js'); 3 | 4 | module.exports = Behavior({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | type: -1, //0-需要注册提示 1=用户异常提示 2=认证中提示 9=自定义错误 11 | msg: '' 12 | }, 13 | 14 | methods: { 15 | /** 16 | * 生命周期函数--监听页面加载 17 | */ 18 | onLoad: async function (options) { 19 | 20 | let type = -1; 21 | let msg = (options && options.msg) ? decodeURIComponent(options.msg) : ''; 22 | 23 | if (options && options.type) type = options.type; 24 | 25 | this.setData({ 26 | type, 27 | msg 28 | }); 29 | }, 30 | 31 | /** 32 | * 生命周期函数--监听页面初次渲染完成 33 | */ 34 | onReady: function () { 35 | 36 | }, 37 | 38 | /** 39 | * 生命周期函数--监听页面显示 40 | */ 41 | onShow: function () { 42 | 43 | }, 44 | 45 | /** 46 | * 生命周期函数--监听页面隐藏 47 | */ 48 | onHide: function () { 49 | 50 | }, 51 | 52 | /** 53 | * 生命周期函数--监听页面卸载 54 | */ 55 | onUnload: function () { 56 | 57 | }, 58 | 59 | url: function (e) { 60 | pageHelper.url(e, this); 61 | } 62 | } 63 | 64 | }) -------------------------------------------------------------------------------- /miniprogram/biz/base_biz.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 基础模块业务逻辑 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | const dataHelper = require('../helper/data_helper.js'); 7 | 8 | class BaseBiz { 9 | 10 | } 11 | 12 | module.exports = BaseBiz; -------------------------------------------------------------------------------- /miniprogram/biz/biz_helper.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 业务通用 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | 7 | const cacheHelper = require('../helper/cache_helper.js'); 8 | const setting = require('../setting/setting.js'); 9 | 10 | 11 | function isCacheList(key) { 12 | key = key.toUpperCase(); 13 | if (setting.CACHE_IS_LIST) 14 | return cacheHelper.get(key + '_LIST'); 15 | else 16 | return false; 17 | } 18 | 19 | function removeCacheList(key) { 20 | key = key.toUpperCase(); 21 | if (setting.CACHE_IS_LIST) 22 | cacheHelper.remove(key + '_LIST'); 23 | } 24 | 25 | function setCacheList(key, time = setting.CACHE_LIST_TIME) { 26 | key = key.toUpperCase(); 27 | if (setting.CACHE_IS_LIST) 28 | cacheHelper.set(key + '_LIST', 'TRUE', time); 29 | } 30 | 31 | 32 | module.exports = { 33 | isCacheList, 34 | removeCacheList, 35 | setCacheList, 36 | } -------------------------------------------------------------------------------- /miniprogram/biz/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 通用常量 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | 7 | module.exports = { 8 | CACHE_TOKEN: 'CACHE_TOKEN', // 登录 9 | CACHE_ADMIN: 'ADMIN_TOKEN', // 管理员登录 10 | } -------------------------------------------------------------------------------- /miniprogram/biz/meet_biz.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 预约模块业务逻辑 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-12-10 07:48:00 5 | */ 6 | 7 | const BaseBiz = require('./base_biz.js'); 8 | const setting = require('../setting/setting.js'); 9 | const pageHelper = require('../helper/page_helper.js'); 10 | 11 | class MeetBiz extends BaseBiz { 12 | 13 | static async subscribeMessageMeet(callback) { 14 | callback && await callback(); 15 | } 16 | 17 | static addMeetPhoneCalendar(title, startTime, endTime, alarmOffset = 3600) { 18 | wx.addPhoneCalendar({ 19 | title, 20 | startTime, 21 | endTime, 22 | // description: "这是日程内容", 23 | alarm: 'true', 24 | alarmOffset, //提前时间,秒 25 | success: () => { 26 | pageHelper.showSuccToast('添加成功'); 27 | }, 28 | fail: (res) => { 29 | if (res && res.errMsg && res.errMsg.includes('refuesed')) { 30 | pageHelper.showModal('请在手机的"设置›微信" 选项中,允许微信访问你的日历', '日历权限未开启') 31 | } 32 | }, 33 | complete: (res) => { 34 | console.log(res) 35 | } 36 | 37 | }) 38 | } 39 | 40 | } 41 | 42 | module.exports = MeetBiz; -------------------------------------------------------------------------------- /miniprogram/biz/news_biz.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 资讯模块业务逻辑 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | 7 | const BaseBiz = require('./base_biz.js'); ; 8 | 9 | class NewsBiz extends BaseBiz { 10 | 11 | /** 搜索菜单设置 */ 12 | static async getSearchMenu() { 13 | let sortMenus = [{ 14 | label: '全部', 15 | type: '', 16 | value: '' 17 | }]; 18 | let sortMenusAfter = [{ 19 | label: '最新', 20 | type: 'sort', 21 | value: 'new' 22 | }, ]; 23 | let sortItems = []; 24 | 25 | sortMenus = sortMenus.concat(sortMenusAfter); 26 | 27 | return { 28 | sortItems, 29 | sortMenus 30 | } 31 | } 32 | } 33 | 34 | module.exports = NewsBiz; -------------------------------------------------------------------------------- /miniprogram/biz/search_biz.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 搜索模块业务逻辑 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | 7 | const BaseBiz = require('./base_biz.js'); 8 | const cacheHelper = require('../helper/cache_helper.js'); 9 | 10 | /** 11 | * 12 | */ 13 | class SearchBiz extends BaseBiz { 14 | 15 | static clearHistory(key){ 16 | cacheHelper.remove(key); 17 | } 18 | 19 | static getHistory(key) 20 | { 21 | return cacheHelper.get(key, []); 22 | 23 | } 24 | 25 | /**添加关键字缓存 26 | * 27 | * @param {*} key 28 | * @param {*} val 29 | * @param {*} size 个数 30 | * @param {*} expire 过期时间 31 | */ 32 | static addHistory(key, val, size = 20, expire = 86400 * 30) { 33 | if (!val || val.length == 0) return []; 34 | 35 | let his = cacheHelper.get(key, []); 36 | 37 | //查询是否存在 并删除 38 | let pos = his.indexOf(val); 39 | if (pos > -1) his.splice(pos, 1); 40 | 41 | // 加到头部 42 | his.unshift(val); 43 | 44 | // 判断个数, 多的删除 45 | if (his.length > size) 46 | his.splice(his.length - 1, 1); 47 | 48 | // 存缓存 49 | cacheHelper.set(key, his, expire); 50 | 51 | return his; 52 | } 53 | 54 | } 55 | 56 | module.exports = SearchBiz; -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/foot/foot_cmpt.js: -------------------------------------------------------------------------------- 1 | const pageHelper = require('../../../helper/page_helper'); 2 | const setting = require('../../../setting/setting.js'); 3 | 4 | Component({ 5 | options: { 6 | addGlobalClass: true 7 | }, 8 | 9 | /** 10 | * 组件的属性列表 11 | */ 12 | properties: { 13 | color: { 14 | type: String, 15 | value: '' 16 | }, 17 | }, 18 | 19 | /** 20 | * 组件的初始数据 21 | */ 22 | data: { 23 | 24 | }, 25 | 26 | lifetimes: { 27 | created: function () { 28 | // 组件实例化,但节点树还未导入,因此这时不能用setData 29 | }, 30 | attached: function () { 31 | // 在组件实例进入页面节点树时执行 32 | // 节点树完成,可以用setData渲染节点,但无法操作节点 33 | }, 34 | ready: async function () { 35 | // 组件布局完成,这时可以获取节点信息,也可以操作节点 36 | // 当前用户,用于评论删除 37 | this._loadDetail(); 38 | }, 39 | move: function () { 40 | // 组件实例被移动到树的另一个位置 41 | }, 42 | detached: function () { 43 | // 在组件实例被从页面节点树移除时执行 44 | }, 45 | }, 46 | 47 | /** 48 | * 组件的方法列表 49 | */ 50 | methods: { 51 | _loadDetail: async function () { 52 | this.setData({ 53 | company: setting.COMPANY, 54 | ver: setting.VER 55 | }); 56 | }, 57 | url: function (e) { 58 | pageHelper.url(e, this); 59 | } 60 | } 61 | }) -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/foot/foot_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/foot/foot_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | © {{company}} 3 | {{ver}} 4 | -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/foot/foot_cmpt.wxss: -------------------------------------------------------------------------------- 1 | @import "../../../style/project/base/project.wxss"; 2 | 3 | .site-footer { 4 | width: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | justify-content: center; 8 | align-items: center; 9 | font-size: 24rpx; 10 | color: #aaa; 11 | margin-top: 20rpx; 12 | margin-bottom: 20rpx; 13 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/test/test_cmpt.js: -------------------------------------------------------------------------------- 1 | // cmpts/biz/test/test_cmpt.js 2 | Component({ 3 | options: { 4 | addGlobalClass: true 5 | }, 6 | 7 | /** 8 | * 组件的属性列表 9 | */ 10 | properties: { 11 | 12 | }, 13 | 14 | /** 15 | * 组件的初始数据 16 | */ 17 | data: { 18 | 19 | }, 20 | 21 | /** 22 | * 组件的方法列表 23 | */ 24 | methods: { 25 | 26 | } 27 | }) 28 | -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/test/test_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/test/test_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Modal标题 5 | 6 | 7 | 8 | 9 | 10 | Modal 内容。{{index}} 11 | 12 | 13 | -------------------------------------------------------------------------------- /miniprogram/cmpts/biz/test/test_cmpt.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/miniprogram/cmpts/biz/test/test_cmpt.wxss -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true 3 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/index/index.wxss: -------------------------------------------------------------------------------- 1 | .canvas { 2 | width: 750rpx; 3 | height: 750rpx; 4 | } 5 | .canvas.pro { 6 | position: absolute; 7 | bottom: 0; 8 | left: 0; 9 | transform: translate3d(-9999rpx, 0, 0); 10 | } 11 | .canvas.debug { 12 | position: absolute; 13 | bottom: 0; 14 | left: 0; 15 | border: 1rpx solid #ccc; 16 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/poster/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": { 4 | "we-canvas": "../index/index" 5 | } 6 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/poster/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/poster/index.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/miniprogram/cmpts/lib/wxa-plugin-canvas/poster/index.wxss -------------------------------------------------------------------------------- /miniprogram/cmpts/lib/wxa-plugin-canvas/poster/poster.js: -------------------------------------------------------------------------------- 1 | const defaultOptions = { 2 | selector: '#poster' 3 | }; 4 | 5 | function Poster(options = {}, that) { 6 | options = { 7 | ...defaultOptions, 8 | ...options, 9 | }; 10 | 11 | const pages = getCurrentPages(); 12 | let ctx = pages[pages.length - 1]; 13 | if (that) ctx = that 14 | const poster = ctx.selectComponent(options.selector); 15 | delete options.selector; 16 | 17 | return poster; 18 | }; 19 | 20 | Poster.create = (reset = false, that) => { 21 | const poster = Poster({}, that); 22 | if (!poster) { 23 | console.error('请设置组件的id="poster"!!!'); 24 | } else { 25 | return Poster({}, that).onCreate(reset); 26 | } 27 | } 28 | 29 | export default Poster; 30 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/calendar/calendar_comm/calendar_comm_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/calendar/calendar_meet/calendar_meet_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/checkbox/checkbox_cmpt.js: -------------------------------------------------------------------------------- 1 | Component({ 2 | externalClasses: ['outside-picker-multi-class'], 3 | 4 | /** 5 | * 组件的属性列表 6 | */ 7 | properties: { 8 | sourceData: { //源数组 9 | type: Array, 10 | value: [], 11 | }, 12 | // 默认选中项的值数组 13 | itemMulti: { 14 | type: Array, 15 | value: [], 16 | observer: function (newVal, oldVal) { 17 | if (JSON.stringify(newVal) != JSON.stringify(oldVal)) { 18 | console.log('checkbox observer'); 19 | this._fixDefaultVal(); 20 | } 21 | } 22 | }, 23 | disabled: { // 是否禁用 24 | type: Boolean, 25 | value: false, 26 | }, 27 | }, 28 | 29 | /** 30 | * 生命周期方法 31 | */ 32 | lifetimes: { 33 | attached: function () {}, 34 | 35 | ready: function () { 36 | this._fixDefaultVal(); 37 | }, 38 | 39 | detached: function () { 40 | // 在组件实例被从页面节点树移除时执行 41 | }, 42 | 43 | }, 44 | 45 | /** 46 | * 组件的初始数据 47 | */ 48 | data: { 49 | 50 | }, 51 | 52 | /** 53 | * 组件的方法列表 54 | */ 55 | methods: { 56 | bindChange: function (e) { 57 | this.triggerEvent('select', e.detail.value); 58 | }, 59 | 60 | _fixDefaultVal() { //传入数据不匹配的时候,修正父页面传入的的数组默认值 61 | if (!Array.isArray(this.data.itemMulti)) { 62 | this.triggerEvent('select', []); 63 | } 64 | 65 | if (this.data.itemMulti.length == 0) return; 66 | 67 | let ret = []; 68 | let sourceData = this.data.sourceData; 69 | let itemMulti = this.data.itemMulti; 70 | for (let k in sourceData) { 71 | for (let j in itemMulti) { 72 | if (sourceData[k] == itemMulti[j]) 73 | ret.push(itemMulti[j]); 74 | } 75 | } 76 | 77 | this.triggerEvent('select', ret); 78 | } 79 | } 80 | }) -------------------------------------------------------------------------------- /miniprogram/cmpts/public/checkbox/checkbox_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/checkbox/checkbox_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/checkbox/checkbox_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .checkbox-group { 2 | width: 100%; 3 | display: flex; 4 | justify-content: center; 5 | flex-direction: column; 6 | align-items: center; 7 | padding: 0rpx 10rpx; 8 | } 9 | 10 | .checkbox-group .item { 11 | width: 100%; 12 | display: flex; 13 | flex-direction: row; 14 | justify-content: flex-start; 15 | align-items: center; 16 | line-height: 2.1; 17 | min-height: 70rpx; 18 | border-bottom: 1rpx solid #eee; 19 | font-size: 28rpx; 20 | } 21 | 22 | .checkbox-group .item label{ 23 | width: 100%; 24 | display: flex; 25 | flex-direction: row; 26 | justify-content: flex-start; 27 | align-items: center; 28 | } 29 | 30 | 31 | .checkbox-group .item:last-child { 32 | border-bottom: 0; 33 | } 34 | 35 | .checkbox-group .item:nth-child(odd) { 36 | background-color: #fcfcfc; 37 | } 38 | 39 | 40 | .checkbox-group .item checkbox { 41 | margin-right: 20rpx; 42 | padding-left: 10rpx; 43 | } 44 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/editor/editor_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_set/field/form_set_field.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-picker-multi": "../../../picker_multi/picker_multi_cmpt" 4 | }, 5 | "navigationBarBackgroundColor": "#ffffff", 6 | "navigationBarTextStyle": "black", 7 | "enablePullDownRefresh": true, 8 | "backgroundTextStyle": "dark", 9 | "navigationBarTitleText": "后台-字段添加" 10 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_set/field/form_set_field.wxss: -------------------------------------------------------------------------------- 1 | .main { 2 | margin-bottom: 150rpx; 3 | } 4 | 5 | .oprt { 6 | display: flex; 7 | width: 100%; 8 | justify-content: space-around; 9 | } 10 | 11 | .oprt button { 12 | width: 45%; 13 | } 14 | 15 | .select-close { 16 | width: 60rpx; 17 | font-size: 40rpx !important; 18 | font-weight: bold; 19 | text-align: right; 20 | } 21 | 22 | .title-desc { 23 | padding-left: 24rpx; 24 | color: #aaa; 25 | padding-bottom: 30rpx; 26 | border-bottom: 1rpx solid #eee; 27 | } 28 | 29 | .title-info { 30 | margin-left: 4rpx; 31 | color: #aaa; 32 | font-weight: normal; 33 | font-size: 24rpx; 34 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_set/form_set_cmpt.js: -------------------------------------------------------------------------------- 1 | const pageHelper = require('../../../../helper/page_helper.js'); 2 | const dataHelper = require('../../../../helper/data_helper.js'); 3 | 4 | Component({ 5 | options: { 6 | addGlobalClass: true 7 | }, 8 | 9 | /** 10 | * 组件的属性列表 11 | */ 12 | properties: { 13 | fields: { 14 | type: Array, 15 | value: [], 16 | }, 17 | }, 18 | 19 | /** 20 | * 组件的初始数据 21 | */ 22 | data: { 23 | cur: -1, 24 | }, 25 | 26 | /** 27 | * 生命周期方法 28 | */ 29 | lifetimes: { 30 | attached: function () { 31 | 32 | }, 33 | 34 | ready: function () { 35 | 36 | 37 | }, 38 | 39 | detached: function () { 40 | // 在组件实例被从页面节点树移除时执行 41 | }, 42 | }, 43 | 44 | /** 45 | * 组件的方法列表 46 | */ 47 | methods: { 48 | setGlow(cur) { 49 | this.setData({ 50 | cur 51 | }); 52 | setTimeout(() => { 53 | this.setData({ 54 | cur: -1 55 | }); 56 | }, 800); 57 | }, 58 | 59 | url: function (e) { 60 | pageHelper.url(e, this); 61 | }, 62 | 63 | set: function (fields) { 64 | this.setData({ 65 | fields 66 | }); 67 | this.triggerEvent('formset', fields); 68 | }, 69 | 70 | get: function () { 71 | return this.data.fields; 72 | }, 73 | 74 | bindUpTap: function (e) { 75 | let idx = pageHelper.dataset(e, 'idx'); 76 | let fields = this.data.fields; 77 | dataHelper.arraySwap(fields, idx, idx - 1); 78 | this.setData({ 79 | fields 80 | }); 81 | this.setGlow(idx - 1); 82 | this.triggerEvent('formset', fields); 83 | }, 84 | bindDownTap: function (e) { 85 | let idx = pageHelper.dataset(e, 'idx'); 86 | let fields = this.data.fields; 87 | dataHelper.arraySwap(fields, idx, idx + 1); 88 | this.setData({ 89 | fields 90 | }); 91 | this.setGlow(idx + 1); 92 | this.triggerEvent('formset', fields); 93 | } 94 | } 95 | }) -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_set/form_set_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_set/form_set_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{item.title}} 9 | 10 | 11 | 12 | 单行文本, 13 | 日期, 14 | 时间点, 15 | 单项选择, 16 | 多项选择, 17 | 开关选择, 18 | 省市区, 19 | 多行文本, 20 | 年份, 21 | 月份, 22 | 整数数字, 23 | 小数数字, 24 | 身份证, 25 | 手机, 26 | 27 | 必填 28 | 选填 29 | 30 | 31 | 32 | 33 | 34 | 添加新字段 35 | 36 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_set/form_set_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .picker-set { 2 | line-height: 100rpx; 3 | font-size: 24rpx; 4 | width: 100%; 5 | text-align: right; 6 | color: #999; 7 | width: 210rpx; 8 | } 9 | 10 | .form-group .picker-set { 11 | padding-right: 40rpx; 12 | overflow: hidden; 13 | position: relative; 14 | } 15 | 16 | .form-group.cur { 17 | animation: glow 800ms linear 1 alternate; 18 | } 19 | 20 | @keyframes glow { 21 | 0% { 22 | background-color: #ececec; 23 | } 24 | 100% { 25 | background-color: #fff; 26 | } 27 | } 28 | 29 | .form-group-active{ 30 | background-color: #ececec; 31 | } 32 | 33 | .form-group .title { 34 | font-weight: normal; 35 | color: #333; 36 | flex: 1; 37 | padding-right: 10rpx; 38 | } 39 | 40 | .form-group .field-oprt { 41 | color: #777; 42 | background: hsla(0, 0%, 100%, .95); 43 | border-radius: 5rpx; 44 | box-shadow: 0 0 5px rgba(0, 0, 0, .1); 45 | display: flex; 46 | text-align: center; 47 | align-items: center; 48 | justify-content: center; 49 | margin-right: 15rpx; 50 | } 51 | 52 | .form-group .field-oprt>view{ 53 | width:70rpx; 54 | height:55rpx; 55 | display: flex; 56 | text-align: center; 57 | align-items: center; 58 | justify-content: center; 59 | font-size:36rpx; 60 | } 61 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_show/form_show_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": { 4 | "cmpt-checkbox": "/cmpts/public/checkbox/checkbox_cmpt" 5 | } 6 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/form/form_show/form_show_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .form-group .picker-base { 2 | flex:1; 3 | text-align: right; 4 | height: 60rpx; 5 | line-height: 60rpx; 6 | } 7 | 8 | .form-group .picker-select { 9 | padding-right: 40rpx; 10 | overflow: hidden; 11 | position: relative; 12 | } 13 | 14 | .form-group .title { 15 | height:unset!important; 16 | min-height: 60rpx; 17 | } 18 | 19 | 20 | /* 核对信息窗口 */ 21 | .modal-check-info { 22 | width:100%; 23 | } 24 | 25 | .slot-class { 26 | padding:0 20rpx 30rpx; 27 | } 28 | 29 | .modal-check-info .item{ 30 | width:100%; 31 | display: flex; 32 | justify-content: flex-start; 33 | align-items: flex-start; 34 | line-height: 1.8; 35 | font-size: 30rpx; 36 | border-bottom: 1rpx dotted #ddd; 37 | color:#000; 38 | padding:10rpx 10rpx; 39 | } 40 | 41 | .modal-check-info .item:nth-child(odd){ 42 | background-color: #f8f8f8; 43 | } 44 | .modal-check-info .item:last-child{ 45 | border-bottom: 0rpx; 46 | } 47 | 48 | .modal-check-info .item .title{ 49 | font-weight: bold; 50 | max-width: 150rpx; 51 | margin-right: 20rpx; 52 | text-align: left; 53 | } 54 | 55 | .modal-check-info .item .content{ 56 | flex:1; 57 | color:#333; 58 | display: flex; 59 | justify-content: flex-start; 60 | align-items: flex-start; 61 | text-align: left; 62 | } 63 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/img/img_upload_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/img/img_upload_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{title}} (每张大小不超过{{imgUploadSize}}M) 4 | 5 | 6 | {{imgList.length}}/{{imgMax}} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | #{{index}} 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/img/img_upload_cmpt.wxss: -------------------------------------------------------------------------------- 1 | @import "../../../style/comm/comm.wxss"; 2 | @import "../../../style/project/base/project.wxss"; 3 | 4 | .form-group .upload-img .img-no { 5 | position: absolute; 6 | right: 0; 7 | bottom: 0; 8 | border-top-left-radius: 6rpx; 9 | padding: 6rpx 12rpx; 10 | height: 35rpx; 11 | opacity: .9; 12 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/list/comm_list_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/modal/modal_cmpt.js: -------------------------------------------------------------------------------- 1 | // cmpts/public/modal/modal.js 2 | Component({ 3 | options: { 4 | addGlobalClass: true, 5 | multipleSlots: true 6 | }, 7 | 8 | externalClasses: ['slot-class'], 9 | 10 | /** 11 | * 组件的属性列表 12 | */ 13 | properties: { 14 | type: { // 类型 comm/bottom/dialog/image 15 | type: String, 16 | value: 'comm' 17 | }, 18 | title: { 19 | type: String, 20 | value: '温馨提示' 21 | }, 22 | subtitle: { 23 | type: String, 24 | value: '' 25 | }, 26 | subtitleAlign: { 27 | type: String, 28 | value: 'center' 29 | }, 30 | show: { 31 | type: Boolean, 32 | value: true 33 | }, 34 | cancelText: { 35 | type: String, 36 | value: '取消' 37 | }, 38 | confirmText: { 39 | type: String, 40 | value: '确定' 41 | }, 42 | showConfirm: { 43 | type: Boolean, 44 | value: true 45 | }, 46 | imgURL: { 47 | type: String, 48 | value: '' 49 | }, 50 | 51 | height: { 52 | type: Number, 53 | value: 600 54 | }, 55 | }, 56 | 57 | /** 58 | * 组件的初始数据 59 | */ 60 | data: { 61 | 62 | }, 63 | 64 | /** 65 | * 组件的方法列表 66 | */ 67 | methods: { 68 | bindHideModalTap: function (e) { 69 | this.setData({ 70 | show: '' 71 | }) 72 | }, 73 | 74 | nomove: function () {}, 75 | 76 | bindComfirmTap: function (e) { 77 | this.triggerEvent('click', {}); 78 | } 79 | } 80 | }) -------------------------------------------------------------------------------- /miniprogram/cmpts/public/modal/modal_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/modal/modal_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .bg-img { 2 | width: 100%; 3 | height: 100%; 4 | position: relative; 5 | } 6 | 7 | .bg-img>image { 8 | top: 0; 9 | left: 0; 10 | position: absolute; 11 | width: 100%; 12 | height: 100%; 13 | } 14 | 15 | .bg-img .action .icon-close { 16 | font-size: 50rpx !important; 17 | font-weight: bold; 18 | } 19 | 20 | .modal .dialog { 21 | padding: 20rpx 0rpx; 22 | margin-top:30rpx; 23 | margin-bottom:30rpx; 24 | } 25 | 26 | .modal .dialog .bar { 27 | background-color: #f8f8f8; 28 | } 29 | 30 | .modal .dialog .bar .content { 31 | color: #333; 32 | font-size: 36rpx; 33 | } 34 | 35 | .modal-bar { 36 | width: 100%; 37 | display: flex; 38 | align-items: center; 39 | justify-content: center; 40 | border-top: 1rpx solid #ccc; 41 | line-height: 3; 42 | } 43 | 44 | .modal-bar>view { 45 | width: 50%; 46 | font-size: 36rpx; 47 | font-weight: bold; 48 | } 49 | 50 | .modal-bar .modal-bar-comfirm { 51 | color: #576B95; 52 | border-left: 1rpx solid #ccc; 53 | } 54 | 55 | .modal .modal-dialog { 56 | padding: 10rpx 0rpx 0; 57 | } 58 | 59 | .modal .modal-dialog .subtitle { 60 | width:100%; 61 | text-align: center; 62 | font-size:30rpx; 63 | color:#777; 64 | padding:0 60rpx; 65 | margin-top:10rpx; 66 | margin-bottom:20rpx; 67 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker/picker_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker/picker_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{options[idx].label || noDataHint}} 4 | {{options[idx] || noDataHint}} 5 | 6 | 7 | 8 | 9 | 10 | 11 | {{multiDesc || noDataHint}} 12 | 13 | 14 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker/picker_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .picker-cmpt { 2 | line-height: 100rpx; 3 | font-size: 28rpx; 4 | text-overflow: ellipsis; 5 | white-space: nowrap; 6 | overflow: hidden; 7 | width: 100%; 8 | text-align: right; 9 | padding-right: 40rpx; 10 | } 11 | 12 | .disabled { 13 | background-color: #eee; 14 | color:#999; 15 | } 16 | 17 | .picker-cmpt::before { 18 | position: absolute; 19 | top: 0; 20 | right: 30rpx; 21 | bottom: 0; 22 | display: block; 23 | margin: auto; 24 | width: 30rpx; 25 | height: 30rpx; 26 | color: var(--grey); 27 | content: "\e6a3"; 28 | text-align: center; 29 | font-size: 34rpx; 30 | font-family: "icon"; 31 | line-height: 30rpx; 32 | margin-top: auto; 33 | margin-right: auto; 34 | margin-bottom: auto; 35 | margin-left: auto; 36 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker_multi/picker_multi_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker_multi/picker_multi_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}} 6 | 7 | 8 | {{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}} 9 | 10 | 11 | {{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}},{{multiArray[3][multiIndex[3]]}} 12 | 13 | 14 | {{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}},{{multiArray[3][multiIndex[3]]}},{{multiArray[4][multiIndex[4]]}} 15 | 16 | 17 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker_multi/picker_multi_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .picker-cmpt { 2 | line-height: 100rpx; 3 | font-size: 28rpx; 4 | text-overflow: ellipsis; 5 | white-space: nowrap; 6 | overflow: hidden; 7 | width: 100%; 8 | text-align: right; 9 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker_time/picker_time_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker_time/picker_time_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/picker_time/picker_time_cmpt.wxss: -------------------------------------------------------------------------------- 1 | /* cmpts/public/picker_time/picker_time_cmpt.wxss */ -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/images/friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/miniprogram/cmpts/public/poster/images/friend.png -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/images/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/miniprogram/cmpts/public/poster/images/wechat.png -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/poster_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": { 4 | "poster": "./wxa-plugin-canvas/poster" 5 | } 6 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/poster_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 关闭 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 26 | 27 | 28 | 29 | 保存后发朋友圈 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/poster_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .main-poster .poster-share { 2 | width: 100%; 3 | display: flex; 4 | justify-content: space-around; 5 | align-items: center; 6 | padding: 0rpx 50rpx 20rpx; 7 | } 8 | 9 | .main-poster .poster-share .item { 10 | display: flex; 11 | flex-direction: column; 12 | justify-content: flex-start; 13 | align-items: center; 14 | color: #333; 15 | } 16 | 17 | .main-poster .poster-share .item .pic { 18 | height: 100rpx; 19 | width: 100rpx; 20 | background-color: #f2f2f2; 21 | border-radius: 50%; 22 | display: flex; 23 | justify-content: center; 24 | align-items: center; 25 | } 26 | 27 | .main-poster .poster-share .item-share { 28 | margin-top: 15rpx; 29 | } 30 | 31 | .main-poster .poster-share .item-share>text { 32 | margin-top: -5rpx !important; 33 | } 34 | 35 | .main-poster .poster-share .item .pic image { 36 | height: 50rpx; 37 | width: 50rpx; 38 | } 39 | 40 | .main-poster .poster-share .item .pic .friend { 41 | height: 60rpx; 42 | width: 60rpx; 43 | } 44 | 45 | .main-poster .poster-share .item>text { 46 | margin-top: 10rpx; 47 | font-size: 30rpx; 48 | text-align: center; 49 | } 50 | 51 | .main-poster .poster-img { 52 | display: flex; 53 | justify-content: center; 54 | align-items: center; 55 | padding-top: 0rpx; 56 | padding-bottom: 20rpx; 57 | min-height: 700rpx; 58 | } 59 | 60 | .load.loading::after { 61 | content: "生成中..."; 62 | } 63 | 64 | .main-poster .poster-img image { 65 | width: 375rpx; 66 | border-radius: 15rpx; 67 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true 3 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/index/index.wxss: -------------------------------------------------------------------------------- 1 | .canvas { 2 | width: 750rpx; 3 | height: 750rpx; 4 | } 5 | .canvas.pro { 6 | position: absolute; 7 | bottom: 0; 8 | left: 0; 9 | transform: translate3d(-9999rpx, 0, 0); 10 | } 11 | .canvas.debug { 12 | position: absolute; 13 | bottom: 0; 14 | left: 0; 15 | border: 1rpx solid #ccc; 16 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/poster/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": { 4 | "we-canvas": "../index/index" 5 | } 6 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/poster/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/poster/index.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/miniprogram/cmpts/public/poster/wxa-plugin-canvas/poster/index.wxss -------------------------------------------------------------------------------- /miniprogram/cmpts/public/poster/wxa-plugin-canvas/poster/poster.js: -------------------------------------------------------------------------------- 1 | const defaultOptions = { 2 | selector: '#poster' 3 | }; 4 | 5 | function Poster(options = {}, that) { 6 | options = { 7 | ...defaultOptions, 8 | ...options, 9 | }; 10 | 11 | const pages = getCurrentPages(); 12 | let ctx = pages[pages.length - 1]; 13 | if (that) ctx = that 14 | const poster = ctx.selectComponent(options.selector); 15 | delete options.selector; 16 | 17 | return poster; 18 | }; 19 | 20 | Poster.create = (reset = false, that) => { 21 | const poster = Poster({}, that); 22 | if (!poster) { 23 | console.error('请设置组件的id="poster"!!!'); 24 | } else { 25 | return Poster({}, that).onCreate(reset); 26 | } 27 | } 28 | 29 | export default Poster; 30 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/table/table_cmpt.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | Component({ 5 | /** 6 | * 外部样式类 7 | */ 8 | externalClasses: ['header-row-class-name', 'row-class-name', 'cell-class-name'], 9 | 10 | /** 11 | * 组件样式隔离 12 | */ 13 | options: { 14 | styleIsolation: "isolated", 15 | multipleSlots: true // 支持多个slot 16 | }, 17 | 18 | /** 19 | * 组件的属性列表 20 | */ 21 | properties: { 22 | data: { 23 | type: Array, 24 | value: [] 25 | }, 26 | headers: { 27 | type: Array, 28 | value: [] 29 | }, 30 | // table的高度, 溢出可滚动 31 | height: { 32 | type: String, 33 | value: 'auto' 34 | }, 35 | width: { 36 | type: Number || String, 37 | value: '100%' 38 | }, 39 | // 单元格的宽度 40 | tdWidth: { 41 | type: Number, 42 | value: 35 43 | }, 44 | // 固定表头 thead达到Header的位置时就应该被fixed了 45 | offsetTop: { 46 | type: Number, 47 | value: 150 48 | }, 49 | // 是否带有纵向边框 50 | stripe: { 51 | type: Boolean, 52 | value: false 53 | }, 54 | // 是否带有纵向边框 55 | border: { 56 | type: Boolean, 57 | value: false 58 | }, 59 | msg: { 60 | type: String, 61 | value: '暂无数据~' 62 | } 63 | }, 64 | 65 | /** 66 | * 组件的初始数据 67 | */ 68 | data: { 69 | scrolWidth: '20%' 70 | }, 71 | 72 | lifetimes: { 73 | attached: function () { 74 | 75 | }, 76 | ready: function () { 77 | 78 | }, 79 | detached: function () { 80 | // 在组件实例被从页面节点树移除时执行 81 | }, 82 | }, 83 | 84 | /** 85 | * 组件的方法列表 86 | */ 87 | methods: { 88 | 89 | } 90 | }) -------------------------------------------------------------------------------- /miniprogram/cmpts/public/table/table_cmpt.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/cmpts/public/table/table_cmpt.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ item.label }} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | {{it[head["prop"]]}} 16 | 17 | 18 | 19 | 20 | 21 | {{ msg }} 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /miniprogram/cmpts/public/table/table_cmpt.wxss: -------------------------------------------------------------------------------- 1 | .reset { 2 | background: white; 3 | } 4 | 5 | .other { 6 | font-size: 20px; 7 | } 8 | 9 | .table { 10 | position: relative; 11 | font-size: 28rpx; 12 | background: #fff; 13 | border-right:none; 14 | border-radius: 8rpx; 15 | overflow: hidden; 16 | } 17 | .thead{ 18 | border-bottom: none; 19 | display: flex; 20 | justify-content: flex-start; 21 | border-top-right-radius: 8rpx; 22 | border-top-left-radius: 8rpx; 23 | overflow: visible; 24 | color: #909399; 25 | border: 1px solid #ebeef5; 26 | box-sizing: border-box; 27 | } 28 | .thead .td { 29 | padding: 20rpx 10rpx; 30 | font-weight: bold; 31 | display: inline-block; 32 | white-space:nowrap; 33 | text-align: center; 34 | border-right: 1rpx solid #fff; 35 | } 36 | .thead .td:last-child { 37 | border-right: none; 38 | } 39 | .thead-border .td { 40 | border-right: 1rpx solid #ebeef5; 41 | } 42 | .thead-border .td:last-child { 43 | border-right: none; 44 | } 45 | /* .tr{ 46 | display: flex; 47 | white-space:nowrap; 48 | } */ 49 | .tbody { 50 | box-sizing: border-box; 51 | font-size: 28rpx; 52 | color: #666; 53 | border: 1px solid #ebeef5; 54 | border-top: none; 55 | border-bottom-left-radius: 8rpx; 56 | border-bottom-right-radius: 8rpx; 57 | } 58 | .tbody-tr { 59 | display: flex; 60 | border-bottom: 1px solid #ebeef5; 61 | } 62 | .tbody-tr:last-child { 63 | border-bottom-left-radius: 8rpx; 64 | border-bottom-right-radius: 8rpx; 65 | } 66 | 67 | .tbody-tr-stripe { 68 | background: #fff; 69 | border-bottom: none; 70 | } 71 | .tbody-tr-stripe:nth-child(2n) { 72 | background: #F6F6F6; 73 | } 74 | .tbody-tr .td { 75 | white-space: wrap; 76 | padding:20rpx 10rpx; 77 | text-align: center; 78 | } 79 | 80 | .tbody-tr-border .td { 81 | border-right: 1rpx solid #F6F6F6; 82 | } 83 | .tbody-tr-border .td:last-child { 84 | border-right: none; 85 | } 86 | .no-data { 87 | display: flex; 88 | padding: 50rpx; 89 | color: #666; 90 | justify-content: center; 91 | } -------------------------------------------------------------------------------- /miniprogram/helper/cache_helper.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 微信缓存二次封装,有设置时效性的封装 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | const helper = require('./helper.js'); 7 | 8 | const TIME_SUFFIX = "_deadtime" 9 | 10 | /** 11 | * 设置 12 | * k 键key 13 | * v 值value 14 | * t 秒 15 | */ 16 | function set(k, v, t = 86400 * 30) { 17 | if (!k) return null; 18 | 19 | wx.setStorageSync(k, v); 20 | let seconds = parseInt(t); 21 | if (seconds > 0) { 22 | let newtime = Date.parse(new Date()); 23 | newtime = newtime / 1000 + seconds; 24 | wx.setStorageSync(k + TIME_SUFFIX, newtime + ""); 25 | } else { 26 | wx.removeStorageSync(k + TIME_SUFFIX); 27 | } 28 | } 29 | 30 | 31 | /** 32 | * 获取 33 | * k 键key 34 | * def 默认值 35 | */ 36 | function get(k, def = null) { 37 | if (!k) return null; 38 | 39 | let deadtime = wx.getStorageSync(k + TIME_SUFFIX); 40 | if (!deadtime) return def; 41 | 42 | deadtime = parseInt(deadtime); 43 | if (!deadtime) return def; 44 | 45 | if (deadtime) { 46 | if (parseInt(deadtime) < Date.parse(new Date()) / 1000) { 47 | wx.removeStorageSync(k); 48 | wx.removeStorageSync(k + TIME_SUFFIX); 49 | return def; 50 | } 51 | } 52 | 53 | let res = wx.getStorageSync(k); 54 | 55 | if (helper.isDefined(res)) { 56 | return res; 57 | } else { 58 | return def; 59 | } 60 | } 61 | 62 | /** 63 | * 删除 64 | */ 65 | function remove(k) { 66 | if (!k) return null; 67 | 68 | wx.removeStorageSync(k); 69 | wx.removeStorageSync(k + TIME_SUFFIX); 70 | } 71 | 72 | /** 73 | * 清除所有key 74 | */ 75 | function clear() { 76 | wx.clearStorageSync(); 77 | } 78 | 79 | module.exports = { 80 | set, 81 | get, 82 | remove, 83 | clear 84 | } -------------------------------------------------------------------------------- /miniprogram/helper/file_helper.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 文件处理相关函数 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2022-02-05 04:00:00 5 | */ 6 | const pageHelper = require('./page_helper.js'); 7 | const timeHelper = require('./time_helper.js'); 8 | 9 | function openDoc(name, url, ext = '.xlsx') { 10 | 11 | wx.showLoading({ 12 | title: '文件下载中', 13 | }); 14 | 15 | wx.downloadFile({ 16 | url, 17 | //fileID:' ', 18 | filePath: wx.env.USER_DATA_PATH + '/' + name + timeHelper.time('YMDhms') + ext, 19 | success: function (res) { 20 | wx.hideLoading(); 21 | console.log(res); 22 | if (res.statusCode != 200) 23 | return pageHelper.showModal('打开文件失败,请重试或者采取别的下载方式'); 24 | 25 | const filePath = res.filePath; 26 | wx.openDocument({ 27 | showMenu: true, 28 | filePath: filePath, 29 | success: function (res) { 30 | console.log('打开文档成功'); 31 | } 32 | }) 33 | }, 34 | fail: function (err) { 35 | wx.hideLoading(); 36 | console.log(err); 37 | pageHelper.showModal('打开文件失败,请重试或者采取别的下载方式'); 38 | } 39 | }) 40 | } 41 | 42 | module.exports = { 43 | openDoc 44 | } -------------------------------------------------------------------------------- /miniprogram/helper/form_helper.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 表单通用类库 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2021-02-28 07:48:00 5 | */ 6 | 7 | 8 | /** 9 | * model变表单 10 | * @param {*} model 11 | */ 12 | function model2Form(model) { 13 | let newModel = {}; 14 | for (let k in model) { 15 | let arr = k.split('_'); 16 | let result = ''; 17 | for (let i = 1; i < arr.length; i++) { 18 | let name = arr[i].toLowerCase(); 19 | name = name.charAt(0).toUpperCase() + name.slice(1); 20 | result = result + name; 21 | } 22 | 23 | newModel['form' + result] = model[k]; 24 | } 25 | return newModel; 26 | } 27 | 28 | // picker表单赋值到页面data 29 | function setOptions(that, options, name, val) { 30 | let idx = options.indexOf(val); 31 | idx = (idx < 0) ? 0 : idx; 32 | that.setData({ 33 | [name]: idx 34 | }) 35 | } 36 | 37 | module.exports = { 38 | model2Form, 39 | setOptions 40 | } -------------------------------------------------------------------------------- /miniprogram/helper/helper.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Notes: 通用类库 3 | * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux@qq.com 4 | * Date: 2020-11-14 07:48:00 5 | */ 6 | 7 | /** 8 | * 判断变量,参数,对象属性是否定义 9 | * @param {*} val 10 | */ 11 | function isDefined(val) { 12 | // == 不能判断是否为null 13 | if (val === undefined) 14 | return false; 15 | else 16 | return true; 17 | } 18 | 19 | /** 20 | * 判断对象是否为空 21 | * @param {*} obj 22 | */ 23 | function isObjectNull(obj) { 24 | return (Object.keys(obj).length == 0); 25 | } 26 | 27 | 28 | function sleep(time) { 29 | return new Promise((resolve) => setTimeout(resolve, time)); 30 | }; 31 | 32 | 33 | function formatNumber(n) { 34 | n = n.toString() 35 | return n[1] ? n : '0' + n 36 | } 37 | 38 | /** 39 | * 从picker options中 获取索引值 40 | * @param {*} options 41 | * [{ 42 | value: 0, 43 | label: '猎头' 44 | }] 45 | * @param {*} val 46 | */ 47 | function getOptionsIdx(options, val) { 48 | for (let i = 0; i < options.length; i++) { 49 | if (options[i].value === val) 50 | return i; 51 | } 52 | return 0; 53 | } 54 | 55 | 56 | 57 | module.exports = { 58 | isDefined, 59 | isObjectNull, 60 | sleep, 61 | 62 | 63 | getOptionsIdx, 64 | 65 | } -------------------------------------------------------------------------------- /miniprogram/images/default_cover_pic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chetanbuluo/StudyRoom/26923b05bd4d5356527f37ef7c786d54633dc2e0/miniprogram/images/default_cover_pic.gif -------------------------------------------------------------------------------- /miniprogram/pages/admin/content/admin_content.js: -------------------------------------------------------------------------------- 1 | const AdminBiz = require('../../../biz/admin_biz.js'); 2 | const pageHelper = require('../../../helper/page_helper.js'); 3 | 4 | Page({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | formContent: [{ 11 | type: 'text', 12 | val: '', 13 | }] 14 | }, 15 | 16 | /** 17 | * 生命周期函数--监听页面加载 18 | */ 19 | onLoad: async function (options) { 20 | if (!AdminBiz.isAdmin(this)) return; 21 | 22 | let parent = pageHelper.getPrevPage(2); 23 | if (!parent) return; 24 | 25 | let formContent = parent.data.formContent; 26 | if (formContent && formContent.length > 0) 27 | this.setData({ 28 | formContent 29 | }); 30 | }, 31 | 32 | 33 | 34 | 35 | /** 36 | * 生命周期函数--监听页面初次渲染完成 37 | */ 38 | onReady: function () { 39 | 40 | }, 41 | 42 | /** 43 | * 生命周期函数--监听页面显示 44 | */ 45 | onShow: function () {}, 46 | 47 | /** 48 | * 生命周期函数--监听页面隐藏 49 | */ 50 | onHide: function () { 51 | 52 | }, 53 | 54 | /** 55 | * 生命周期函数--监听页面卸载 56 | */ 57 | onUnload: function () { 58 | 59 | }, 60 | 61 | /** 62 | * 页面相关事件处理函数--监听用户下拉动作 63 | */ 64 | onPullDownRefresh: async function () { 65 | 66 | }, 67 | 68 | model: function (e) { 69 | pageHelper.model(this, e); 70 | }, 71 | 72 | bindSaveTap: function (e) { 73 | let parent = pageHelper.getPrevPage(2); 74 | if (!parent) return; 75 | parent.setData({ 76 | formContent: this.data.formContent 77 | }); 78 | }, 79 | 80 | url: function (e) { 81 | pageHelper.url(e, this); 82 | }, 83 | 84 | bindSaveTap: function (e) { 85 | let formContent = this.selectComponent("#contentEditor").getNodeList(); 86 | 87 | let parent = pageHelper.getPrevPage(2); 88 | if (!parent) return; 89 | 90 | parent.setData({ 91 | formContent 92 | }, () => { 93 | parent._setContentDesc(); 94 | }); 95 | 96 | wx.navigateBack({ 97 | delta: 0, 98 | }); 99 | } 100 | }) -------------------------------------------------------------------------------- /miniprogram/pages/admin/content/admin_content.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-editor": "../../../cmpts/public/editor/editor_cmpt" 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "navigationBarTitleText": "详细内容" 8 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/content/admin_content.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 不保存,返回 12 | 保存 13 | 14 | 15 | -------------------------------------------------------------------------------- /miniprogram/pages/admin/content/admin_content.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../style/project/base/admin.wxss'; 2 | 3 | .main-admin { 4 | width: 100%; 5 | box-sizing: border-box; 6 | padding: 30rpx 20rpx; 7 | padding-bottom: 200rpx; 8 | } 9 | 10 | .form-group { 11 | padding: 1rpx 1rpx; 12 | overflow: hidden; 13 | } 14 | 15 | .oprt { 16 | display: flex; 17 | width: 100%; 18 | justify-content: space-around; 19 | } 20 | 21 | .oprt button { 22 | width: 45%; 23 | } 24 | 25 | .bottom-oprt { 26 | position: fixed; 27 | bottom: 0; 28 | height: 130rpx; 29 | background-color: #f8f8f8; 30 | display: flex; 31 | justify-content: space-around; 32 | align-items: center; 33 | border-top: 1rpx solid #ccc; 34 | z-index: 99999; 35 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/index/home/admin_home.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-foot": "../../../../cmpts/biz/foot/foot_cmpt" 4 | }, 5 | "enablePullDownRefresh": true, 6 | "navigationBarBackgroundColor": "#2499f2", 7 | "navigationBarTextStyle": "white", 8 | "navigationBarTitleText": "后台管理" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/index/home/admin_home.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | .main-admin { 4 | padding: 0; 5 | } 6 | 7 | .admin-info { 8 | height: 200rpx; 9 | width: 100%; 10 | color: #fff; 11 | display: flex; 12 | justify-content: flex-start; 13 | align-items: center; 14 | position: relative; 15 | } 16 | 17 | .admin-info .pic { 18 | width: 100rpx; 19 | height: 100rpx; 20 | font-size: 70rpx; 21 | display: flex; 22 | justify-content: center; 23 | align-items: center; 24 | margin-right: 20rpx; 25 | } 26 | 27 | .admin-info .right { 28 | flex: 1; 29 | display: flex; 30 | flex-direction: column; 31 | } 32 | 33 | .admin-info .right .name { 34 | font-size: 32rpx; 35 | line-height: 1.8; 36 | } 37 | 38 | .admin-info .right .desc { 39 | font-size: 24rpx; 40 | line-height: 1.3; 41 | } 42 | 43 | .admin-info .exit-admin { 44 | position: absolute; 45 | top: 12rpx; 46 | right: 12rpx; 47 | font-size: 45rpx; 48 | } 49 | 50 | 51 | .main-admin .comm-list, 52 | .main-admin .bar { 53 | background-color: #fff; 54 | width: 100%; 55 | } 56 | 57 | .main-admin .exit { 58 | width: 100%; 59 | padding: 0 20rpx; 60 | margin-bottom: 50rpx; 61 | } 62 | 63 | .main-admin .exit button { 64 | width: 100%; 65 | color: #fff; 66 | height: 70rpx; 67 | } 68 | 69 | .grid.col-6>view { 70 | width: 16.66%; 71 | } 72 | 73 | .foot-bottom { 74 | width: 100%; 75 | display: flex; 76 | justify-content: center; 77 | align-items: center; 78 | bottom: 50rpx; 79 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/index/login/admin_login.js: -------------------------------------------------------------------------------- 1 | const AdminBiz = require('../../../../biz/admin_biz.js'); 2 | const pageHelper = require('../../../../helper/page_helper.js'); 3 | const PassportBiz = require('../../../../biz/passport_biz.js'); 4 | 5 | Page({ 6 | 7 | /** 8 | * 页面的初始数据 9 | */ 10 | data: { 11 | name: '', 12 | pwd: '', 13 | }, 14 | 15 | /** 16 | * 生命周期函数--监听页面加载 17 | */ 18 | onLoad: function (options) { 19 | AdminBiz.clearAdminToken(); 20 | }, 21 | 22 | /** 23 | * 生命周期函数--监听页面初次渲染完成 24 | */ 25 | onReady: function () { 26 | 27 | }, 28 | 29 | /** 30 | * 生命周期函数--监听页面显示 31 | */ 32 | onShow: function () {}, 33 | 34 | /** 35 | * 生命周期函数--监听页面隐藏 36 | */ 37 | onHide: function () { 38 | 39 | }, 40 | 41 | /** 42 | * 生命周期函数--监听页面卸载 43 | */ 44 | onUnload: function () { 45 | 46 | }, 47 | 48 | url: function (e) { 49 | pageHelper.url(e, this); 50 | }, 51 | 52 | bindBackTap: function (e) { 53 | wx.reLaunch({ 54 | url: pageHelper.fmtURLByPID('/pages/my/index/my_index'), 55 | }); 56 | }, 57 | 58 | bindLoginTap: async function (e) { 59 | return PassportBiz.adminLogin(this.data.name, this.data.pwd, this); 60 | } 61 | 62 | }) -------------------------------------------------------------------------------- /miniprogram/pages/admin/index/login/admin_login.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-foot": "../../../../cmpts/biz/foot/foot_cmpt" 4 | }, 5 | "disableScroll": true, 6 | "navigationBarBackgroundColor": "#ffffff", 7 | "navigationBarTextStyle": "black" 8 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/index/login/admin_login.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /miniprogram/pages/admin/index/login/admin_login.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | .main-admin { 4 | width: 100%; 5 | min-height: 100vh; 6 | display: flex; 7 | flex-direction: column; 8 | align-items: center; 9 | justify-content: center; 10 | position: relative; 11 | } 12 | 13 | .login { 14 | width: 500rpx; 15 | background-color: #fff; 16 | min-height: 550rpx; 17 | border-radius: 20rpx; 18 | display: flex; 19 | flex-direction: column; 20 | justify-content: space-between; 21 | align-items: center; 22 | padding: 50rpx 20rpx; 23 | margin-top: -100rpx; 24 | } 25 | 26 | .login button { 27 | width: 85%; 28 | color: #fff; 29 | font-size: 32rpx; 30 | } 31 | 32 | .login .hint { 33 | width: 100%; 34 | color: #000; 35 | font-weight: bold; 36 | font-size: 36rpx; 37 | text-align: center; 38 | } 39 | 40 | .login .return { 41 | width: 100%; 42 | font-size: 30rpx; 43 | text-align: center; 44 | font-size: 26rpx; 45 | } 46 | 47 | .pic { 48 | width: 180rpx; 49 | height: 180rpx; 50 | font-size: 130rpx; 51 | display: flex; 52 | justify-content: center; 53 | align-items: center; 54 | } 55 | 56 | .foot-bottom { 57 | width: 100%; 58 | display: flex; 59 | justify-content: center; 60 | align-items: center; 61 | position: absolute; 62 | bottom: 50rpx; 63 | } 64 | 65 | .site-footer { 66 | color: #fff !important; 67 | } 68 | 69 | .form-group .title { 70 | color:#333; 71 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/content/admin_meet_content.js: -------------------------------------------------------------------------------- 1 | const AdminBiz = require('../../../../biz/admin_biz.js'); 2 | const pageHelper = require('../../../../helper/page_helper.js'); 3 | Page({ 4 | 5 | /** 6 | * 页面的初始数据 7 | */ 8 | data: { 9 | formContent: [{ 10 | type: 'text', 11 | val: '', 12 | }] 13 | }, 14 | 15 | /** 16 | * 生命周期函数--监听页面加载 17 | */ 18 | onLoad: async function (options) { 19 | if (!AdminBiz.isAdmin(this)) return; 20 | 21 | let parent = pageHelper.getPrevPage(2); 22 | if (!parent) return; 23 | 24 | let formContent = parent.data.formContent; 25 | if (formContent && formContent.length > 0) 26 | this.setData({ 27 | formContent 28 | }); 29 | }, 30 | 31 | 32 | 33 | 34 | /** 35 | * 生命周期函数--监听页面初次渲染完成 36 | */ 37 | onReady: function () { 38 | 39 | }, 40 | 41 | /** 42 | * 生命周期函数--监听页面显示 43 | */ 44 | onShow: function () {}, 45 | 46 | /** 47 | * 生命周期函数--监听页面隐藏 48 | */ 49 | onHide: function () { 50 | 51 | }, 52 | 53 | /** 54 | * 生命周期函数--监听页面卸载 55 | */ 56 | onUnload: function () { 57 | 58 | }, 59 | 60 | /** 61 | * 页面相关事件处理函数--监听用户下拉动作 62 | */ 63 | onPullDownRefresh: async function () { 64 | 65 | }, 66 | 67 | model: function (e) { 68 | pageHelper.model(this, e); 69 | }, 70 | 71 | bindSaveTap: function (e) { 72 | let parent = pageHelper.getPrevPage(2); 73 | if (!parent) return; 74 | parent.setData({ 75 | formContent: this.data.formContent 76 | }); 77 | }, 78 | 79 | bindSaveTap: function (e) { 80 | let formContent = this.selectComponent("#contentEditor").getNodeList(); 81 | 82 | let parent = pageHelper.getPrevPage(2); 83 | if (!parent) return; 84 | 85 | parent.setData({ 86 | formContent 87 | }, () => { 88 | parent._setContentDesc(); 89 | }); 90 | 91 | wx.navigateBack({ 92 | delta: 0, 93 | }); 94 | } 95 | }) -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/content/admin_meet_content.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-editor": "../../../../cmpts/public/editor/editor_cmpt" 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "navigationBarTitleText": "后台-预约详细介绍" 8 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/content/admin_meet_content.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 不保存,返回 12 | 保存 13 | 14 | 15 | -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/content/admin_meet_content.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | .main-admin { 4 | width: 100%; 5 | box-sizing: border-box; 6 | padding: 30rpx 20rpx; 7 | padding-bottom: 200rpx; 8 | } 9 | 10 | .form-group { 11 | padding: 1rpx 1rpx; 12 | overflow: hidden; 13 | } 14 | 15 | .oprt { 16 | display: flex; 17 | width: 100%; 18 | justify-content: space-around; 19 | } 20 | 21 | .oprt button { 22 | width: 45%; 23 | } 24 | 25 | .bottom-oprt { 26 | position: fixed; 27 | bottom: 0; 28 | height: 130rpx; 29 | background-color: #f8f8f8; 30 | display: flex; 31 | justify-content: space-around; 32 | align-items: center; 33 | border-top: 1rpx solid #ccc; 34 | z-index: 99999; 35 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/cover/admin_meet_cover.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | }, 4 | "navigationBarBackgroundColor": "#2499f2", 5 | "navigationBarTextStyle": "white", 6 | "navigationBarTitleText": "后台-预约封面设置" 7 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/cover/admin_meet_cover.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | @import '../../../../style/project/base/appt.wxss'; 3 | 4 | .form-box-main { 5 | width: 100%; 6 | box-sizing: border-box; 7 | padding: 0rpx 20rpx; 8 | } 9 | 10 | .demo { 11 | background-color: #ffff; 12 | width: 100%; 13 | display: flex; 14 | flex-direction: row; 15 | justify-content: flex-start; 16 | align-items: center; 17 | } 18 | 19 | .demo { 20 | background-color: #f2f2f2; 21 | width: 100%; 22 | display: flex; 23 | flex-direction: column; 24 | justify-content: flex-start; 25 | align-items: center; 26 | padding: 0 20rpx; 27 | } 28 | 29 | .demo .demo-title { 30 | width: 100%; 31 | background-color: #fff; 32 | padding: 10rpx 20rpx; 33 | font-size: 32rpx; 34 | color: #333; 35 | text-align: center; 36 | } 37 | 38 | 39 | .form-group .upload-img { 40 | display: flex; 41 | flex-wrap: wrap; 42 | overflow: hidden; 43 | flex: 1; 44 | } 45 | 46 | .form-group .cover-img { 47 | flex: 1; 48 | width: 100%; 49 | display: flex; 50 | align-items: center; 51 | justify-content: flex-end; 52 | } 53 | 54 | .form-group .cover-img image { 55 | width: 60rpx; 56 | height: 60rpx; 57 | border-radius: 5rpx; 58 | } 59 | 60 | .form-group .cover-img .close-img, 61 | .form-group .cover-img .upload-img { 62 | height: 60rpx; 63 | border-radius: 5rpx; 64 | text-align: center; 65 | display: flex; 66 | justify-content: flex-end; 67 | align-items: center; 68 | font-size: 50rpx; 69 | color: orange; 70 | min-width: 80rpx; 71 | } 72 | 73 | .form-group .cover-img .upload-img { 74 | color: #999; 75 | font-weight: normal; 76 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/edit/admin_meet_edit.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-form-set": "../../../../cmpts/public/form/form_set/form_set_cmpt", 4 | "cmpt-picker-time": "../../../../cmpts/public/picker_time/picker_time_cmpt", 5 | "cmpt-picker-multi": "../../../../cmpts/public/picker_multi/picker_multi_cmpt" 6 | }, 7 | "navigationBarBackgroundColor": "#2499f2", 8 | "navigationBarTextStyle": "white", 9 | "enablePullDownRefresh": true, 10 | "navigationBarTitleText": "后台-活动/预约添加" 11 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/edit/admin_meet_edit.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | 4 | .main-admin { 5 | padding: 20rpx 0rpx; 6 | 7 | } 8 | 9 | .form-box { 10 | border-radius: 0; 11 | } 12 | 13 | .modal-rules { 14 | display: flex; 15 | flex-direction: column; 16 | align-items: center; 17 | justify-content: center; 18 | padding: 0; 19 | } 20 | 21 | .modal-rules .padding-xl { 22 | padding: 0; 23 | } 24 | 25 | .modal-rules .item { 26 | width: 100%; 27 | display: flex; 28 | flex-direction: column; 29 | align-items: center; 30 | justify-content: center; 31 | border-bottom: 2rpx solid #ddd; 32 | padding: 20rpx 0; 33 | position: relative; 34 | } 35 | 36 | .modal-rules .item.cur { 37 | background-color: #f2f2f2; 38 | font-weight: bold; 39 | } 40 | 41 | .modal-rules .item.cur .icon-right { 42 | color: var(--adminColor)!important; 43 | } 44 | 45 | .modal-rules .item .icon-right { 46 | right: 10rpx; 47 | position: absolute; 48 | top: 50rpx; 49 | } 50 | 51 | .modal-rules .item.item-last { 52 | border-bottom: 0; 53 | } 54 | 55 | .modal-rules .item .title { 56 | font-size: 36rpx; 57 | color: #111; 58 | } 59 | 60 | .modal-rules .item .desc { 61 | font-size: 28rpx; 62 | color: #777; 63 | margin-top: 10rpx; 64 | } 65 | 66 | cmpt-picker-multi { 67 | flex: 1; 68 | } 69 | 70 | .form-group .desc-textarea { 71 | height: 100rpx; 72 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/export/admin_join_export.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-picker-time": "../../../../cmpts/public/picker_time/picker_time_cmpt" 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "enablePullDownRefresh": true, 8 | "navigationBarTitleText": "预约名单导出" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/export/admin_join_export.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | .form-box .title-desc { 4 | padding-bottom: 10rpx; 5 | border: 0; 6 | font-size: 29rpx; 7 | color: #888; 8 | } 9 | 10 | .btn-admin{ 11 | margin-bottom: 20rpx; 12 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/join/admin_meet_join.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "navigationBarTitleText": "分时段预约名单" 8 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/list/admin_meet_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "disableScroll": true, 8 | "navigationBarTitleText": "活动/预约管理" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/list/admin_meet_list.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | page { 4 | background-color: #f8f8f8; 5 | } 6 | -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/record/admin_record_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-picker-time": "../../../../cmpts/public/picker_time/picker_time_cmpt" 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "enablePullDownRefresh": true, 8 | "navigationBarTitleText": "预约名单统计" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/record/admin_record_list.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | @import '../../../../style/comm/table.wxss'; 3 | 4 | .main-admin { 5 | width: 100%; 6 | box-sizing: border-box; 7 | padding: 0rpx 0rpx 30rpx; 8 | } 9 | 10 | .table .table-form .oprt .min-btn { 11 | padding: 5rpx 30rpx; 12 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/scan/admin_meet_scan.js: -------------------------------------------------------------------------------- 1 | const AdminBiz = require('../../../../biz/admin_biz.js'); 2 | const pageHelper = require('../../../../helper/page_helper.js'); 3 | const cloudHelper = require('../../../../helper/cloud_helper.js'); 4 | 5 | 6 | Page({ 7 | 8 | /** 9 | * 页面的初始数据 10 | */ 11 | data: { 12 | isLoad: true, 13 | title: '', 14 | }, 15 | 16 | /** 17 | * 生命周期函数--监听页面加载 18 | */ 19 | onLoad: function (options) { 20 | if (!AdminBiz.isAdmin(this)) return; 21 | 22 | if (!pageHelper.getOptions(this, options, 'meetId')) return; 23 | 24 | if (options && options.title) { 25 | let title = decodeURIComponent(options.title); 26 | this.setData({ 27 | title 28 | }); 29 | } 30 | }, 31 | 32 | /** 33 | * 生命周期函数--监听页面初次渲染完成 34 | */ 35 | onReady: function () { 36 | 37 | }, 38 | 39 | /** 40 | * 生命周期函数--监听页面显示 41 | */ 42 | onShow: function () { 43 | 44 | }, 45 | 46 | /** 47 | * 生命周期函数--监听页面隐藏 48 | */ 49 | onHide: function () { 50 | 51 | }, 52 | 53 | /** 54 | * 生命周期函数--监听页面卸载 55 | */ 56 | onUnload: function () { 57 | 58 | }, 59 | 60 | bindScanTap: function (e) { 61 | let meetId = this.data.meetId; 62 | wx.scanCode({ 63 | async success(res) { 64 | console.log(res) 65 | if (!res || 66 | !res.result || 67 | !res.result.includes('meet=') || 68 | res.result.length != 20) { 69 | pageHelper.showModal('错误的预约码,请重新扫码'); 70 | return; 71 | } 72 | 73 | let code = res.result.replace('meet=', ''); 74 | let params = { 75 | meetId, 76 | code 77 | }; 78 | let options = { 79 | title: '预约码核销中' 80 | } 81 | await cloudHelper.callCloudSumbit('admin/join_scan', params, options).then(res => { 82 | pageHelper.showModal('核销成功'); 83 | 84 | }).catch(err => { 85 | console.log(err); 86 | }); 87 | }, 88 | fail(err) { 89 | if (err && err.errMsg == 'scanCode:fail') 90 | pageHelper.showModal('预约码核销错误,请重新扫码'); 91 | } 92 | }); 93 | } 94 | }) -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/scan/admin_meet_scan.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-picker-time": "../../../../cmpts/public/picker_time/picker_time_cmpt" 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "enablePullDownRefresh": true, 8 | "navigationBarTitleText": "管理员扫码核销" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/scan/admin_meet_scan.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{title}} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 扫码核销 16 | 管理员扫描用户预约码进行签到核销 17 | 立即核销 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/scan/admin_meet_scan.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | .form-box .checkin { 4 | width: 100%; 5 | padding: 40rpx 40rpx 80rpx; 6 | padding-bottom: 150rpx; 7 | display: flex; 8 | flex-direction: column; 9 | justify-content: flex-start; 10 | align-items: center; 11 | } 12 | 13 | .form-box .checkin .notice { 14 | width: 100%; 15 | font-size: 46rpx; 16 | text-align: center; 17 | color: #000; 18 | margin-bottom: 30rpx; 19 | } 20 | 21 | .form-box .checkin .desc { 22 | width: 100%; 23 | font-size: 32rpx; 24 | text-align: center; 25 | color: #666; 26 | } 27 | 28 | .form-box .checkin .oprt { 29 | width: 600rpx; 30 | margin-top: 40rpx; 31 | text-align: center; 32 | font-size: 34rpx; 33 | color: var(--adminColor); 34 | border: 2rpx solid var(--adminColor); 35 | padding: 30rpx 20rpx; 36 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/self/admin_meet_self.js: -------------------------------------------------------------------------------- 1 | const AdminBiz = require('../../../../biz/admin_biz.js'); 2 | const pageHelper = require('../../../../helper/page_helper.js'); 3 | const cloudHelper = require('../../../../helper/cloud_helper.js'); 4 | 5 | Page({ 6 | 7 | /** 8 | * 页面的初始数据 9 | */ 10 | data: { 11 | isLoad: false, 12 | qrUrl: '', 13 | }, 14 | 15 | /** 16 | * 生命周期函数--监听页面加载 17 | */ 18 | onLoad: async function (options) { 19 | if (!AdminBiz.isAdmin(this)) return; 20 | if (!pageHelper.getOptions(this, options, 'mark')); 21 | 22 | if (options && options.title) { 23 | let title = decodeURIComponent(options.title); 24 | this.setData({ 25 | title 26 | }); 27 | } 28 | 29 | await this._loadDetail(); 30 | }, 31 | 32 | _loadDetail: async function () { 33 | let timeMark = this.data.mark; 34 | 35 | let page = pageHelper.fmtURLByPID("/pages/meet/self/meet_self"); 36 | 37 | let params = { 38 | timeMark, 39 | page 40 | }; 41 | let opt = { 42 | title: 'bar' 43 | }; 44 | try { 45 | await cloudHelper.callCloudSumbit('admin/self_checkin_qr', params, opt).then(res => { 46 | this.setData({ 47 | qrUrl: res.data, 48 | isLoad: true 49 | }) 50 | }); 51 | } catch (err) { 52 | console.error(err); 53 | } 54 | 55 | }, 56 | 57 | /** 58 | * 生命周期函数--监听页面初次渲染完成 59 | */ 60 | onReady: function () { 61 | 62 | }, 63 | 64 | /** 65 | * 生命周期函数--监听页面显示 66 | */ 67 | onShow: function () { 68 | 69 | }, 70 | 71 | /** 72 | * 生命周期函数--监听页面隐藏 73 | */ 74 | onHide: function () { 75 | 76 | }, 77 | 78 | /** 79 | * 生命周期函数--监听页面卸载 80 | */ 81 | onUnload: function () { 82 | 83 | }, 84 | 85 | /** 86 | * 页面相关事件处理函数--监听用户下拉动作 87 | */ 88 | onPullDownRefresh: async function () { 89 | await this._loadDetail(); 90 | wx.stopPullDownRefresh(); 91 | }, 92 | 93 | url: function (e) { 94 | pageHelper.url(e, this); 95 | } 96 | 97 | }) -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/self/admin_meet_self.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "enablePullDownRefresh": true, 8 | "navigationBarTitleText": "用户自助签到码" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/self/admin_meet_self.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{title}} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 用户自助核销/签到 16 | 17 | ※ 签到规则 18 | 1. 预约用户自行扫描下方小程序码完成核销/签到 19 | 2. 用户在预约当天扫码有效,不可提前核销 20 | 3. 在预约结束时间未到情况下,用户可自行扫码完成核销 21 | 4. 若结束时间已到,需要管理员进行人工扫码核销或者在后台核销 22 | 23 | 长按图片保存小程序码 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/self/admin_meet_self.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | 3 | .form-box .checkin { 4 | width: 100%; 5 | padding: 40rpx 40rpx 80rpx; 6 | padding-bottom: 150rpx; 7 | display: flex; 8 | flex-direction: column; 9 | justify-content: flex-start; 10 | align-items: center; 11 | } 12 | 13 | .form-box .checkin .notice { 14 | width: 100%; 15 | font-size: 46rpx; 16 | text-align: center; 17 | color: #000; 18 | margin-bottom: 30rpx; 19 | } 20 | 21 | .form-box .checkin .desc { 22 | width: 100%; 23 | font-size: 28rpx; 24 | text-align: left; 25 | color: #666; 26 | display: flex; 27 | flex-direction: column; 28 | align-items: flex-start; 29 | justify-content: flex-start; 30 | } 31 | 32 | .form-box .checkin image { 33 | width: 500rpx; 34 | height: 500rpx; 35 | margin: 30rpx 0rpx; 36 | } 37 | 38 | .form-box .checkin .oprt { 39 | margin-top: 0rpx; 40 | text-align: center; 41 | font-size: 30rpx; 42 | color: var(--adminColor); 43 | padding: 20rpx 10rpx; 44 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/temp/admin_temp_select.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | 4 | }, 5 | "navigationBarBackgroundColor": "#2499f2", 6 | "navigationBarTextStyle": "white", 7 | "enablePullDownRefresh": true, 8 | "navigationBarTitleText": "时间模板选择" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/temp/admin_temp_select.wxss: -------------------------------------------------------------------------------- 1 | @import '../../../../style/project/base/admin.wxss'; 2 | @import "../../../../style/project/base/article_list.wxss"; 3 | 4 | .load.notexist::after { 5 | content: "您还没有可选用的模板哦"; 6 | } 7 | 8 | .text-pic-list-box .item { 9 | padding: 18rpx 30rpx; 10 | position: relative; 11 | } 12 | 13 | .item .time-list { 14 | width: 100%; 15 | display: flex; 16 | align-items: flex-start; 17 | justify-content: flex-start; 18 | flex-wrap: wrap; 19 | margin-top: 20rpx; 20 | } 21 | 22 | .item .time-list .time-item { 23 | width: 33.33%; 24 | padding: 10rpx; 25 | } 26 | 27 | .item .time-list .time-item .detail { 28 | width: 100%; 29 | border: 1rpx solid #ccc; 30 | border-radius: 1rpx; 31 | display: flex; 32 | flex-direction: column; 33 | justify-content: center; 34 | align-items: center; 35 | padding: 13rpx 0; 36 | height: 130rpx; 37 | } 38 | 39 | .item .time-list .time-item .detail>text { 40 | font-size: 30rpx; 41 | color: #555; 42 | width: 100%; 43 | text-align: center; 44 | } 45 | 46 | .item .time-list .time-item .detail .up { 47 | font-size: 29rpx; 48 | } 49 | 50 | .item .detail.select { 51 | font-size: 35rpx; 52 | background-color: #f8f8f8; 53 | color:#777; 54 | } 55 | 56 | .item .title { 57 | width: 100%; 58 | display: flex; 59 | align-items: center; 60 | justify-content: space-between; 61 | position: relative; 62 | color:#333!important; 63 | margin-left:15rpx; 64 | } 65 | 66 | .item .title .temp-name { 67 | flex: 1; 68 | } 69 | 70 | .item .title .more{ 71 | color:#777; 72 | width:60rpx; 73 | text-align: right; 74 | font-size:40rpx; 75 | font-weight: normal; 76 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/meet/time/admin_meet_time.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | "cmpt-picker-multi": "../../../../cmpts/public/picker_multi/picker_multi_cmpt", 4 | "cmpt-calendar": "../../../../cmpts/public/calendar/calendar_meet/calendar_meet_cmpt" 5 | }, 6 | "navigationBarBackgroundColor": "#2499f2", 7 | "navigationBarTextStyle": "white", 8 | "navigationBarTitleText": "时间设置" 9 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/mgr/log/admin_log_list.js: -------------------------------------------------------------------------------- 1 | const AdminBiz = require('../../../../biz/admin_biz.js'); 2 | const pageHelper = require('../../../../helper/page_helper.js'); 3 | 4 | Page({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | isSuperAdmin: false, 11 | }, 12 | 13 | /** 14 | * 生命周期函数--监听页面加载 15 | */ 16 | onLoad: function (options) { 17 | if (!AdminBiz.isAdmin(this)) return; 18 | 19 | //设置搜索菜单 20 | this.setData(this._getSearchMenu()); 21 | 22 | this.setData({ 23 | isSuperAdmin: AdminBiz.isSuperAdmin(), 24 | }); 25 | }, 26 | 27 | /** 28 | * 生命周期函数--监听页面初次渲染完成 29 | */ 30 | onReady: function () { 31 | 32 | }, 33 | 34 | /** 35 | * 生命周期函数--监听页面显示 36 | */ 37 | onShow: async function () {}, 38 | 39 | /** 40 | * 生命周期函数--监听页面隐藏 41 | */ 42 | onHide: function () { 43 | 44 | }, 45 | 46 | /** 47 | * 生命周期函数--监听页面卸载 48 | */ 49 | onUnload: function () { 50 | 51 | }, 52 | 53 | url: async function (e) { 54 | pageHelper.url(e, this); 55 | }, 56 | 57 | bindCommListCmpt: function (e) { 58 | pageHelper.commListListener(this, e); 59 | }, 60 | 61 | 62 | _getSearchMenu: function () { 63 | 64 | let sortItems = []; 65 | let sortMenus = [{ 66 | label: '全部', 67 | type: '', 68 | value: '' 69 | }, { 70 | label: '系统', 71 | type: 'type', 72 | value: 99 73 | }, 74 | { 75 | label: '用户', 76 | type: 'type', 77 | value: 0 78 | }, 79 | { 80 | label: '内容/文章', 81 | type: 'type', 82 | value: 2 83 | }, 84 | { 85 | label: '预约/活动', 86 | type: 'type', 87 | value: 1 88 | } 89 | ] 90 | 91 | return { 92 | sortItems, 93 | sortMenus 94 | } 95 | 96 | } 97 | 98 | }) -------------------------------------------------------------------------------- /miniprogram/pages/admin/mgr/log/admin_log_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": { 3 | }, 4 | "navigationBarBackgroundColor": "#2499f2", 5 | "navigationBarTextStyle": "white", 6 | "disableScroll": true, 7 | "navigationBarTitleText": "后台-操作日志" 8 | } -------------------------------------------------------------------------------- /miniprogram/pages/admin/mgr/log/admin_log_list.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 共有{{dataList.total}}条符合条件记录 7 | 8 | 9 | 10 | {{item.LOG_TYPE_DESC}}操作 11 | 12 | 13 | 14 | 15 | 操作人 16 | 17 | {{item.LOG_ADMIN_NAME}} 18 | 19 | 20 | 操作时间 21 | 22 | {{item.LOG_ADD_TIME}} 23 | 24 | 25 | 操作内容 26 | 27 | {{item.LOG_CONTENT}} 28 | 29 | 30 | IP地址 31 | 32 | {{item.LOG_ADD_IP}} 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |